转载Python3 迭代器与生成器

迭代器

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

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

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

也可以使用 next() 函数:

import sys         # 引入 sys 模块

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

生成器

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

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

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

import sys

def fibonacci(n): # 生成器函数 - 斐波那契
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成 while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()
0 1 1 2 3 5 8 13 21 34 55 

An exception has occurred, use %tb to see the full traceback.

SystemExit

C:\Users\xiner\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:2870: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

Python yield 使用浅析


resversed(序列) 顺序翻转迭代

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

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

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

编号迭代

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

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

循环控制语句

break & continue

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

else子句

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

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

示例:

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

与下面的else子句等价

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

列表推导式

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

示例:

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

字典推导式

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

元组推导式(迭代器)

a = (x**2 for x in range(10))
type(a)
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. MyEclipse 2014 破解补丁及激活步骤

    针对 MyEclipse Trail Expired 问题的解决方法 我用网上找的注册类生成注册码的方式注册了一下,重启MyEclipse仍然会有提示弹窗,不过剩余时间由 4 days变成了 5 da ...

  2. JAVAEE——SSH三大框架整合(spring+struts2+hibernate)

    一.整合原理 二.导包(41个) 1.hibernate (1)hibernate/lib/required (2)hibernate/lib/jpa | java persist api java的 ...

  3. 钉钉企业应用C#开发笔记之一(免登)

    关于钉钉 钉钉是阿里推出的企业移动OA平台,本身提供了丰富的通用应用,同时其强大的后台API接入能力让企业接入自主开发的应用成为可能,可以让开发者实现几乎任何需要的功能. 近期因为工作需要研究了一下钉 ...

  4. 谈谈tableView的重要属性内边距

    全屏穿透效果需要做到两点 tableView的可视范围占据整个父控件(或者屏幕)--设置contentsize滚动范围. 所有的cell都可以被看到,也就是说tableView中的cell不会被导航栏 ...

  5. bootstrap栅栏系统css中的col-xs-*、col-sm-*、col-md-* 的意义以及 bootstrap一个标签中,同时有 col-xs , col-sm , col-md , col-lg的理解

    摘要: bootstrap栅栏系统css中的col-xs-*.col-sm-*.col-md-* 的意义: .col-xs- 超小屏幕 手机 (<768px) .col-sm- 小屏幕 平板 ( ...

  6. es6的模块化编程

    es6的模块化编程 基本用法 es6 中新增了两个命令 export 和 import , export 命令用于规定模块的对外接口,import 命令用于输入其他模块提供的功能. 一个模块就是一个独 ...

  7. eclipse 下使用git clone

    方法一:eclipse安装好git插件后,直接import-git-project from git- clone url-输入github的网址等就可以了方法二:使用git软件,到指定的目录,右击g ...

  8. CSS3文本

    1.文字省略 text-overflow:ellipsis; overflow:hidden; white-space:nowrap; //text-overflow(clip.ellipsis)只是 ...

  9. DNS,TCP,IP,HTTP,socket,Servlet概念整理

    DNS,TCP,IP,HTTP,socket,Servlet概念整理   常见的协议虽然很容易理解,但是看了之后过一段时间不看还是容易忘,笔记如下,比较零碎,勉强供各位复习.如有错误欢迎指正.   D ...

  10. 【HTML】模板

    <!DOCTYPE html> <head> <base href="http://www.w3school.com.cn/i/" target=&q ...