16_Python的迭代器
在Python中,迭代是一个非常重要的概念。迭代通常指的是按照某种顺序逐个访问容器中的元素的行为。如使用for循环遍历取值的过程。
可迭代对象(Iterable)
可迭代对象是任何可以返回一个迭代器的对象。简单来说,它是可以逐一返回其成员项的对象。大多数内置集合类型,如list、set、dict、tuple和str都是可迭代的。即可以使用for循环遍历取值的对象。如:字符串、列表、元组、集合、字典。
- 可迭代对象一般都具有一个
__iter__
方法,用于创建迭代器
可迭代对象的特点:
- 可以使用iter()函数从可迭代对象中得到一个迭代器。
- 可以在for循环中使用,因为for循环背后使用了迭代器。
# 对列表进行for循环遍历
my_list = [1, 2, 3]
for item in my_list:
print(item)
# 对元组进行for循环遍历
t = (1, 2, 3)
for item in t:
print(item)
# 对集合进行for循环遍历
st = (1, 2, 3, 4)
for item in st:
print(item)
# 对字典进行遍历
my_dict = {'name':'Jim', 'age':12}
for i in my_dict:
print(i)
迭代器(Iterator)
迭代器是实现了 __iter__()
和 __next__()
方法的对象。 __iter__()
方法返回迭代器本身,而 __next__()
方法返回序列中的下一个项目。
迭代器是特殊的可迭代对象,
__next__
:访问迭代器中的元素- 从迭代提中的第一个元素开始访问,一只访问到最后一个元素。如果继续进行访问会报StopIteration异常。访问之后会将元素丢弃,不会存在内存中。
迭代器的特点:
- 迭代器是一个可以记住遍历的位置的对象。
- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
- 使用
next()
函数可以手动获取下一个元素,当没有更多元素时,会抛出一个StopIteration异常。
class MyIterator:
def __init__(self, items):
self.items = items
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.items):
raise StopIteration
current_item = self.items[self.index]
self.index += 1
return current_item
# 使用迭代器
my_iterator = MyIterator([1, 2, 3])
for item in my_iterator:
print(item)
it1 = my_list.__iter__()
it1
it1.__next__()
it1.__next__()
it1.__next__()
# 访问最后一个元素后,再访问会报错:StopIteration。
it1.__next__()
迭代对象和迭代器的总结
- 所有迭代器都是可迭代的,但不是所有可迭代的都是迭代器。
- 可迭代对象提供一个迭代器,而迭代器可以用来迭代其中的元素。
在Python编程中,理解这两个概念对于编写高效的循环和操作集合类型至关重要。
# 使用for循环访问迭代器
class MyIterator:
def __init__(self, items):
self.items = items
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.items):
raise StopIteration
current_item = self.items[self.index]
self.index += 1
return current_item
# 创建一个迭代器实例
my_iterator = MyIterator([1, 2, 3, 4, 5])
# 使用for循环来访问迭代器
for item in my_iterator:
print(item)
# 使用while循环
my_iterator = MyIterator([1, 2, 3, 4, 5, 6])
it = iter(my_iterator)
while True:
try:
print(next(it))
except StopIteration:
break
迭代器的优点
- 内存效率:迭代器按需计算值,这意味着它们不需要在内存中存储整个数据集。
- 惰性计算:迭代器只在需要时计算下一个值,这对于大数据集或无限数据流来说非常有用。
- 提供一个统一的接口:迭代器提供了一个通用的接口来遍历数据结构,而不需要关心底层数据结构的细节。
以下是一个使用迭代器的实例,其中我们创建了一个生成斐波那契数列的迭代器。斐波那契数列是一个无限序列,使用迭代器可以有效地生成它,而不需要预先计算整个序列。
class FibonacciIterator:
def __init__(self):
# 初始化前两个斐波那契数
self.first = 0
self.second = 1
def __iter__(self):
# 返回迭代器本身
return self
def __next__(self):
# 计算下一个斐波那契数
next_value = self.first + self.second
# 更新前两个数
self.first, self.second = self.second, next_value
# 返回下一个斐波那契数
return self.first
# 创建斐波那契数列迭代器
fib_iterator = FibonacciIterator()
# 使用for循环打印前10个斐波那契数
for i, value in enumerate(fib_iterator):
if i >= 10: # 打印前10个数后停止
break
print(value)
附件
本文对应的jupyter notebook源码链接,欢迎下载练习:https://download.csdn.net/download/fx_yzjy101/89779395
如有问题请留言。