迭代器&&生成器&&可迭代对象

迭代器

定义:
1.当类中定义了 __iter____next__ 两个方法。
2. __iter__ 方法需要返回对象本身,即:self
3. __next__方法,返回下一个数据,如果没有数据了(不返回数据了),则需要抛出一个StopIteration的异常。

接下来,通过代码来认识它

class IT(object):
  def __init__(self):
      self.counter = 0

  def __iter__(self):
      return self

  def __next__(self):
      self.counter += 1
      if self.counter == 3:
          raise StopIteration()
      return self.counter

# 根据类实例化创建一个迭代器对象:
obj1 = IT()
v1 = next(obj1)         # 相当于 v1 = obj1.__next__()     
print(v1)

v2 = next(obj1)
print(v2)

v3 = next(obj1)
print(v3)

obj2 = IT()   # 又创建了一个迭代器对象
for item in obj2:  # 首先会执行迭代器对象的__iter__方法并获取返回值,一直去反复的执行 next(对象) 
     print(item)

注意:
1.迭代器对象支持通过next取值,如果取值结束则自动抛出StopIteration。
2.for循环内部在循环时,先执行__iter__方法,获取(返回)一个迭代器对象,然后不断执行的next取值(有异常StopIteration则终止循环)。

生成器

生成器是特殊类型的迭代器,因为它符合迭代器的定义

上代码示例

# 创建生成器函数
def func():
    yield 1
    yield 2

# 创建生成器对象(内部是根据生成器类generator创建的对象),生成器类的内部也声明了:__iter__、__next__ 方法。
obj1 = func()
for item in obj2:
    print(item)

想说的是:如果按照迭代器的规定来看,其实生成器类也是一种特殊的迭代器类(生成器也是一个中特殊的迭代器)。

可迭代对象

定义:如果一个类中有__iter__方法且返回一个迭代器对象 ;则我们称以这个类创建的对象为可迭代对象。

# IT类符合迭代器的规则,所以IT类是迭代器类,创建的对象就是迭代器对象
class IT(object):
    def __init__(self):
        self.counter = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.counter += 1
        if self.counter == 3:
            raise StopIteration()
        return self.counter

# Foo类里面有__iter__方法,返回迭代器对象,所以这个类创建的对象是 可迭代器对象    
class Foo(object):
    def __iter__(self):
        return IT()
obj = Foo()    # 可迭代对象
for item in obj: # 循环可迭代对象时,内部先执行obj.__iter__并获取迭代器对象;不断地执行迭代器对象的next方法。
    print(item)

常见的数据类型:列表,字典,元组,集合都是可迭代对象

from collections.abc import Iterator, Iterable

# Iterator -> 迭代器
# Iterable -> 可迭代对象

v1 = [11, 22, 33]    # 列表 —> 可迭代对象
print( isinstance(v1, Iterator) )  # false,判断是否是迭代器;判断依据是__iter__ 和 __next__。
print( isinstance(v1, Iterable) )  # True, 判断是否是可迭代对象,判断依据是是否有 __iter__且返回迭代器对象。

v2 = v1.__iter__()   # 返回迭代器对象
print( isinstance(v1, Iterator) )  # True
print( isinstance(v2, Iterable) )  # false

如何查看是可迭代对象还是迭代器

  • __iter____next__就是迭代器或者生成器
  • 只有__iter__就是可迭代对象
  • 通过dir(生成的变量) 可以查看到类中所有的成员
    eg:
       v1 = [11, 22, 33]
       print(dir(v1))  # ['__iter__',..........]
    

以上就是对迭代器,生成器和可迭代对象的认识!

posted @ 2024-07-03 15:56  清风拂山岗(小高同学)  阅读(12)  评论(0编辑  收藏  举报