• 迭代器和生成器


    python中的for 循环

    s=[1,2,3,4]
    for i in s:
         print(i)
    View Code

    、可迭代

       字符串,列表,集合,字典,元组这些都可以被for循环,说明他们是可迭代的

        迭代就是:将某个数据集内的数据一个挨着一个的取出来,就叫做可迭代

        可迭代对应的标志:_iter_

     print('__iter__' in dir([1,2,3]))         #判断一个变量是不是一个可迭代的
    二、迭代协议
    希望这个数据类型里的东西也可以使用for被一个一个的取出来,那我们就必须满足for的要求。
    这个要求就叫做“协议

     l= [1,2,3,4,5]
      for i in l:
        print(i)
     print(iter(l))       #内置函数
    可迭代协议
    
    
    可迭代协议——凡是可迭代的内部都有一个__iter__方法
    三、迭代器协议
    迭代器协议  :  内部实现了__iter__ __next__方法
    迭代器里既有iter方法,又有next方法  ——迭代器协议
    通过iter(o)得到的结果就是一个迭代器,
    o是一个可迭代的
    l = [1,2,3,4,5]
    l_iterator = iter(l)
       print(l_iterator.__next__())
       print(l_iterator.__next__())
       print(l_iterator.__next__())
       print(l_iterator.__next__())
       print(l_iterator.__next__())
       next(l_iterator)               #==l_iterator.__next__()
       while True:
          try:
              print(next(l_iterator))
          except StopIteration:
              break
    View Code
    迭代器 大部分都是在python的内部去使用的,我们直接拿来用就行了
    迭代器:内置__iter__和__next__方法
    迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。
     s = 'abc'
     print(isinstance(s,Iterable))
     print(isinstance(s,Iterator))
     print(isinstance(iter(s),Iterator))
    判断是否是迭代器 和 可迭代对象的简便方法
    不管是一个迭代器还是一个可迭代对象,都可以使用for循环遍历
    迭代器出现的原因 帮你节省内存
    from collections import Iterable
    from collections import Iterator
    a = range(100)
    print(isinstance(a,Iterable))
    print(isinstance(a,Iterator))
    View Code
    可迭代和迭代器的不同点 : 迭代器多实现了一个__next__方法
    可迭代和迭代器的相同点 : 都可以用for循环
    
    
    判断迭代器和可迭代的方法
    第一种:判断内部是不是实现了 __next__
    '__next__' in dir(o)
    第二种
    from collections import Iterable  #可迭代
    from collections import Iterator  #迭代器
    isinstance(o,Iterable)
    isinstance(o,Iterator)
    View Code

    四:生成器

    1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,

    挂起函数的状态,以便下次重它离开的地方继续执行

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

    五、生成器函数

    def func():
        print('aaaa')
        a = 1
        yield a    #返回第一个值
        print('bbbb')
        yield 12   #返回第二个值
    ret = func()  #拿到一个生成器
    print(ret)
    print(next(ret)) #取第一个值
    print(next(ret)) #取第二个值
    print(next(ret)) #取第三个值 会报错 因为没有第三个值
    生成器函数
    def make_cloth():
        for i in range(2000000):
            yield "第%s件衣服"%i
    
    szq = make_cloth()
    print(next(szq))
    print(next(szq))
    print(next(szq))
       for i in range(50):
          print(next(szq))
    生成器2
    def tail(filename):
        with open(filename) as f:
            f.seek(0, 2) #从文件末尾算起
            while True:
                line = f.readline()  # 读取文件中新的文本行
                if not line:
                    time.sleep(0.1)
                    continue
                yield line
    
    for line in tail('tmp_file'):
        print(line,end = '')
    监听文件
    def averager():
        total = 0
        day = 0
        avrage = 0
        while True:
            day_num  = yield avrage  #return avrage
            total += day_num
            day += 1
            avrage = total/day
    
     avg = averager()
    num = next(avg)  #激活生成器 avg.send(),什么都不send和next效果一样
    print(avg.send(10))  #传值 next
    print(avg.send(20))
    计算平均值

    六、列表式推导

    for i in range(100):
        print(i*i)
    n*n
    l =[i*i for i in range(100)]
    print(l)
    2、n*n
    l = [{'name':'v','age':28},{'name':'v'}]
    name_list = [dic['name'] for dic in l]
    print(name_list)
    取值1
    l = [{'name':'v1','age':28},{'name':'v2'}]
    name_list_generator = (dic['name'] for dic in l)
    print(name_list_generator)
    print(next(name_list_generator))
    print(next(name_list_generator))
    取值2
    laomuji = ('鸡蛋%s' %i for i in range(1,11))
    print(laomuji)
    print(next(laomuji))
    print(next(laomuji))
    老母鸡的故事
     
     


     
  • 相关阅读:
    Git 基础教程 之 解决合并冲突
    Git 基础教程 之 远程库更新到本地
    Git 基础教程 之 分支管理及策略
    Git 基础教程 之 从远程库克隆
    Git 基础教程 之 添加远程仓库
    Git 基础教程 之 远程仓库
    c++11新特性1--------------auto
    线程及线程间同步
    进程间通信---信号
    进程间通信---mmap详解(与system V ipc通信对照)
  • 原文地址:https://www.cnblogs.com/mengqingjian/p/7274512.html
Copyright © 2020-2023  润新知