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

     1 可以通过for循环来遍历,这种遍历我们称为迭代(Iteration),在Python中,迭代是通过for….in….来完成的.
     2 
     3 from collections import Iterable
     4 print(isinstance({1,2,3},Iterable)) #判断一个对象是可迭代对象呢
     5 
     6 要创建一个生成器,第一种方法:只要把一个列表生成式的[]改成(),就创建了一个generator:
     7 创建L和L1的区别仅在于最外层的[]和(),L是一个list,而L1是一个generator。
     8 我们可以直接打印出list的每一个元素,但不能直接打印出generator的每一个元素。
     9 如果要挨个输出出来,可以通过next()函数获得生成器的下一个返回值:
    10 L=(x**2 for x in range(10))
    11 print(next(L))
    12 print(next(L))
    13 print(next(L))
    14 
    15 可以看出来,generator保存的是算法,每次调用next1),可以计算出的下一个元素的值,知道计算到最后一个元素,再继续输出,就会抛出StopIteration的错误。但是不能就这么使用next()函数,正确的方法是使用for循环,因为生成器本身也是可迭代对象
    16 
    17 def fib(max):
    18     n,a,b=0,0,1
    19     while n<max:
    20         yield b
    21         a,b=b,a+b
    22         n=n+1
    23     return 'ok'
    24 fib(12)
    25 for i in fib(12):
    26     print(i)
    27 
    28 
    29  generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。
    30 要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,
    31 遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。
    32 请注意区分普通函数和generator函数,普通函数调用直接返回结果,generator函数的“调用”实际返回一个generator对象:
    33 
    34 截至到现在,我们可以知道,能够直接作用于for循环的数据类型有以下几种:
    35 一种是序列数据类型,如list、tuple、dict、set、str等;
    36 一种是generator
    37 
    38 迭代器
    39 生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
    40 把list、dict、str等Iterable变成Iterator可以使用iter()函数:
    41 >>> isinstance(iter([]), Iterator)
    42 True
    43 >>> isinstance(iter('abc'), Iterator)
    44 True
    45 为什么list、dict、str等数据类型不是Iterator?
    46 这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
    47 Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
    48 
    49 凡是可作用于for循环的对象都是Iterable类型;
    50 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
    51 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
    52 Python的for循环本质上就是通过不断调用next()函数实现的,例如:
    53 for x in [1, 2, 3, 4, 5]:
    54     pass
    55 实际上完全等价于:
    56 # 首先获得Iterator对象:
    57 it = iter([1, 2, 3, 4, 5])
    58 # 循环:
    59 while True:
    60     try: # 获得下一个值:
    61         x = next(it)
    62     except StopIteration:
    63         # 遇到StopIteration就退出循环
    64         break
  • 相关阅读:
    mouse_event模拟鼠标滚轮
    润乾报表配置技术路线
    建筑 物件 开心背单词 读句子,单词,字母,看图例, 翻译,看动画
    文字过渡动画,曲线过渡动画,,使用这个插件assign shape keys
    运动锻炼 开心背单词 读句子,单词,字母,看图例, 翻译,看动画,学英语,轻松背单词,简单背单词
    blender293 内置插件 精度绘画控件,PDT学习003,pdt tangents 切线
    日常用品 背单词 读句子 看图片 读单词 读字母 翻译, 看动画 学英语
    blender293 内置插件 精度绘画控件,PDT学习 precision drawing tools
    乔布斯 背单词 02 读句子 单词 字母 翻译,看动画 学英语 名言 我菜顾我在,我菜故我在,blender加python
    狐狸 和 乌鸦 英语 朗读句子 背单词
  • 原文地址:https://www.cnblogs.com/zpdbkshangshanluoshuo/p/10485157.html
Copyright © 2011-2022 走看看