python中yield的理解与使用,python中yield语句的作用
python yield和yield from用法总结
yield 作用:
注:发电机的下一个()方法在python 2中为下一个(),但在python 3中为__下一个_ _()【下一个的前后各是两个下划线】把一个函数变成一个发电机,带有产量的函数不再是一个普通函数。即:一个带有产量的函数就是一个发电机,它和普通函数不同,生成一个发电机看起来像函数调用,但不会执行任何函数代码,直到对其调用下一个()(在为循环中会自动调用下一个())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个产量语句就会中断,并返回一个迭代值,下次执行时从产量的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被产量中断了数次,每次中断都会通过产量返回当前的迭代值。
产量的好处是显而易见的,把一个函数改写为一个发电机就获得了迭代能力,比起用类的实例保存状态来计算下一个下一个()的值,不仅代码简洁,而且执行流程异常清晰。
用print实现打印斐波拉切数列 ——基础版
#!/usr/bin/env python# -*-编码: utf-8 -*-def fab(最大):
n,a,b=0,0,1
而n max:
打印(二)
a,b=b,a b
n=n 1 if _ _ name _ _== _ _ main _ _ :
fab(6) # 1 1 2 3 5 8
用yield实现打印斐波拉切数列——升级版
#!/usr/bin/env python# -*-编码: utf-8 -*-def fab(最大):
n,a,b=0,0,1
而n max:
产量b
a,b=b,a b
n=n 1 if _ _ name _ _== _ _ main _ _ :
对于极好的中的n(6): # 1 1 2 3 5 8
打印(n)
如何判断一个函数是否是一个特殊的generator函数
#!/usr/bin/env python# -*-编码: utf-8-*-从检查导入是发电机函数
定义工厂(最大):
n,a,b=0,0,1
而n max:
产量b
a,b=b,a b
n=n 1 if _ _ name _ _== _ _ main _ _ :
f1=fab(3)
#真正的极好的是一个发电机功能
打印(isgeneratorfunction(fab))
#假工厂(3)不是一个发电机功能
# 而晶圆厂(3)是调用极好的返回的一个生成器打印(isgeneratorfunction(fab(3)))
用yield实现大文件读取
#!/usr/bin/env python# -*-编码: utf-8 -*-def读取文件(fpath):
块大小=100
使用打开(fpath, rb )作为f:
而True:
block=f.read(BLOCK_SIZE)
如果块:
屈服块else:
如果_ _ name _ _== _ _ main _ _ :则返回
fpath=/home/exercise-python 3。7 .1/投票/我的站点/我的站点/投票/测试。文本
读取文件(路径)
print(read_gen.__next__())
print(read_gen.__next__())
print(read_gen.__next__())
print(read_gen.__next__())
# for循环会自动调用发电机的__下一个_ _()方法,故输出效果同如上的四个打印[内容较短,4个打印就将测试。文本文件(textfile)中的内容输出完了】对于read_gen:中的数据
打印(数据)
yield 和 yield from 用法对比
使用yield拼接可迭代对象
#!/usr/bin/env python#-*-编码: utf-8-*-if _ _ name _ _== _ _ main _ _ :
astr=ABC
列表=[1,2,3]
adict={name: wangbm , age: 18}
#生成
阿根=(i for i in range(4,8))
def gen(*args,**kw):
对于args:中的项目
对于:项中的我
产量我
new_list=gen(astr,list,adict,阿根)
打印(列表(新列表))
# [A , B , C ,1,2,3 姓名,年龄,4,5,6,7]
使用yield from拼接可迭代对象
#!/usr/bin/env python#-*-编码: utf-8-*-if _ _ name _ _== _ _ main _ _ :
astr=ABC
列表=[1,2,3]
adict={name: wangbm , age: 18}
#生成
阿根=(i for i in range(4,8))
def gen(*args,**kw):
对于args:中的项目
项目产量
new_list=gen(astr,list,adict,阿根)
打印(列表(新列表))
# [A , B , C ,1,2,3 姓名,年龄,4,5,6,7]结论:
通过以上两种方式的对比可以看出,yield from添加了iterable对象后,可以将iterable对象中的每一个元素逐一产出。与Yields相比,代码更简洁,结构更清晰。
相关学习推荐:python视频教程
以上是python yield和yield from usage summary的详细内容。其他相关文章请多关注盛行的IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。