python基础之生成器
生成器:本质是迭代器, 写法和迭代器不一样. 用法和迭代器一样
生成器函数: 函数中带有yield, 执行生成器函数的时候返回生成器。而不是执行这个函数。
def func(): print("你好啊, 我叫赛利亚,") yield "西岚的武士刀" # return 和yield都可以返回数据 ret = func() # generator ret是一个生成器 print(ret) s = ret.__next__() # 当执行到__next__()的时候, 函数才真正的开始执行 print("接受到的是", s)
特点: 1. 节省内存, 几乎不占用内存 2. 惰性机制 3. 只能往前走
send() 也可以实现类似__next__()的效果, send()可以给上一个yield传值,但send()不能在第一个yield使用,因为没有前一个yield可以让它传值。
def func(): print("韭菜盒子") a = yield "哇哈哈" print("肉包子", a) b = yield "脉动" print("锅包肉", b) yield "冰红茶" gen = func() # ret = gen.send("胡辣汤") ret = gen.__next__() print(ret) ret = gen.send("刘伟") # 给上一个yield传值 print(ret) ret = gen.send("刘德华") # 给上一个yield传值 print(ret)
会报错,因为send()不能用在开头,解决:改用'__next__()'
send()可以给上一个yield传值, 不能给最后一个yield传值
生成器可以直接使用for循环
def fun(): yield '花花' yield '草草' yield '青青' yield '绿绿' gen = fun() #创建一个生成器 for el in gen: print(el)
>>:
花花
草草
青青
绿绿
列表、字典、集合推导式(元组没有)
# 列表推导式 : [结果 for循环 if筛选] lst = ["python%s" % i for i in range(1, 17)] print(lst)
<==> 节省代码 lst = [] for i in range(1,17): lst.append('python%s',%i) print(lst)
# 字典推导式, {key: value for循环 if 筛选} dic = {"张无忌":"九阳神功", "乔峰":"降龙十八掌", "楚留香":"帅"} d = {dic[k]: k for k in dic} print(d)
功能:将key和value的值对换过来
#集合推导式 无序不重复 可哈希 #{key for if} lst = ["周杰伦","周伯通","周润发","周伯通","周笔畅","周伯通","周星驰","周伯通"] s = {el for el in lst} print(s)
==> {'周笔畅', '周星驰', '周杰伦', '周伯通', '周润发'}
生成器表达式:(结果 for if)
用法:使用生成器表达式直接创建生成器
gen = (i for i in range(10))
生成器表达式: 记录一下代码。 然后每次需要的时候去生成器中执行一次这个代码。
生成器记录的是代码,并不执行代码。