python基础:迭代器、生成器

迭代器定义

迭代器类型的定义:
  1. 当类中定义了__iter__ 和__next__两个方法
  2. __iter__方法需要返回对象本身,即self
  3. __next__方法,返回下一个数据,如果没有数据,抛出StopIteration异常

创建迭代器类型:

class IT(object):
    def __iter__(self):
        return self

    def __init__(self):
        self.counter = 0

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

根据类实例化创建一个迭代器对象

  obj1 = IT()
  
  v1 = next(obj1)     # obj1.__next__()
  print(v1)
  v2 = next(obj1)
  print(v2)
  v3 = next(obj1)     # 抛异常
  print(v3)

  obj2 = IT()
  for item in obj2:
    print(item)

迭代器对象支持通过next取值,如果取值结束抛出StopIteration
for循环时,先执行__iter__方法,获取一个迭代器对象,然后不断执行next取值,直到抛出异常

迭代器原理:
1.类实例化    2.类成员属性保存每次状态值     3.next实现每次迭代,所以__next__中要有终止条件


生成器

创建生成器函数  

def func():
    yield 1
    yield 2

创建生成器对象(内部是根据生成器类generator创建对象),生成器类(generator)的内部也声明了__iter__、__next__方法

  obj1 = func()
  v1 = next(obj1)
  print(v1)
  v2 = next(obj1)
  print(v2)
  v3 = next(obj1)
  print(v3)

  obj2 = func()
  for item in obj2:
    print(item)

如果按照迭代器的定义来看,其实生成器类是一种特殊的迭代器类(生成器也是一种特殊迭代器) 只是 生成器 定义方式比 迭代器 更简单,采用函数方式,没有StopIteration异常终止迭代


可迭代对象(生成器对象)

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


class Foo(object):
  def __iter__(self):
    return 迭代器对象(yield 生成器对象)

obj = Foo()            # obj是可迭代对象


可迭代对象是可以使用for来进行循环,在循环的内部是先执行__iter__方法,获取其迭代器对象,然后在内部执行这个迭代器对象的next功能,逐步取值
for item in obj:
    pass

例子:

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

class Foo(object):
  def __iter__(self):
    return IT()

obj = Foo()       #可迭代对象
for item in obj:  # 循环可迭代对象时,内部先执行obj.__iter__获取迭代器对象;再不断执行迭代器对象next方法
  print(item)

对 python 内置可迭代对象 range() 测试 
v = range(100)
dir(v)             # v是可迭代对象:存在__iter__方法,存在__next__
v2 = v.__iter__()
dir(v2)            # v2为迭代器,存在__iter__ __next__ 方法


基于可迭代对象&迭代器实现:自定义range

class IterRange(object):           # 定义迭代器
  def __init__(self, num):
    slef.num = num
    self.counter = -1

  def __iter__(self):
    return self

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

class MyRange(object):
  def __init__(self, maxnum)
    self.maxnum = maxnum

  def __iter__(self):
    return IterRange(self.maxnum)   # __iter__返回迭代器对象

obj = MyRange(10)
for item in obj:
  print(item)


可迭代对象: 使用生成器实现可迭代对象

class Foo(object):
  def __iter__(slef):
    yield 1               # 生成器,不同于迭代器:函数方式实现,不用实现__next__
    yield 2               # 不使用 StopIteration 终止;需要终止迭代条件

obj = Foo()
for item in obj:
  print(item)


基于可迭代对象&生成器实现:自定义range

class MyRange(object):
  def __init__(self, maxnum):
    self.maxnum = maxnum
    self.counter = -1
  def __iter__(self):
    while self.counter < self.maxnum:     # 迭代器终止有StopIteration()异常,不用循环;生成器需要循环、终止条件, 体会二者编写风格
      self.counter += 1
      yield self.counter
      
obj = MyRange(10)
for item in obj:
  print(item)

可迭代对象&迭代器 判定

判断常见数据类型是否可迭代对象&迭代器

from collections.abc import Iterator,Iterable
v1 = [1,2,3]
print(isinstance(v1,Iterator))
print(isinstance(v1,Iterable))

v2 = v1.__iter__()
print(isinstance(v2,Iterator))
print(isinstance(v2,iterable))

总结:

参考资料:

B站 15分钟彻底搞懂迭代器、可迭代对象、生成器

python迭代器(Iterator)、生成器(Generator)和生成器表达式(Generator expressions)

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值