开篇介绍
任何普通函数如果结合了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错误。
在for循环中会自动调用 next()
for x in g:
print(x)
案例一:一个数字列表中哪些是素数。
'''
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)
案例二:杨辉三角(极简短实现代码,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!')
知识点:
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)