zoukankan      html  css  js  c++  java
  • 迭代器和生成器

    ---恢复内容开始---

    iterable 可迭代的

           str,列表,tuple,set ,dict 都是可迭代的

           可迭代的对应的标志__iter__

    可迭代协议:

               用print('__iter__'in dir([1,2,3]))判断一个变量是否可迭代

               凡是可迭代的变量内部都有一个__iter__方法

    迭代器协议:迭代器既有__iter__方法,又有__next__方法

    迭代器   : 内置__iter__,__next__方法    大部分都是在python的内部去使用的我们直接拿来用就行了

    判断是否是迭代器和可迭代对象的简便方法:

    s='abc'

    print(isintance(s,Iterable))(判断是否是可迭代的)

    print(isintance(s,Iterator))(判断是否是迭代器)

    不管是一个迭代还是一个可迭代的对象,都可以用for循环遍历

    迭代器出现的原因:帮你节省内存

    迭代器的特点:

                       1.可用for循环

                       2.可以节省内存

                       3.只能用一次

    生成器:(generator)

    生成器的本质是迭代器

    1.生成器函数,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行

    2.生成器表达式:类似于列表推导,但是生成器返回按需要产生结果的一个对象,而不是一次构建一个结果列表

    生成器函数:

    初识生成器

    生成器监听文件输入:

    import time

    def dail(filename):

         f=open(filename)

         f.seek(0,2)#从文件末尾算起

          while True:

                  line=f.redline()#读取文件中新的问本行

                  if not line:

                         time.sleep(0.1)

                         continue

                    yield line

    tail_g = tail('tmp')

    for line in tail_g:

           print(line)

    计算移动平均值:

    def wrap(func):
    def inner(*args,**kwargs):
    g = func(*args,**kwargs)
    next(g)
    return g
    return inner

    @wrap
    def averager():
    total = 0
    day = 0
    avrage = 0
    while True:
    day_num = yield avrage #return avrage
    total += day_num
    day += 1
    avrage = total/day

    列表推导式和生成器表达式

    例子:

    #老男孩由于峰哥的强势加盟很快走上了上市之路,alex思来想去决定下几个鸡蛋来报答峰哥
    
    egg_list=['鸡蛋%s' %i for i in range(10)] #列表解析
    
    #峰哥瞅着alex下的一筐鸡蛋,捂住了鼻子,说了句:哥,你还是给我只母鸡吧,我自己回家下
    
    laomuji=('鸡蛋%s' %i for i in range(10))#生成器表达式
    print(laomuji)
    print(next(laomuji)) #next本质就是调用__next__
    print(laomuji.__next__())
    print(next(laomuji))

    总结:

    把列表解析的[]换成()得到的就是生成器表达式

    列表解析与生成器表达式都是一种便利点的编程方式,只不过生成器表达式更节省内存

    Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和

  • 相关阅读:
    C# 获得 当年1月1号
    Mybatis快速入门
    maven项目无法读取src/main/java目录下的配置文件解决方法
    Jenkins之手动安装
    Ubuntu17安装maven3.5.2
    Ubuntu17安装Jenkins
    Spring之事务操作(注解)
    Spring之事务操作(配置文件)
    Spring之配置文件中引入其它配置文件
    【转】maven常用插件介绍
  • 原文地址:https://www.cnblogs.com/kxllong/p/7277503.html
Copyright © 2011-2022 走看看