python中的推导式、生成器_python生成器推导式-CSDN博客
“”“生成器应用的场景是在大数据的范围中使用, 切记不可直接用for遍历所有,可能无法短时间内获取所有数据”“”
使用 yield 来实现生成器,并使用next 进行激活
1,__next__()&next()的区别 __next__()是生成器对象的实例方法,next()是python的内置方法。他们实现的功能是一样的,只能对可迭代的对象使用。 2,next()和send()用以唤醒生成器 当生成器函数中执行yield时,程序会卡在yield的地方不执行,next()和send()的作用就是唤醒卡住的程序,让他继续执行。 3,send()方法的作用 send()作为生成器对象的实例方法,可以向生成器发送数据并唤醒生成器函数。一般send()方法要写在next()方法后面,当next()和send()写在一块时,相当于唤醒两次生成器。 生成器表达式无法像列表推导式那样直接输出,它和可迭代对象一样只能采用for循环调用next()函数,原因在于range返回的是一个可迭代对象, 列表推导式之所以能直接print就是因为 []将可迭代对象转为列表。
#初始化生成器函数 => 返回生成器对象 => 简称生成器
调用该函数的时候不会立即执行代码,而是返回了一个生成器对象;
当使用 next() (在 for 循环中会自动调用 next() ) 作用于返回的生成器对象时,函数 开始执行,在遇到 yield 的时候会『暂停』,并返回当前的迭代值;
当再次使用 next() 的时候,函数会从原来『暂停』的地方继续执行,直到遇到 yield语句,如果没有 yield 语句,则抛出异常;
send的使用方式 (给上一个yield发送数据)
#next和send区别:
next 只能取值
send 不但能取值,还能发送值,发送给yield
#send注意点:
第一个 send 不能给 yield 传值 默认只能写None
最后一个yield 接受不到send的发送值
send要想成功执行,第一次必须发送None,最后一次调用,要有对应层级的yield,也就是send个数少于等于yield个数
1 def mygen(): 2 print("start") 3 4 res = yield "内部1" 5 print(res,"<==内部==>") 6 7 res = yield "内部2" 8 print(res,"<==内部==>") 9 10 res = yield "内部3" 11 print(res,"<==内部==>") 12 13 print("end") 14 15 # 初始化生成器函数 => 生成器 16 gen = mygen() 17 # 第一次调用生成器 18 """ 19 第一次调用生成器时,因为没有遇到yield保存的代码位置, 20 无法发送数据,默认第一次只能发送None 21 """ 22 res = gen.send(None) 23 print(res,"<==外部==>") 24 25 # 第二次调用生成器 26 res = gen.send("100") 27 print(res,"<==外部==>") 28 29 # 第三次调用生成器 30 res = gen.send("200") 31 print(res,"<==外部==>") 32 33 # 第四次调用生成器 34 """ 35 error 36 res = gen.send("300") 37 print(res,"<==外部==>") 38 """ 39 """ 40 使用send调用生成器,第一次发送时必须是None,因为还没有遇到yield保存的代码位置 41 res = gen.send(None) 走到mygen生成器函数中 42 print("start") 43 res = yield "内部1" 执行第80行 ,保存退出,记录当前代码位置,将 "内部1" 返回 44 在98行接受数据 res = "内部1" print(内部1,"<==外部==>") 45 46 第二次调用生成器 47 res = gen.send("100") 把100这个数据发送给上一次代码保存的位置80行进行接受. => 导致 80行 res = 100 48 打印81行 print(100 ,"<==内部==>") 49 执行83行 res = yield "内部2" 保存退出,记录当前代码位置,将 "内部2" 返回 50 执行102行 res = gen.send("100") => "内部2" print("内部2","<==外部==>")
依次类推 …
到第四次调用时, 因为没有更多的yield 返回数据,gen.send(300)无法接受到返回值,所以出现停止迭代 StopIteration的报错,程序终止;
yield from 的使用
“”“将一个可迭代对象变成一个迭代器返回 “””
1 def mygen(): 2 lst = ["张磊","李亚峰","刘一峰","王同培"] 3 yield from lst 4 5 #初始化生成器函数 6 gen = mygen() 7 print(next(gen)) 8 print(next(gen)) 9 print(next(gen)) 10 print(next(gen)) 11 #print(next(gen)) # StopIteration
标签:res,生成器,yield,next,语法,send,print From: https://www.cnblogs.com/liu-Gray/p/18650781