第八章 迭代器和生成器
2019-04-01 本文已影响0人
帅气的Lucky
迭代器和生成器
可迭代对象:可以直接作用于for循环的对象统称为可迭代对象(Iterable)。可以用isinstance()去判断一个对象是否是Iterable对象
可以直接作用于for的数据类型一般分两种
1、集合数据类型,如list、tuple、dict、set、string
2、是generator,包括生成器和带yield的generator function
迭代器:不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后跑出一StopIteration错误表示无法继续返回下一个值
迭代器:
- 迭代是Python最强大的功能之一,是访问集合元素的一种方式。。
- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
- 迭代器有两个基本的方法:iter() 和 next()。
可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator对象)
可以使用isinstance()函数判断一个对象是否是Iterator对象
使用 iter函数 变成Iterator对象
a = iter([1,2,3,4,5])
print(next(a))
引入方法判断是否为 Iterable 可迭代对象
from collections import Iterable
from collections import Iterator
from collections import Iterable
from collections import Iterator
print(isinstance([], Iterable))
print(isinstance((), Iterable))
print(isinstance({}, Iterable))
print(isinstance("", Iterable))
print(isinstance((x for x in range(10)), Iterable))
print(isinstance(1, Iterable))
print(isinstance([], Iterator))
print(isinstance((), Iteratorc
print(isinstance({}, Iterator))
print(isinstance("", Iterator))
print(isinstance((x for x in range(10)), Iterator))
生成器:
使用了yield的函数称为生成器
生成器也实现了迭代器的功能
使用列表生成式 mygener = (x for x in range(1000))#用一个生产一个并不是像生成列表一样都生成完 节约内存
print(type(x **for **x **in **range(10)))
调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。
例子:
#普通列表 消耗资源
mylist = [x for x in range(100000)]
for i in mylist:
print(i)
#对比执行效率
#生成器 节省资源
mylist = (x for x in range(100000))
for i in mylist:
print(i)
在函数里使用 yield 来配合next来使用的
- yield
- Next()
使用yield关键字修饰的值 下面的代码不会再执行 只有再次调用next函数的时候 会再次执行
#没有生成器的go方法 调用的时候一口气都跑完 消耗资源
def go():
print(1)
print(2)
print(3)
#有生成的函数 可以实现 next一次 走一次
def go():
print(1)
yield 10 #执行print1,返回10,next
print(2)
yield 20#执行print2,返回20,next
print(3)
yield 30#执行print3,返回30,next
def createlist():
for i in range(100):
print(i)
yield i
X=createlist()
print(type(X))
next(X)
next(X)
next(X)
next(X)