Python 迭代器、生成器

迭代器是一个可以记住遍历位置的对象。

迭代器从集合的第一个元素开始访问,直到所有的元素被访问完。迭代器只能往前不会后退。

迭代器两个基本方法: iter() next()

 

1. 迭代器 VS 可迭代对象(Iterable)

列表、元组、字典、集合都是可迭代对象。它们是迭代的容器,可从容器中获取迭代器(Iterator)。

实例:

从元组返回一个迭代器

mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)    # 创建迭代器对象

print(next(myit))       # 输出迭代器的下一个元素
print(next(myit))
print(next(myit))  

输出:

apple
banana
cherry

 

字符串也是可迭代对象

mystr = "banana"
myit = iter(mystr)

print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))

输出:

b
a
n
a
n
a

 

2. 遍历迭代器

mytuple = ("apple", "banana", "cherry")
for x in mytuple:
    print(x)

输出:

apple
banana
cherry

提示:for 循环实际上创建了一个迭代器对象,并为每个循环执行 next() 方法。

 

3. 创建迭代器

把一个类作为一个迭代器需要在类中实现 __iter__() 和 __next__() 方法

__iter__() 方法返回一个特殊的迭代器对象,这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

__next__() 方法返回下一个迭代器对象

实例

创建一个返回数字的迭代器,初始值 1,逐步递增 1。

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)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

 输出:

1
2
3
4
5

 

StopIteration

结束迭代,防止出现无限循环。

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    if self.a <= 10:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)

输出:

1
2
3
4
5
6
7
8
9
10

 

posted @ 2021-10-10 13:06  做梦当财神  阅读(78)  评论(0编辑  收藏  举报