Python迭代器教程展示了如何在Python中使用迭代器。
迭代器
Iteration是循环遍历集合中的项目的过程。Iterable是一个可以迭代的对象。Iterator是一个允许遍历集合的所有元素的对象,无论其具体实现如何。它从关联的可迭代对象中生成连续的值。
在Python中,迭代器是实现迭代器协议的对象。迭代器协议由两种方法组成。__iter__
方法必须返回迭代器对象,next
方法返回序列中的下一个元素。iter
内置函数用于从可迭代对象中获取迭代器。
如果迭代器的所有值都已返回,则next
函数的后续调用会引发StopIteration
异常。
迭代器有几个优点:
- 更简洁的代码
- 能够处理无限序列
- 节省资源
Python有几个内置对象,它们实现了迭代器协议。例如列表、元组、字符串、字典或文件。
Python迭代器简单例子
以下简单示例使用字符串对象中的迭代器。
#!/usr/bin/python text = "falcon" it = iter(text) print(next(it)) print(next(it)) print(next(it)) print(next(it)) print(next(it)) print(next(it))
在代码示例中,我们对字符串使用内置迭代器。在Python中,字符串是不可变的字符序列。
it = iter(text)
iter
函数返回对象的迭代器。
print(next(it))
next
函数返回可迭代对象的下一个元素。
$ ./simple_it.py f a l c o n
Python迭代器和for循环
for循环是在Python中使用迭代器的常用方法。for循环执行以下操作:
- 调用
iter
获取迭代器 - 重复调用
next
获取iterable的下一项 - 当
next
引发StopIteration
时终止循环
for e in vals: print(e)
循环体对next
返回的每个项目执行一次。变量e
设置为每次迭代的给定项目。
#!/usr/bin/python text = "an old falcon" for val in text: print(val, end=" ") print()
在示例中,我们使用for循环遍历文本。我们打印每个字符并在它们之间放置一个空格。
$ ./for_loop.py a n o l d f a l c o n
列表、元组和集合内置函数
当我们在可迭代对象上使用list
、tuple
和set
内置函数时,我们强制迭代器返回所有项.请注意,一些可迭代对象可能非常大。
#!/usr/bin/python text = "an old falcon" data = list(text) print(data) data2 = tuple(text) print(data2) data3 = set(text) print(data3)
在示例中,我们使用list
、tuple
和set
内置函数生成一个列表、一个元组和一组来自给定文本的字符。
$ ./list_tuple_set.py ['a', 'n', ' ', 'o', 'l', 'd', ' ', 'f', 'a', 'l', 'c', 'o', 'n'] ('a', 'n', ' ', 'o', 'l', 'd', ' ', 'f', 'a', 'l', 'c', 'o', 'n') {'f', 'd', 'n', 'o', 'a', ' ', 'c', 'l'}
Python迭代器读取行
当我们使用迭代器从文件中读取数据时,我们可以在不将整个文件读入内存的情况下获取下一行。这样我们就节省了系统资源。
blue sky cloud winter blow water falcon
这是words.txt
文件。
#!/usr/bin/python with open('words.txt', 'r') as f: for line in f: print(line.rstrip())
open
函数返回一个文件对象,它是一个迭代器。我们可以在for循环中使用它。使用迭代器,代码更清晰。
$ ./read_data_iterator.py blue sky cloud winter blow water falcon
Python自定义迭代器
要创建自定义迭代器,它必须实现迭代器协议:__iter__
和__next__
函数。
#!/usr/bin/python class InfSeq: def __init__(self): self.x = 0 def __next__(self): self.x += 1 return self.x ** self.x def __iter__(self): return self infseq = InfSeq() n = 0 for e in infseq: print(e) n += 1 if n > 10: break
在代码示例中,我们创建了一个数字序列1、4、27、256,…。这表明我们可以使用迭代器处理无限序列。
def __iter__(self): return self
for语句调用容器对象上的__iter__
函数。该函数返回一个定义方法__next__
的迭代器对象,该方法一次访问一个元素。
def next(self): self.x += 1 return self.x ** self.x
next
函数返回序列的下一个元素。
if n > 10: break
因为我们正在处理无限序列,所以我们必须在某个时刻中断for循环。
$ ./inf_seq.py 1 4 27 256 3125 46656 823543 16777216 387420489 10000000000 285311670611
停止迭代
通过引发StopIteration
异常终止迭代过程。
#!/usr/bin/python import random class RandomWord: def __init__(self): self.words = ['sky', 'blue', 'cloud', 'milk', 'cosmos', 'rainbow', 'drop', 'new', 'stop'] def __iter__(self): return self def __next__(self): random_word = random.choice(self.words) if random_word == 'stop': raise StopIteration else: return random_word rw = RandomWord() for word in rw: print(word)
在代码示例中,我们有一个生成随机单词的自定义迭代器。我们在选择停用词时引发StopIteration
异常。
$ ./random_words.py sky blue new drop milk drop milk drop blue
这是一个示例输出。
在本教程中,我们使用了Python中的迭代器。
列出所有Python教程。