由于执行了g.throw(ValueError),所以会跳过所有后续的try语句,也就是说yield ‘normal value 2’不会被执行,然后进入到except语句,打印出we got ValueError here 。然后再次进入到while语句部分 , 消耗一个yield,所以会输出normal value 。
print(next(g)),会执行yield ‘normal value 2’语句,并停留在执行完该语句后的位置 。
g.throw(TypeError):会跳出try语句,从而print(‘here’)不会被执行,然后执行break语句,跳出while循环 , 然后到达程序结尾,所以跑出StopIteration异常 。
下面给出一个综合例子,用来把一个多维列表展开,或者说扁平化多维列表)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def flatten(nested):
try:
#如果是字符串,那么手动抛出TypeError 。
if isinstance(nested, str):
raise TypeError
for sublist in nested:
#yield flatten(sublist)
for element in flatten(sublist):
#yield element
print('got:', element)
except TypeError:
#print('here')
yield nested
L=['aaadf',[1,2,3],2,4,[5,[6,[8,[9]],'ddf'],7]]
for num in flatten(L):
print(num)
如果理解起来有点困难,那么把print语句的注释打开在进行查看就比较明了了 。
总结
按照鸭子模型理论,生成器就是一种迭代器,可以使用for进行迭代 。
第一次执行next(generator)时,会执行完yield语句后程序进行挂起,所有的参数和状态会进行保存 。再一次执行next(generator)时,会从挂起的状态开始往后执行 。在遇到程序的结尾或者遇到StopIteration时,循环结束 。
可以通过generator.send(arg)来传入参数,这是协程模型 。
可以通过generator.throw(exception)来传入一个异常 。throw语句会消耗掉一个yield 。可以通过generator.close()来手动关闭生成器 。
next()等价于send(None)
python杨辉三角形原理triangles里用到了yield,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 triangles(5) 不会执行 triangles函数 , 而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码 , 执行到 yield L 时 , triangles函数就返回一个迭代值,下次迭代时,代码从 yield L 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行 , 直到再次遇到 yield 。
1 那个2去哪了
你看else语句 L1 = [1,1]每次L都是基于这个L1生成的 比如L=[1,2,1] 那么下一个L1就是[1,3,3,1],下一句L = L1 所以每次都是新的L1生成
2 画红圈的地方应该是和L1.insert(i,L[i-1+i])意思一样
不一样,插入的值是两个数的和
def triangles(max):
L = [1]
n = 0
while(nmax):
n = n+1
if(n == 2):
L=[1,1]
yield L
else:
i = 1
L1 = [1,1]
while(i=n-2):
L1.insert(i,L[i-1]+L[i])
i=i+1
L = L1
yield L
for n in triangles(5):
print n
关于fab函数Python和python fact函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- 直播弹窗剪辑素材,直播弹窗是什么意思
- 楼上发廊如何营销的简单介绍
- 抖音直播有什么诀窍嘛,抖音直播有什么诀窍嘛知乎
- 重生下载,警笛头重生下载
- vb.net程序如何保存 vbnet keydown
- 如何面对实体店电商的挑战,实体店如何面对电商冲击
- 模拟游戏机价格,模拟游戏机价格表
- 区块链成熟需要多久了,区块链成熟了吗
- 哪些是linux内核命令 linux内核称为