python基础-生成器和迭代器

生成器和迭代器,可迭代对象

1. 迭代器

在这里插入图片描述

迭代器的实现

'''
迭代器
'''
# 这就是迭代器类型
class IT(object):
  def __init__(self):
      self.count = 0

  def __iter__(self):
      return self

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

# 创建一个迭代器对象
# obj1 = IT()
# v1 = obj1.__next__()
# print(v1)
# v2 = obj1.__next__()
# print(v2)
# v3 = obj1.__next__()
# print(v3)


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

迭代器对象支持通过next取值,如果取值结束则自动抛出StopIteration

for循环内部再循环时,先执行_iter_方法,获取一个迭代器对象,然后不断执行的next取值(有异常StopIteration则终止循环)

2.生成器

#创建生成器函数
def func():
  yield 1
  yield 2
#创建生成器对象(内部时根据生成器类generator创建的对象),生成器类的内部也声明了:__iter__,__next__方法
obj1 = func()
v1 = obj1.__next__()
print(v1)
v2 = obj1.__next__()
print(v2)
v3 = obj1.__next__()
print(v3)

# 如果按照迭代器的规定来看,其实生成器类也是一种迭代器类-即生成器时特殊的迭代器
obj2 = func()
for item in obj2:
  print(item)

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

如果按照迭代器的规定来看,其实生成器类也是一种迭代器类-即生成器时特殊的迭代器

3. 可迭代对象

常见的可迭代对象:列表,字典,集合,

# ''',
# 可迭代对象
# '''
# 如果一个类中有__iter__方法且返回一个迭代器对象,则我们称为这个类创建的对象为可迭代对象
class IT(object):
    def __init__(self):
        self.count = 0

    def __iter__(self):
        return self

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

class Foo(object):
    def __iter__(self):
        return IT()
obj = Foo() # 可迭代对象
# # 可迭代对象是可以使用for来进行循环,在循环的内部其实是执行__iter__方法,获取其迭代对象,然后再在其内部执行这个迭代器对象的next功能,逐步取值
for item in obj:
    print(item)
  • 如何判断是否为可迭代对象或者是否可迭代?

    from collections.abc import Iterator,Iterable
    v1 = [1,2,3]
    print(isinstance(v1,Iterator)) # flase 判断是否是迭代器,判断依据是__iter__和 __next__
    print(isinstance(v1,Iterable)) # True 判断是否可迭代,判断依据是是否有__iter__且返回迭代器对象
    
    v2 = v1.__iter__()
    print(isinstance(v2,Iterator)) # True 判断是否是迭代器,判断依据是__iter__和 __next__
    print(isinstance(v2,Iterable)) # True 判断是否可迭代,判断依据是是否有__iter__且返回迭代器对象
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值