通过列表生成式构建一个生成器
a [x * x for x in range(10)] # 列表生成式子生成一个listprint(a)# 打印# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]g (x * x for x in range(10)) # 列表生成式生成一个生成器只需将[]替换为()print(g)# 打印# generator object genexpr at 0x1022ef630编写一个简单的生成器def fib(max):n, a, b 0, 0, 1while n max:yield b # 经过迭代操作后生成一个迭代值a, b b, a bn n 1return done # 如果已无迭代值则输出donef1 fib(10)# 最后一个迭代值出来后将停止迭代跳出for语句for i in f1:print(i)# 打印:# 1 1 2 3 5 8 13 21 34 55f2 fib(10)# 如果想单个迭代可使用next函数print(next(f2))# 打印# 1print(next(f2))# 打印# 1print(next(f2))# 打印# 2# 这里因为每次fib被next调用时都会生成一个临时的生成器对象所以输出只会打印第一次的迭代值“1”。print(next(fib(10)))print(next(fib(10)))print(next(fib(10)))map/reducemapdef f(i):return i * ix [1, 2, 3, 4, 5, 6, 7, 8]# map()函数接收两个参数一个是函数一个是Iterable。map将传入的函数依次作用到序列的每个元素并把结果作为新的Iterator返回y map(f, x)# 需将Iterator转换为list才能打印出里面的元素print(list(y))# 打印# [1, 4, 9, 16, 25, 36, 49, 64]reduce# reduce包含在functools包中使用时需导入from functools import reducedef fn(x, y):return x * 10 ydef str2int(x):strDict {0: 0,1: 1,2: 2,3: 3,4: 4,5: 5,6: 6,7: 7,8: 8,9: 9,}return strDict[x]# reduce接受两个参数一个是执行函数需2个参数一个是Iterable其大概运行逻辑是将Iterable按顺序分别传入执行函数中进行操作然后将返回值执行函数的一个参数后继续与Iterable后面的元素进行操作直到Iterable没有元素可迭代为止。ans reduce(fn, map(str2int, 13579))print(ans)# 打印# 13579filterdef is_odd(n):return n % 2 1# 和map()类似filter()也接收一个函数和一个序列。不同的是filter()把传入的函数依次作用于每个元素然后根据返回值是True还是False决定保留还是丢弃该元素。filter返回值是一个Iterator不方便打印其中的元素所以将其转换为一个Iterableprint(list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])))# 打印# [1, 5, 9, 15]装饰器from functools import wraps# 一、装饰器的基本语法def log(f):# 如果需要打印真正执行操作的函数名而不是wrapper函数名则需要导入functiools里的wrapswraps(f)# 如果需要添加装饰器的函数含有参数则wrapper也需要填入参数*args, **kw。def wrapper(*args, **kw):print(call %s(): % f.__name__)return f(*args, **kw)return wrapper# 这个函数用来筛出序列中的偶数我们如果要针对这个操作插入一些测试/信息说明的话可以使用装饰器来实现。logdef func(nums: list) - list:return list(filter(lambda x: x % 2 0, nums))print(func.__name__)print(func([x for x in range(10)]))# 打印# call func():# [0, 2, 4, 6, 8]# 二、带参数的装饰器语法# 如果装饰器想要接受参数则需要额外嵌套一层函数。def log2(text):def decorator(f):wraps(f)def wrapper(*args, **kw):print(%s %s(): % (text, f.__name__))return f(*args, **kw)return wrapperreturn decoratorlog2(execute)def func(nums: list) - list:return list(filter(lambda x: x % 2 0, nums))print(func.__name__)print(func([x for x in range(10)]))# 打印# func# execute func():# [0, 2, 4, 6, 8]偏函数from functools import partial# 当函数的参数个数太多需要简化时使用functools.partial可以创建一个新的函数这个新函数可以固定住原函数的部分参数从而在调用时更简单。# 普通写法# def int2(x, base2)# return int(x, base)# 使用partialint2 partial(int, base2)print(int2(10010))# 打印# 18__slots__# python的灵活性可以使类中的属性能够随意添加为了保证代码的工整和已读可在类中添加一个__slots__变量class Student:__slots__ (name, age)s Student()s.name Sams.age 16print(s.name, s.age)# 打印# Sam 16s.university CMUprint(s.university)# 报出AttributeError异常提示Student类中没有university属性也无法设置新属性property# python中对于类的属性getter/setter方法可用property来代替可读性更高。class Student(object):propertydef birth(self):return self._birthbirth.setterdef birth(self, value):self._birth value# age属性没有设置setter所以如果对其赋值会报错propertydef age(self):return 2026 - self._birth枚举类from enum import Enum# 构建一个枚举类后可以直接使用Month.Jan......来引用一个常量也可以像字典一样遍历它们需访问__members__Month Enum(Month, (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec))for k, v in Month.__members__.items():print(k, v.value)# 打印value属性则是自动赋给成员的int常量默认从1开始计数# Jan 1# Feb 2# Mar 3# Apr 4# May 5# Jun 6# Jul 7# Aug 8# Sep 9# Oct 10# Nov 11# Dec 12print(Month.Jan)# 打印:# Month.Janprint(Month[Feb])# 打印# Month.Febprint(Month.Mar.value)