转载Python3 迭代器与生成器

迭代器

  • 迭代是Python最强大的功能之一,是访问集合元素的一种方式。
  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  • 迭代器有两个基本的方法:iter() 和 next()。

字符串,列表或元组对象都可用于创建迭代器:

  1. l=[1,2,3,4]
  2. it = iter(l) # 创建迭代器对象
  3. print (next(it)) # 输出迭代器的下一个元素
  4. print (next(it))
  1. 1
  2. 2
  1. l=[1,2,3,4]
  2. it = iter(l) # 创建迭代器对象
  3. for x in it:
  4. print (x, end=" ")
  1. 1 2 3 4

也可以使用 next() 函数:

  1. import sys # 引入 sys 模块
  2. li=[1,2,3,4]
  3. it = iter(li) # 创建迭代器对象
  4. while True:
  5. try:
  6. print (next(it))
  7. except StopIteration:
  8. sys.exit()
  1. 1
  2. 2
  3. 3
  4. 4
  5. An exception has occurred, use %tb to see the full traceback.
  6. SystemExit
  7. C:\Users\xiner\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:2870: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  8. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

生成器

在 Python 中,使用了yield的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。

  1. import sys
  2. def fibonacci(n): # 生成器函数 - 斐波那契
  3. a, b, counter = 0, 1, 0
  4. while True:
  5. if (counter > n):
  6. return
  7. yield a
  8. a, b = b, a + b
  9. counter += 1
  10. f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
  11. while True:
  12. try:
  13. print (next(f), end=" ")
  14. except StopIteration:
  15. sys.exit()
  1. 0 1 1 2 3 5 8 13 21 34 55
  2. An exception has occurred, use %tb to see the full traceback.
  3. SystemExit
  4. C:\Users\xiner\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:2870: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  5. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

Python yield 使用浅析


resversed(序列) 顺序翻转迭代

  1. a=list('hello')
  2. a
  1. ['h', 'e', 'l', 'l', 'o']
  1. a1=reversed(a) #a1是一个迭代器
  1. print(type(a))
  2. print(type(a1))
  1. <class 'list'>
  2. <class 'list_reverseiterator'>
  1. b=[1,2,3,4,5]
  2. b1=reversed(b)
  1. print(type(b))
  2. print(type(b1))
  1. <class 'list'>
  2. <class 'list_reverseiterator'>
  1. reversed((1,2,4,7,8))
  1. <reversed at 0x2272e4a82e8>
  1. a2=reversed(range(5))
  2. list(a2)
  1. [4, 3, 2, 1, 0]

zip(序列1,序列2) 并行迭代

  1. l1=['a','b','c','d']
  2. l2=[1,2,3,4]
  3. list(zip(l1,l2))
  1. [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
  1. l3=('a','b','c','d')
  2. l4=[1,2,3,4]
  3. list(zip(l1,l2))
  1. [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
  1. l='hello'
  2. s=range(len(l))
  3. list(zip(l,s))
  1. [('h', 0), ('e', 1), ('l', 2), ('l', 3), ('o', 4)]
  1. l=dict(keys=l,values=s)
  2. l
  1. {'keys': 'hello', 'values': range(0, 5)}
  1. s
  1. range(0, 5)
  1. list(zip(l,s))
  1. [('keys', 0), ('values', 1)]

编号迭代

enumerate(序列):给序列打上编号

  1. l=['1','b','h',8]
  2. s=enumerate(l)
  3. s
  1. <enumerate at 0x2272dc60b88>
  1. list(s)
  1. [(0, '1'), (1, 'b'), (2, 'h'), (3, 8)]

循环控制语句

break & continue

  • break结束当前循环,然后跳到循环后的下一条语句。
  • continue提前结束当前这次循环,且继续进行下一次循环。
  1. a,b=0,1
  2. while True:
  3. a,b=b,a+b
  4. if b>1000:
  5. break
  6. print(a)
  1. 987
  1. # (数值之和小于100的行)的奇树数值之和
  2. m=[[12,13,20,9,30,7],[11,22,33,21,44],[30,32,25,66,1],[12,34,56,7]]
  3. result=0
  4. for l in m:
  5. tmp=0
  6. for n in l:
  7. tmp+=n
  8. if tmp>=100:
  9. break
  10. if tmp>=100:
  11. continue
  12. for n in l:
  13. if n % 2==1:
  14. result+=n
  15. print(result)
  1. 29

else子句

flag 变量可用来指示某一个特定事件是否已经发生,或某个特定状态是否存在。

若需要在循环之后判断该条件是否符合,则需要额外的标识来记录。

示例:

  1. l=[2,4,8,0,10,12]
  2. flag=False
  3. for n in l:
  4. if n%2==1:
  5. flag=True
  6. break
  7. if not flag:
  8. print('All num is even')
  1. All num is even

与下面的else子句等价

  1. l = [2, 4, 8, 0, 10, 12]
  2. for n in l:
  3. if n % 2 == 1:
  4. flag = True
  5. break
  6. else:
  7. print('All num is even')
  1. All num is even

列表推导式

利用其他集合类对象(列表,元组,集合,字典,...)来创建新的列表的方法:

示例:

  1. [2 * x for x in range(10)]
  1. [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
  1. [2 * x for x in range(10) if x % 3 == 0]
  1. [0, 6, 12, 18]
  1. [(x, y) for x in range(2) for y in range(3)]
  1. [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]

字典推导式

  1. a = ('a','b','c','df','gh')
  2. b = ['sdd',1,2,3,4,5]
  3. d = {a[i]:b[i] for i in range(len(a))}
  4. d
  1. {'a': 'sdd', 'b': 1, 'c': 2, 'df': 3, 'gh': 4}

元组推导式(迭代器)

  1. a = (x**2 for x in range(10))
  2. type(a)
  1. generator

Python3+迭代器与生成器的更多相关文章

  1. python014 Python3 迭代器与生成器

    Python3 迭代器与生成器迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式..迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结 ...

  2. python3: 迭代器与生成器(1)

    1. 手动遍历迭代器 你想遍历一个可迭代对象中的所有元素,但是却不想使用for循环. >>> items = [1, 2, 3] >>> # Get the ite ...

  3. python3迭代器和生成器

    1.手动访问迭代器中的元素 #要手动访问迭代器中的元素,可以使用next()函数 In [3]: with open('/etc/passwd') as f: ...: try: ...: while ...

  4. Python3 迭代器和生成器

    想要搞明白什么是迭代器,首先要了解几个名词:容器(container).迭代(iteration).可迭代对象(iterable).迭代器(iterator).生成器(generator). 看图是不 ...

  5. Python3 迭代器与生成器 - 学习笔记

    可迭代对象(Iterable) 迭代器(Iterator) 定义 迭代器和可迭代对象的区别 创建一个迭代器 创建一个迭代器类 使用内置iter()函数 StopIteration异常 生成器(gene ...

  6. Python3迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  7. python3 迭代器,生成器

    一 .什么是迭代 1. 重复 2.下次重复一定是基于上一次的结果而来 while True: cmd=input(':') print(cmd) l=[1,2,3,4] count=0 while c ...

  8. python系列九:python3迭代器和生成器

    #!/usr/bin/python import sys '''迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退.迭代器有 ...

  9. 吴裕雄--天生自然python学习笔记:Python3 迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

随机推荐

  1. visual studio for mac在线安装网络错误

    vs2017 for mac 终于出正式版了,兴冲冲的准备摆脱虚拟机. 官网https://www.visualstudio.com/zh-hans/vs/visual-studio-mac/下了安装 ...

  2. XML读取两种方法

    //第一种SAX方法解析 package a20170722.xmlex; import java.io.File; import java.util.ArrayList; import java.u ...

  3. Python基础入门教程,Python学习路线图

    给大家整理的这套python学习路线图,按照此教程一步步的学习来,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...

  4. bash远程代码执行漏洞

    博客园新闻:http://news.cnblogs.com/n/504506/(如果以下有说错的地方请不吝指出,谢谢~) 详情可围观上面的链接.因为我们的服务器都是私有网环境,即使要修复也得等到下次安 ...

  5. (转载)MQ基本操作

    摘自:http://blog.sina.com.cn/s/blog_4892cf780100erga.html 一.MQ基本操作 MQ中有几个很重要的组件:队列管理器(QueueManager).队列 ...

  6. Educational Codeforces Round 21 A-E题题解

    A题      ............太水就不说了,贴下代码 #include<string> #include<iostream> #include<cstring& ...

  7. JavaScript+svg绘制的一个动态时钟

    结果图: 代码如下: <!DOCTYPE html> <html> <head> <title>动态时钟</title> </head ...

  8. 使用css3实现小菊花加载效果

    使用css3实现小菊花加载效果 最常见的就是我们用到的加载动画.加载动画的效果处理的好,会给页面带来画龙点睛的作用,而使用户愿意去等待.而页面中最常用的做法是把动画做成gif格式,当做背景图或是img ...

  9. Javascript Prototype __proto__ constructor 三者的关系

    JavaScript三大毒瘤 --- this,原型链,作用域 在我等菜鸟一步一步升级中的过程中,这三个概念总是困扰这我们(可能只有我吧,我比较蠢).这三个东西往往都很绕,今天我就来分享一下我对原型. ...

  10. forEach( ) map( ) for( in ) for ( of )

    ====forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前项的索 ...