zoukankan      html  css  js  c++  java
  • 迭代器,迭代对象,生成器

    python3中用生成器 产生 斐波那切数列

    1 #生成器
    2 def fib():
    3     per,cun=0,1
    4     while 1:
    5         yield  cun
    6         per,cun=cun,cun+per
    7 f=fib()
    8 #range中指定斐波那契数列的范围
    9 retu_list=list(next(f) for i in range(1,10))

     1为何要有迭代器?

    对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。
    但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器

    2、什么是可迭代对象?
    可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下
    'hello'.__iter__
    (1,2,3).__iter__
    [1,2,3].__iter__
    {'a':1}.__iter__
    {'a','b'}.__iter__
    open('a.txt').__iter__
    3 什么是迭代器对象?
    可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
    而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
    
    文件类型是迭代器对象
    open('a.txt').__iter__()
    open('a.txt').__next__()

    迭代器的优缺点
    #优点:
      - 提供一种统一的、不依赖于索引的迭代方式
      - 惰性计算,节省内存
    #缺点:
      - 无法获取长度(只有在next完毕才知道到底有几个值)
      - 一次性的,只能往后走,不能往前退

    生成器
    只要函数的内部与yied关键字,那么 函数名() 的结果不会执行该函数,会得到生成器
     1 def func():
     2     print('====>first')
     3     yield 1
     4     print('====>second')
     5     yield 2
     6     print('====>third')
     7     yield 3
     8     print('====>end')
     9 
    10 g=func()
    11 print(g) #<generator object func at 0x0000000002184360> 

    生成器就是迭代器

    1 g.__iter__
    2 g.__next__
    3 #2、所以生成器就是迭代器,因此可以这么取值
    4 res=next(g)
    5 print(res)

    生成器 例子

    1 def myrange(start,end,step):
    2     while start<end:
    3         yield start
    4         start+=step
    5 myobj=myrange(1,20,2)
    6 print(next(myobj))

    生成器  表达式形式

     1 #yield关键字的另外一种使用形式:表达式形式的yield
     2 def eater(name):
     3     print('%s 准备开始吃饭啦' %name)
     4     food_list=[]
     5     while True:
     6         food=yield food_list
     7         print('%s 吃了 %s' % (name,food))
     8         food_list.append(food)
     9 
    10 g=eater('egon')
    11 g.send(None) #对于表达式形式的yield,在使用时,第一次必须传None,g.send(None)等同于next(g)
    12 g.send('蒸羊羔')
    13 g.send('蒸鹿茸')
    14 g.send('蒸熊掌')
    15 g.send('烧素鸭')
    16 g.close()
    17 g.send('烧素鹅')
    18 g.send('烧鹿尾')
    yield总结
    #1、把函数做成迭代器 #2、对比return,可以返回多次值,可以挂起/保存函数的运行状态


  • 相关阅读:
    基于接口的动态代理和基于子类的动态代理
    JDBC连接数据库
    关于使用Binlog和canal来对MySQL的数据写入进行监控
    使用VMware12在CentOS7上部署docker实例
    VMWare12pro安装Centos 6.9教程
    读《Java并发编程的艺术》学习笔记(十)
    读《Java并发编程的艺术》学习笔记(九)
    读《Java并发编程的艺术》学习笔记(八)
    读《Java并发编程的艺术》学习笔记(七)
    读《Java并发编程的艺术》学习笔记(六)
  • 原文地址:https://www.cnblogs.com/hexintong/p/9131923.html
Copyright © 2011-2022 走看看