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)       #打印第二个的值
  • 相关阅读:
    手动安装ceph集群
    openstack端口禁用安全规则
    debian10桌面美化
    debian10 制作动态扩容根分区镜像
    CentOS7制作动态扩容根分区镜像
    EFKLK日志收集工具栈
    ceph rbd(csi) 对接 kubernetes sc
    secureCRT 814配色方案
    python function
    Linux操作篇之LNMP(一)
  • 原文地址:https://www.cnblogs.com/wen-kang/p/9309838.html
Copyright © 2011-2022 走看看