用python校验用户输入Ip是否合法
from IPy import IP

# 校验用户Ip
def ip_is_valid(address):
    try:
        IP(address)
        return True
    except ValueError:
        return False
python 获取上个月第一天和最后一天
# 获取上个月第一天和最后一天
def get_last_month_first_last_day(date_param: datetime):
    """
    :param date_param:  接受一个日期参数 datetime类型
    :return:  返回上个月第一天和最后一天
    """
    if not isinstance(date_param, datetime.datetime):
        raise TypeError("Please pass the <class 'datetime.datetime'>")
    m_last_day = datetime.date(date_param.year, date_param.month, 1) - datetime.timedelta(days=1)
    m_first_day = datetime.date(m_last_day.year, m_last_day.month, 1)
    return m_first_day, m_last_day
装饰器是对函数对象的一个高级应用。在编写装饰器的过程中,你会经常碰到内层函数需要修改外层函数变量的情况。就像下面这个装饰器一样:
import functools

def counter(func):
    """装饰器:记录并打印调用次数"""
    count = 0
    @functools.wraps(func)
    def decorated(*args, **kwargs):
        # 次数累加
        count += 1
        print(f"Count: {count}")
        return func(*args, **kwargs)
    return decorated

@counter
def foo():
    pass

foo()
为了统计函数调用次数,我们需要在 decorated 函数内部修改外层函数定义的 count 变量的值。但是,上面这段代码是有问题的,在执行它时解释器会报错:
Traceback (most recent call last):
  File "counter.py", line 22, in <module>
    foo()
  File "counter.py", line 11, in decorated
    count += 1
UnboundLocalError: local variable 'count' referenced before assignment
这个错误是由 counter 与 decorated 函数互相嵌套的作用域引起的。
当解释器执行到 count += 1 时,并不知道 count 是一个在外层作用域定义的变量,它把 count 当做一个局部变量,并在当前作用域内查找。最终却没有找到有关 count 变量的任何定义,然后抛出错误。
为了解决这个问题,我们需要通过 nonlocal 关键字告诉解释器:“count 变量并不属于当前的 local 作用域,去外面找找吧”,之前的错误就可以得到解决。
def decorated(*args, **kwargs):
    nonlocal count
    count += 1
itertools 是python的迭代器模块,itertools提供的工具相当高效且节省内存。 使用这些工具,你将能够创建自己定制的迭代器用于高效率的循环。 本文介绍3个无限循环迭代的迭代器 count, islice, cycle
from itertools import count, islice, cycle

"""
    count(start=0, step=1) --> count object

    Return a count object whose .__next__() method returns consecutive values.
    Equivalent to:

        def count(firstval=0, step=1):
            x = firstval
            while 1:
                yield x
                x += step
    """


# 从10 开始无限循环,每次递增2  无限循环
for x in count(10, 2):
    print(x)


"""
    islice(iterable, stop) --> islice object
    islice(iterable, start, stop[, step]) --> islice object  第几个开始 第几个结束
"""
# 从10开始, 每次递增2 到第5个数终止
for x in islice(count(10, 2), 5):
    print(x)


"""
   cycle(iterable) --> cycle object

   Return elements from the iterable until it is exhausted.
   Then repeat the sequence indefinitely.
"""
# 无限循环 xyz123中的参数
for x in cycle("xyz123"):
    print(x)
import bisect

# BREAKPOINTS 必须是已经排好序的,不然无法进行二分查找

BREAKPOINTS = (1, 60, 3600, 3600 * 24)
TMPLS = (
    # unit, template
    (1, "less than 1 second ago"),
    (1, "{units} seconds ago"),
    (60, "{units} minutes ago"),
    (3600, "{units} hours ago"),
    (3600 * 24, "{units} days ago"),
)


def from_now(ts):
    """接收一个过去的时间戳,返回距离当前时间的相对时间文字描述
    """
    seconds_delta = int(time.time() - ts)
    unit, tmpl = TMPLS[bisect.bisect(BREAKPOINTS, seconds_delta)]
    return tmpl.format(units=seconds_delta // unit)