Python学习之可迭代对象、迭代器、生成器
可迭代对象
在Python中,只要是能够使用for
循环遍历的对象都称之为可迭代对象。可以使用collections.abc.Iterable
来判断一个对象是否是可迭代对象。
import collections.abc
isinstance([], collections.abc.Iterable) # True
isinstance({}, collections.abc.Iterable) # True
isinstance(set(), collections.abc.Iterable) # True
isinstance(range(0, 10), collections.abc.Iterable) # True
isinstance((x for x in range(0, 10)), collections.abc.Iterable) # True
以上代码创建了list、dict、set、range、生成器这些常见的可迭代对象,并使用isinstance
函数判断它们是否是可迭代对象,输出结果都为True。
迭代器
迭代器是一种可以用于遍历序列或其他类似集合的对象。迭代器允许您按需生成项或元素,而不是一次性生成它们。迭代器通常实现两个方法:__iter__
和__next__
。
__iter__
: 返回迭代器本身,以支持链式调用。__next__
: 返回集合中的下一个元素。如果没有更多的元素,则引发StopIteration
异常。
迭代器可以使用next()
函数逐个获取元素:
lst = [1, 2, 3]
it = iter(lst) # 获得迭代器对象
print(next(it)) # 输出 1
print(next(it)) # 输出 2
print(next(it)) # 输出 3
# 反复调用 next() 将引发 StopIteration 异常
以上代码创建了一个list,使用iter
函数获得迭代器对象,使用next
函数逐个获取元素并输出。
生成器
生成器是一种特殊的迭代器,它允许您使用函数语法来编写迭代器。通过简单地定义函数并在其中使用yield
语句,我们可以轻松地创建生成器。yield
语句定义了一个生成器,该生成器保存其状态以便稍后恢复。
下面是一个求斐波那契数列的生成器实现:
def fibonacci(n):
a, b = 0, 1
while a < n:
yield a
a, b = b, a + b
# 生成斐波那契数列
for i in fibonacci(10):
print(i) # 分别输出 0, 1, 1, 2, 3, 5, 8
以上代码定义了一个名为fibonacci
的函数,并使用yield
语句实现生成器的功能。在for
循环中使用这个生成器可以输出斐波那契数列。
示例1:生成器简化读写文件操作
使用生成器函数可以轻松地将文件内容逐行读入生成器:
def read_file(file_path):
with open(file_path) as f:
for line in f:
yield line.strip()
for line in read_file('example.txt'):
print(line)
以上代码使用open()
函数打开example.txt
文件并逐行读取文件内容,使用yield
语句将每行文件内容封装成一个生成器,通过for
循环遍历生成器可以逐行输出文件内容。
示例2:计算斐波那契数列中小于 100 的偶数
使用生成器函数可以轻松地生成斐波那契数列中小于 100 的偶数:
def fibonacci(n):
a, b = 0, 1
while a < n:
if a % 2 == 0:
yield a
a, b = b, a + b
for i in fibonacci(100):
print(i)
以上代码使用if
语句过滤生成器中的元素,输出小于 100 的斐波那契数列中的偶数。