首页 > 编程语言 >python迭代器和生成器

python迭代器和生成器

时间:2022-11-14 13:23:00浏览次数:43  
标签:迭代 python self 生成器 iter next print

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 < 5:
            yield 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

 

标签:迭代,python,self,生成器,iter,next,print
From: https://www.cnblogs.com/chf333/p/16888751.html

相关文章

  • 巨蟒python全栈开发django9:一些知识点的汇总
    回顾上周内容:题目:1.人民出版社出版过的所有书籍的名字以及作者的姓名(三种写法,笔记中有两种写法)2.手机以2开头的作者出版过的所有书籍名称以及出版社名称(三种写法,笔记......
  • 巨蟒python全栈开发django3:url&&视图
    1.url正则匹配分组和命名分组2.路由分发3.url别名和反向解析4.httprequest和httpresponse的使用 内容回顾:1.jinja2(flask框架,没有内置模板对象,需要自己用jinja2)......
  • 巨蟒python全栈开发django2:初识django
    今日内容大纲:1.起飞版web框架2.自定制框架的流程3.jinja2模板渲染初识4.MVC&&MTV5.django版本介绍及django安装6.django初识(一些操作) 今日详细内容:1.起飞版web框架2.自......
  • python 中 #-*-coding: UTF-8 -*-的作用
     #-*-coding:UTF-8-*-解决python2中中文乱码报错的问题001、[root@pc1test1]#lsa.fatest.py[root@pc1test1]#cata.fa##测试数据>chr1xxxaaaggg......
  • Python巨蟒全栈开发目录
    ​​巨蟒python全栈开发-第一阶段基础数据类型&基础​​​​1.什么是计算机&&python的简介(待补充)​​​​2.while循环&&格式化输出&&运算符号(待补充)​​​......
  • 巨蟒python全栈开发flask11项目开始3
    1.多玩具遥控&&websocket回锅2.绑定玩具时添加好友的最终逻辑3.消息&&好友列表4.chat聊天&&对话窗口 1.多玩具遥控&&websocket回锅app的4个隐藏需求: 回顾: 下面看一下上......
  • 巨蟒python全栈开发数据库前端8:jQuery框架2
    数据可视化推荐网站(都是JavaScript写的):​​echart网站:​​​​https://echarts.baidu.com/​​聚宽网站我们要多用心也是可以做前端的!!! 回顾:1.jquery介绍2.jq......
  • 巨蟒python全栈开发flask10 项目开始2
    1.websocket异常处理出现上图报错的原因是什么?原因是:websocket断开了,所以报错19行接收的msg是None值,所以报错.打开一个文件,点击发送音乐,出现上面的内容:客户端app发送......
  • 巨蟒python全栈开发-第11阶段 ansible_project1
    今日大纲:1.前端页面介绍2.发布流程3.需求分析4.表结构设计5.前端页面设计 昨日内容回顾:1.roles-tasks-handlers-files-templates-varsroles的操作顺序:roles的操作......
  • 巨蟒python全栈开发flask9 项目开始1
    1.项目需求分析立项:Javis&&taisen(三个月全部,先模拟出一个玩具,硬件需要周期长一些)想法---需求分析:1.通过玩具与孩子实时进行沟通2.希望玩具的知识渊博3.......