python进阶-迭代器和生成器

python小知识2026年6月7日1

python进阶-迭代器和生成器

实验背景

迭代器是一种数据遍历的方式,是许多编程语言的一个重要功能; python中也有, 而生成器应该是python独有的特性。

我们开始认识一下这两个功能特性吧

实验内容

什么是迭代器

python中的迭代器是访问集合的一种方式,每次访问记住遍历的位置。

  • 迭代器通过 iter()将一个可迭代对象变成迭代器,例如list tuple dict set str等,还有就是后面讲到的生成器(generator) 都是可迭代对象
  • 通过next()或者for循环访问迭代的数据

我们来看下例子

from  collections import Iterable, Iterator
# del iter
a = [1, 2, 4, 6, 8, 6, 10]
print(isinstance(a, Iterable))
print(type(a))

it = iter(a)
print(next(b))
# True
# <class 'list'>
# 8

使用迭代器

for i in it:
    print(i)

while True:
    try:
        print(next(it))
    except StopIteration:
        break

自定义一个迭代器: 通过实现__iter__和__next__来实现迭代器的功能; 其实python很多的对象都实现的迭代器的功能, 都可以通过for循环的方式来访问,比如文件访问。

with open('./test', 'rb') as f:
   for line in f:
      print(line) # 读取文件的每一行较其他语言是相当的方便的
class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self
 
    def __next__(self):
        x = self.a
        self.a += 1
        return x

myclass = MyNumbers()
myiter = iter(myclass)
next(myiter)

tensorflow中的迭代器

tf.data也是通过迭代器的方式来生成数据的,如下

train_dataset = tf.data.Dataset.from_tensor_slices(train)
iterator = tf.data.Iterator.from_structure(train_dataset.output_types, train_dataset.output_shapes)
img, label = iterator.get_next()

什么是生成器

上面说过生成器的结果是产生一个可以迭代的对象,可以通过for循环来访问。

那它和其他的可迭代对象有什么不同呢?

生成器的特性:

  • 它是一个延迟的可迭代对象,也就是说它不是一次性生成所有的迭代的内容(如列表中的所有元素),而是需要的时候才生成结果即:一边循环一边生成计算
  • 好处是:不用一次性存储所有的内容,节省内存。这个对于访问大量数据的时候是十分有帮助的

我们来看看上面的这些特性

(1)通过yield来构造一个生成器

def normal_iter():
    ret = []
    for i in range(10):
        ret.append(i**2)
    return ret
def generator():
    for i in range(10):
        yield i**2
# normal_iter 存储所有的结果
# generator 通过yield返回一个生成器,调用的时候才返回生成的对象
for i in normal_iter():
    print(i)
for i in generator():
    print(i)

# 另外可以通过()构建一个生成器
L = [x * x for x in range(10)]
g = (x * x for x in range(10))
print(L)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(g)
# <generator object <genexpr> at 0x7ff566b8cf10>

实验结语

本实验和大家简单描述了python迭代器和生成器的使用,希望对大家有帮助。