python入门(十三):生成器和迭代器
来源:互联网 发布:和硕鼠类似的软件 编辑:程序博客网 时间:2024/06/06 05:30
1.生成器
(1)通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
(2)创建generator
(一)把一个列表生成式的[]
改成()
,就创建了一个generator:
l = [x+1 for x in range(5)]#列表生成式print(l)l2 = (x+1 for x in range(5))#生成器print(l2)[1, 2, 3, 4, 5]
<generator object <genexpr> at 0x0391ADE0>
如果要一个一个打印出来,可以通过next()
函数获得generator的下一个返回值,当然一般也是使用FOR 来打印
for n in l2: print(n)
如果推算的算法比较复杂,用类似列表生成式的for
循环无法实现的时候,还可以用函数来实现。比如,著名的斐波拉契数列(Fibonacci)除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...
(二)要把fib
函数变成generator,只需要把print(b)
改为yield b
就可以了,generator和函数的执行流程不一样。函数是顺序执行,遇到return
语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行。
def fib(max): n, a, b = 0, 0, 1 while n < max: #print(b) yield b a, b = b, a+b n = n + 1data = fib(100)for i in range(100): print(data.__next__())
2.迭代器
我们已经知道,可以直接作用于for
循环的数据类型有以下几种:
一类是集合数据类型,如list
、tuple
、dict
、set
、str
等;
一类是generator
,包括生成器和带yield
的generator function。
这些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。
可以使用isinstance()
判断一个对象是否是Iterable
对象:
from collections import Iterableprint(isinstance([], Iterable))
*可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
可以使用isinstance()
判断一个对象是否是Iterator
对象:
from collections import Iteratorprint(isinstance((x for x in range(10)), Iterator))
- python入门(十三):生成器和迭代器
- python迭代器和生成器
- Python 迭代器和生成器
- Python 迭代器和生成器
- Python迭代器和生成器
- Python迭代器和生成器
- python迭代器和生成器
- Python迭代器和生成器
- python迭代器和生成器
- python 迭代器和生成器
- python 迭代器和生成器
- Python--迭代器和生成器
- python迭代器和生成器
- Python 迭代器和生成器
- python迭代器和生成器
- python--迭代器和生成器
- Python迭代器和生成器
- python迭代器和生成器
- 智能指针
- 英语学习引起的思考
- web前端开发-html 5基础之标题标签
- Windons 和 Alt 快捷键
- 各种字符编码方式详解及由来(ANSI,GB2312,GBK,UNICODE,UTF-8)
- python入门(十三):生成器和迭代器
- css解决数字字母自动换行
- Stack-----84. Largest Rectangle in Histogram
- <线段树系列3> codevs 1082 线段树练习3
- error LNK2001: 无法解析的外部符号 __imp__DeleteDC@4
- MySql中一次查询结果用作二次查询条件
- 【机器学习入门】公开课笔记:笔记简介
- ACM tarjan连通图 迷宫城堡
- linux进程通信IPC之IPC_PRIVATE与ftok比较