什么是迭代器?
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
1. 迭代对象
Python中使用迭代器的地方很多,大多数的容器对象都是可迭代对象,如列表、元组、字典、字符串等,均可以使用for
语句进行迭代循环,如
for element in [1,2,3]:
print(element)
for element in ('a','b','c'):
print(element)
for key in {'one':1,'two':2}:
print(key)
for char in 'abc':
print(char)
for line in open('test.txt',encoding='utf-8'):
print(line,end=' ')
这种访问风格清晰、简洁又方便。
迭代器的使用非常普遍并使得 Python 成为一个统一的整体。 在幕后,for
语句会在容器对象上调用iter()
。
该函数返回一个定义了__next__()
方法的迭代器对象,此方法将逐一访问容器中的元素。 当元素用尽时,__next__()
将引发 StopIteration
异常来通知终止for
循环。 可以使用next()
内置函数来调用 __next__()
方法。
2. 使用 next()方法
字符‘abc’
可以正常使用next()
三次,当迭代次数超过了字符串中的元素个数,就会抛出StopIteration异常
。
3. 其他迭代器示例
# 使用内置的 iter() 和 next() 函数
my_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list)
# 逐个输出列表中的元素
print(next(my_iterator)) # 输出 1
print(next(my_iterator)) # 输出 2
# 使用生成器函数创建迭代器
def square_generator(n):
for i in range(n):
yield i ** 2
squares = square_generator(5)
for square in squares:
print(square)
# 使用 enumerate() 构建迭代器获取元素和索引
my_list = ['apple', 'banana', 'orange']
for index, value in enumerate(my_list):
print(f"Index: {index}, Value: {value}")
# 使用 zip() 合并多个可迭代对象
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
for name, age in zip(names, ages):
print(f"Name: {name}, Age: {age}")
4. 自定义迭代器
4.1 自定义iter()和next()
定义一个方法 返回一个带有方法的对象。如果类 定义,然后可以返回:__next__()
、__iter__()
、self
class Reverse:
"""Iterator for looping over a sequence backwards."""
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
rev = Reverse('spam')
iter(rev)
for char in rev:
print(char)
4.2 自定义迭代器中实现斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……在数学上,这一数列以如下递推的方法定义:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。
class Fibonacci:
def __init__(self, limit):
self.limit = limit
self.a, self.b = 0, 1
def __iter__(self):
return self
def __next__(self):
if self.a <= self.limit:
result = self.a
self.a, self.b = self.b, self.a + self.b
return result
else:
raise StopIteration
fib_iter = Fibonacci(20)
for num in fib_iter:
print(num)
生成:
使用迭代器的主要优势是它们不需要在开始时就加载整个数据集到内存中。这对于大数据集或者流数据尤其有用。
迭代器是Python中一个强大而灵活的工具,可以简化遍历复杂数据结构的过程。通过理解和使用迭代器,可以编写出更高效、更优雅的Python代码。
5 参考:
迭代器官方文档 |