首页 > 编程知识 正文

python中的pass语句,python中global的意思

时间:2023-05-06 05:28:17 阅读:111238 作者:3763

在读别人的python源代码时遇到这个yield这个关键词,经过各种搜索终于明白了。 现总结如下:

在普通的for…in…循环中,in的后面有数组。 这个数组是可重复的对象。 同样也有链表、字符串和文件。 可以是我的列表

=[ 1,2,3 ],mylist=[x*x for x in range(3() ]也可以。 其缺点是所有的数据都存在于内存中,如果有大量的数据,就会非常消耗内存。

生成器可以重复,但只能读取一次。 因为使用的时候才会生成。 例如mygenerator=(x*xforxin

请注意range(3) (在此处) )。 不是数组。 上例为[ ]。

我理解的生成器(generator )可以重复的关键是有next )方法。 其工作原理是重复调用next ) )方法,直到捕获到异常。 可以在上面的mygenerator中测试。

具有yield的函数不再是普通函数,而是生成器,可以用于迭代。 结构是一样的。

yield就像return

的关键字。 遇到yield时,会返回yield之后的值。 其重点是在下一次迭代时,从上一次迭代中遇到的yield之后的代码开始执行。

简单理解: yield是指return返回值,并记住返回的位置。 下一次迭代从这个位置之后开始。

具有yield的函数不仅可用于for循环,还可用于函数参数,只要函数参数允许迭代参数即可。 例如,array.extend函数的原型是array.extend(iterable )。

send(msg )和next ) )之间的差异在于,send可以将参数传递给yield表达式,传递的参数是yield表达式的值,而yield参数是返回给调用方的值。 ——换句话说,send可以强制修改最后一个yield表达式的值。 例如函数有yield赋值,a

=yield 5,最初的迭代到这里就返回5,a还没有赋值。 在第二次迭代中,使用. send(10 )。 然后,将yield 5表达式的值强制修改为10,如果原本为5,则a=10

send(msg )和next )返回值是当前迭代遇到yield时yield之后的表达式的值。 实际上,这是当前迭代的yield之后的参数。

在第一个调用中,next (或send ) None )必须先。 否则会报告错误。 send之后变成None是因为此时没有之前的yield ()根据第8条)。 可以认为next (是send ) none )等同。

yield简单地说就是生成器。 生成器是一个函数,用于记住上次返回时在函数主体中的位置。 对生成器函数的第二次或第n次调用将跳转到函数的中间,并且最后调用的所有局部变量保持不变。

生成器是一个函数,

函数的所有参数都将被保留。

第二次调用此函数时,

的参数上次被预约了。

生成器还“记住”流控制的结构。

生成器不仅“记得”该数据的状态。 生成器还“记住”流控制结构(在基于指令的程序设计中,此结构不仅仅是数据值) )中的位置。 由于连续性允许在执行帧之间自由跳转,而不是像生成器那样直接返回调用上下文,因此很常见。

yield生成器的工作原理

当殷勤的杯子向生成器询问数量时,生成器会一直运行到出现yield语句为止。 生成器传递yield的参数。 然后,生成器不再继续执行。 当殷勤的杯子问他下一个数量时,他会从上次状态开始执行,直到出现yield语句,传递参数,然后停止。 重复直到函数结束。

示例: Python数组,复合生成器

生成全部排列defperm(items,n=None ) :

ifnisNone:

n=len (项目)

foriinrange(Len )项目) :

v=items[i:i 1]

ifn==1:

yieldv

else:

rest=items [ : I ] items [ I 1: ]

forpinperm(rest,n-1 ) :

yieldv p

生成组合def comb (项目,n=None ) :

ifnisNone:

n=len (项目)

foriinrange(Len )项目) :

v=items[i:i 1]

ifn==1:

yieldv

else:

rest=items[i 1:]

forcincomb(rest,n-1 ) :

yieldv c

a=perm(ABC ) ) )。

forbina:

打印b

布莱克

打印'-' * 20

forbina:

打印b

结果为102 PV OPF 006~~/test./generator.py

哥伦比亚广播公司

-----------------

acb

bac

贝卡

cab

cba

可以看到,在第一个循环break之后,生成器不会继续运行,而是在第一个循环之后执行第二个循环。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。