标签:函数调用 生成 generator 但我 list rom 类型 ons 为什么
生成器:generator
迭代器:Iterator
可迭代对象:Iterable
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
Iterator
对象表示的是一个数据流
满足两个条件:1.有iter方法
2.可以使用next方法
list
tuple
dict
string
generator(两种方式)
这些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。
>>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance(‘abc‘, Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False
>>> from collections import Iterator >>> isinstance((x for x in range(10)), Iterator) True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance(‘abc‘, Iterator) False
生成器都是Iterator
对象,但list
、dict
、str
虽然是Iterable
,却不是Iterator
。
你可能会问,为什么list
、dict
、str
等数据类型不是Iterator
?
这是因为Python的Iterator
对象表示的是一个数据流,Iterator对象可以被next()
函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration
错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()
函数实现按需计算下一个数据,所以Iterator
的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator
甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
1.调用可迭代休想的iter方法,返回一个迭代器对象
2.调用迭代器的next方法
3.处理stopinteration异常
标签:函数调用 生成 generator 但我 list rom 类型 ons 为什么
原文地址:http://www.cnblogs.com/xiaoyaz/p/7620568.html