python入门(十三):生成器和迭代器
2017-08-13 20:57
411 查看
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 + 1 data = 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 Iterable print(isinstance([], Iterable))
*可以被
next()函数调用并不断返回下一个值的对象称为迭代器:
Iterator。
可以使用
isinstance()判断一个对象是否是
Iterator对象:
from collections import Iterator print(isinstance((x for x in range(10)), Iterator))
相关文章推荐
- 11-Python3从入门到实战—基础之生成器和迭代器
- Python3第3课-----编程入门(if、for,while、迭代器与生成器)
- Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
- python 迭代器 生成器
- Python中的迭代器iterator和yield生成器(constructor)
- python3 第十八章 - 迭代器与生成器
- Python可迭代对象,迭代器,生成器的区别
- python的迭代器与生成器实例详解(装载)
- Python迭代器和生成器介绍
- Python中生成器和迭代器的区别详解
- python中迭代器和生成器。
- Python 迭代器与生成器实例详解
- 初学Python——列表生成式、生成器和迭代器
- 举例讲解Python中的迭代器、生成器与列表解析用法
- Python的迭代器和生成器
- Python day5:列表生成式,生成器,迭代器
- python的迭代器和生成器
- Python 手记(一):生成器与迭代器
- Python学习总结-迭代器与生成器
- Python的迭代器和生成器