python学习之可迭代对象、迭代器、生成器

  • Post category:Python

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 的斐波那契数列中的偶数。