zoukankan      html  css  js  c++  java
  • 迭代器(Iterator)和生成器(generator)浅析

    凡是含有__iter__方法的,都是可迭代对象    

    若同时含有__iter__  __next__ 则作为迭代器使用   用__next__方法来取值

    可迭代对象用for循环取值最方便

     1 a=li=[1,2,5,78,32,94].__iter__()
     2 print(li.__next__())    #迭代取值
     3 print(li.__next__())
     4 print(li.__next__())
     5 # print(li.__next__())
     6 # print(li.__next__())
     7 # print(li.__next__())
     8 print(a.__next__())
     9 # print(li.__next__())    #超出可迭代范围之后,继续会报错
    10 for i in a:       #for迭代会更好
    11     print(i)

    并且迭代器不会在内存中占用一大块地址 循环一次生成一次

    生成器可以看做为特殊的迭代器,它是使用者自定义的一种迭代器,可以被for循环取值

            自定义一个生成器函数实现监听文件输入的操作:

     1 def tail(file):   #生成器函数
     2     with open(file,'r',encoding='utf-8')as f:
     3         while True:
     4             line=f.readline()
     5             if line.strip():
     6                 yield line.strip() #如果内容不为空则输出
     7 
     8 g=tail('abc.txt')
     9 for i in g:
    10     print(i)

    生成器函数与普通函数比较返回值return被改为yield

    yield与return的区别:在函数被调用执行时会停在碰到的yield所在行,并返回一个可迭代对象,只有调用者完成迭代操作后,才会继续向下执行

    如果没有对可迭代对象for循环操作或取值 则只会看到返回的一个可迭代的生成器地址 类似<generator object show at 0x000002481BF7C620>

     1 def show():
     2     print('hello python!')
     3     yield '停下来啦'
     4     yield '继续执行咯'
     5 
     6 s=show()    
     7 # print(s)        #执行它仅仅能看到生成器地址
     8 g1=s.__next__()     
     9 print(g1)         #打印第一个yield的值
    10 # g2=s.__next__()
    11 # print(g2)       #打印第二个的值
  • 相关阅读:
    react 安装脚手架过程
    微信小程序-分享功能
    echarts 实现多图联动显示tooltip
    dom 相同父节点查找
    js 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果
    vue手写el-form组件
    vue组件传值、通信
    vue项目打包桌面应用 exe程序 以及打包为安装程序exe
    vue 使用echarts来制作图表
    前端数据可视化插件-图表
  • 原文地址:https://www.cnblogs.com/wen-kang/p/9309838.html
Copyright © 2011-2022 走看看