Python中级基础系列3.6(六)之——生成器yield实现可迭代对象的魅力

浏览: 1696

开篇介绍

          任何普通函数如果结合了yield关键字,就变成了生成器函数(generator)。生成器函数调用 next() 才开始执行。每执行到一个 yield 语句就会中断,并返回一个迭代值来记录当前状态,下次执行时、从 yield记录状态 的下一个语句继续执行。

 def f():
print ('鲁班,1')
yield 1

print ('后羿,2')
yield 2

print ('李元芳,3')
yield 3
g = f()
print(g.__next__())
print(g.__next__())
print(g.__next__())
# print(g.__next__()) 多一个next()会报StopIteration错误。

Clipboard Image.png

在for循环中会自动调用 next()

for x in g:     
print(x)

Clipboard Image.png


案例一:一个数字列表中哪些是素数。

'''
class primenumbers:
def __init__(self, start, end):
self.start = start
self.end = end

def isprimenumbers(self, k):
for i in range(2, k):
if k % i == 0:
return False
return True

def __iter__(self):
for k in range(self.start, self.end+1):
if self.isprimenumbers(k):
yield k
for x in primenumbers(1, 10):
print(x)

Clipboard Image.png

案例二:杨辉三角(极简短实现代码,Python魅力之一)

# 期待输出:
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

def triangles():
L = [1,]
while True:
yield L
L = [0,*L,0] #两端构造0进行运算
L = [a+L[i+1] for i,a in enumerate(L[:-1])]
n = 0
results = []
for t in triangles(): # 可迭代
print(t)
results.append(t)
n = n + 1
if n == 10:
break
if results == [
[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
[1, 4, 6, 4, 1],
[1, 5, 10, 10, 5, 1],
[1, 6, 15, 20, 15, 6, 1],
[1, 7, 21, 35, 35, 21, 7, 1],
[1, 8, 28, 56, 70, 56, 28, 8, 1],
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
print('Pass!')
else:
print('failure!')

Clipboard Image.png

知识点:

enumerate():用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

enumerate(sequence, [start=0])

参数

  • sequence -- 一个序列、迭代器或其他支持迭代对象。
  • start -- 下标起始位置,默认从0开始。

返回值

返回 enumerate(枚举) 对象。

>>>seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
... print i, seq[i]
...
0 one
1 two
2 three
>>>

*L含义:将列表L里的元素作为的参数传入。

def add(a, b):
return a+b

data = [4,3]
print add(*data)
#equals to print add(4, 3)

#两个星号'**'将字典解开成独立的元素作为形参
data = {'a' : 4, 'b' : 3}
print add(**data)
#equals to print add(4, 3)


推荐 2
本文由 粽子job 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册