1. 生成器
本质就是迭代器. 一个一个的创建对象 创建生成器的方式: 1. 生成器函数 2. 通过生成器表达式来获取生成器 3. 类型转换(看不到) 2. 生成器函数 (重点) 生成器函数中包含 yield , 返回数据和return差不多. return会立即结束这个函数的执行 yield 可以分段的执行一个函数生成器函数在执行的时候返回生成器. 而不是直接执行此函数
能向下执行的两个条件:
__next__(), 执行到下一个yield send(), 执行到下一个yield, 给上一个yield位置传值def fun(): print("卢本伟,white,55开") a = yield "卢本伟牛逼" print(a) yield "克里斯,关下门" b = yield "克里斯关下门" print(b) c = yield "UU一血PDD拿" print(c) yield "卢本伟用纸一卷一卷"ret = fun()print(ret.__next__())print(ret.send("小凯凯"))print(ret.__next__())print(ret.send("小开开"))print(ret.send("小柚柚"))
所有的生成器都是迭代器都可以直接使用for循环
都可以使用list()函数来获取到生成器内所有的数据生成器中记录的是代码而不是函数的运行
def func(): print("卢本伟牛逼 ")yield "表面兄弟"
gen = func() # 创建生成器. 此时运行会把生成器函数中的代码记录在内存
当执行到__next__(), 运行此空间中的代码, 运行到yield结束.优点: 节省内存, 生成器本身就是代码. 几乎不占用内存
特点: 惰性机制, 只能向前. 不能反复3. 各种推导式 (诡异)
列表推导式 [结果 for循环 if] 字典推导式 {结果(k:v) for循环 if} 集合推导式 {结果(k) for循环 if}
lis=[]for i in range(1,5): lis.append("伞兵%s号准备就绪"%i)print(lis)lis2 = ["伞兵%s号卢本伟准备就绪"%(i+1) for i in range(4) if i==0]print(lis2)
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]name = [el for i in names for el in i if el.count("e")==2]print(name)
dic = {"white": "卢本伟", "UU": "赵梦玥", "KOBE":"科比"}dic1 = { v:k for k,v in dic.items()}print(dic1)
4. 生成器表达式 (重点)
(结果 for循环 if)g = (i for i in range(10)) # 生成器表达式