python的英文发音,python发音的英文名字
带有 yield 的函数在 Python 中被称之为 generator(生成器)
Fab (max): n n,a,b=0,0,1 while max: yield b # yield # printba,b=b,an=n1 for infab(5):打印产量
调用fab(5)并不执行fab函数,而是返回一个iterable对象。
当执行for循环时,每个循环将执行fab函数内部的代码。当执行以产生b时,fab函数将返回迭代值。在下一次迭代中,代码将从Yield B的以下语句继续执行。
另一方面,函数的局部变量看起来和上次中断执行前完全一样。因此,函数会继续执行,直到再次遇到yield。
您也可以手动调用fab(第五个中的下一个)方法。这是因为fab) (next)是一个带有方法的生成器对象。这样fab的执行流程会更清晰。
F=fab(5) f.next)、1 f.next)、1 f.next)、2 f.next)、3 f.next)、5 f.next)、traceback),循环的mostrecentcallllllet不需要处理StopIteration异常,循环正常结束。
结论:
带yield的函数是一个生成器。与普通函数不同,生成器看起来像一个函数调用,但在调用(next())之前不会执行函数代码。for循环中的Automatically next)))))在被调用后执行。执行过程遵循函数的过程,但每次执行yield语句时,都会中断并返回迭代值,然后在下一次执行中从yield的下一条语句继续。在正常运行期间,该功能似乎被yield中断了几次。Yield将在每次中断时返回当前迭代值。
良品率优势明显。将函数改写成生成器,可以获得迭代能力。与将状态保存在类的一个实例中,然后计算下一个的值相比),代码简洁,执行过程异常清晰。
如何判断一个函数是不是特殊的生成函数?Isgeneratorfunction可用于确定以下内容:
请注意区分frominspecimportsgenerator FunctionalisGenerator Function(fab)true fab和fab )5)。Fab是生成函数,fab )5)是
Importtypesisinstance(fab,types。GeneratorType) fab )5),类型。GeneratorType)真实fab不能重复。
FromcollectionImportIterability(fab,Iterable) false isinstance (fab)),iterable) true每次调用fab函数时,都会出现一个新的generatiner。
f1=fab(3) f2=fab(5)5) print f1:,f1.next ) ) f1: 1 print f2:,F2 . next)f 233601 print f 1360 F2 . next)F2:f1 . next(f1:1 print)F2:)、f2.next ) (f2:1print ) f1:)、f1.next ) f1:2print
在生成器函数中,如果没有返回,将默认执行该函数,直到函数完成。如果在执行过程中出现返回,将直接抛出StopIteration以终止迭代。
另一个例子
yield的另一个例子来自文件读取。直接在file对象上调用read()方法会导致不可预知的内存消耗。一个好的方法是使用固定长度的缓冲区不断地读取文件的内容。使用yield,不需要创建迭代类来读取文件,这使得读取文件变得很容易。
defread _ file(Fpath):block _ size=1024 with open)Fpath, Rb )ASF:while true:block=f . read)block
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。