迭代器
大多数容器对象都可以用for遍历,如
for element in [1, 2, 3]:
print(element)
for element in (1, 2, 3):
print(element)
for key in {'one':1, 'two':2}:
print(key)
for char in "123":
print(char)
for line in open("myfile.txt"):
print(line, end='')
在后台,for语句在容器对象中调用iter(),该函数返回一个定义了__next__()方法的迭代器对象,他在容器中逐一访问元素,没有后续元素时, __next__() 抛出一个 StopIteration 异常通知 for 语句循环结束
>>> s = 'abc'
>>> it = iter(s)
>>> it
<iterator object at 0x00A1DB50>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
next(it)
StopIteration
生成器
需要返回数据的时候使用 yield 语句
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
有时简单的生成器可以用简洁的方式调用,就像不带中括号的链表推导式。这些表达式是为函数调用生成器而设计的。生成器表达式比完整的生成器定义更简洁,但是没有那么多变,而且通常比等价的链表推导式更容易记。
>>> sum(i*i for i in range(10)) # sum of squares
285
>>> xvec = [10, 20, 30]
>>> yvec = [7, 5, 3]
>>> sum(x*y for x,y in zip(xvec, yvec)) # dot product
260
>>> from math import pi, sin
>>> sine_table = {x: sin(x*pi/180) for x in range(0, 91)}
>>> unique_words = set(word for line in page for word in line.split())
>>> valedictorian = max((student.gpa, student.name) for student in graduates)
>>> data = 'golf'
>>> list(data[i] for i in range(len(data)-1, -1, -1))
['f', 'l', 'o', 'g']
文章详细解释了Python中的迭代器工作原理,通过for循环调用iter()获取定义了__next__()方法的迭代器对象,当无元素可迭代时抛出StopIteration异常。此外,文章还介绍了生成器的概念,特别是使用yield语句返回数据的机制,以及简洁的生成器表达式的应用,如求和、点积、构建字典和查找唯一词等场景。
238

被折叠的 条评论
为什么被折叠?



