python迭代器和生成器

1. 迭代器

  1. 迭代是访问集合的一种方式 ,可以记住遍历的位置的对象,int类型和容器类对象不可进行迭代

复制代码
1. int类型不可进行迭代
 例:num = iter(12345)
   print(next(num))    #  TypeError: 'int' object is not iterable    

2. 容器类对象也不可为迭代对象
 例:class myList:
    def __init__(self):
      self.a = [ ]
    def add(self, item):
      self.a.append(item)
   my = myList()
   my.add(1)
   my.add(2)
   myIter = iter(my)
   for i in myIter:
    print(i)       # 'myList' object is not iterable  
复制代码

 

  2. 通过Python内置函数isinstance()来判断一个对象的数据类型

    例: from collections.abc import Iterable
      print(isinstance([ ],Iterable)    # True
      print(isinstance(123,Iterable)      # False
      print(isinstance(123,int)      # True

 

  3. 迭代器的两个基本方法,iter()和next(),这两个方法在一起使用,可以通过for循环遍历 

复制代码
1. 迭代器的应用
    myList = [1,2,3,4,5,6]
    iter_ = iter(myList)
    print(iter_)                # <list_iterator object at 0x000001A749A6BFD0>
    print(next(iter_))      # 1
    print(next(iter_))      # 2
    ...

2. 迭代器在for循环中的应用
    myList = [1,2,3,4,5,6]
    iter_ = iter(myList)
    for i  in myList:
        print(next(iter_))   # 1 2 3 4 5 6

3. 定义一个迭代器对象,异常终止
    class myNumber:
        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

    myNum = iter(myNumber())
    print(next(myNum)        # 1
    print(next(myNum)        # 2
    print(next(myNum)        # 3   
for x in myNum: print(x) # 1 2 3 4 5 6 7 8 9
复制代码

 

2. 生成器yield

  1. 使用yield的函数称为生成器,是一个返回迭代器的函数,只用于迭代操作

  2. 在调用生成器运行的过程中,每次遇到yield函数会暂停并保存当前的运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续运行

  3. 调用一个生成器函数,返回一个迭代器对象,StopIteration触发异常,结束迭代

复制代码
1. 生成器field函数
    def contains():
        i = 0
        while i < 5yield i
            i += 1

    # 生成器函数
    print(contains())        # <generator object contains at 0x000002A837F76D60>

    # 通过for循环得到内容
    for i in contains():
        print(i)                 # 0,1,2,3,4

    # 通过next()函数得到内容
    net = contains()
    print(next(net))        # 0
    print(next(net))        # 1
    print(next(net))        # 2

2. 元组推导式和生成器的关系,元组不可以直接进行推导,而是得到一个生成器,通过next进行循环求值
   # 元组推导式
    vm = (i for i in range(10))
    print(vm)            # <generator object <genexpr> at 0x000002E578A81580>
    print(next(vm))        # 0
    print(next(vm))        # 1
    print(next(vm))        # 2
    ...

3. 生成器实例——斐波那契数列
  def fibonacci(n):
    num,b,counter = 0,1,0
    while True:
      if counter > n:
        return
      yield num
      num,b = b,num+b
      counter += 1
  f = fibonacci(10)    # f是一个迭代器,由生成器返回
  while True:
    try:
      print(next(f))  # 0 1 1 2 3 5 8 13 21 34 55
    except:
      raise StopIteration
复制代码

 

posted @   无敌小豆包  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示