Python容器、迭代器、生成器

来源:互联网 发布:刷机精灵 微信数据恢复 编辑:程序博客网 时间:2024/06/06 22:34

容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(list,set,dict comprehension)的关系图:

relations

容器(container)

容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用 in , not in 关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特列并不是所有的元素都放在内存)在Python中,常见的容器对象有:
list, deque, ....
set, frozensets, ....
dict, defaultdict, OrderedDict, Counter, ....
tuple, namedtuple, …
str

实例:

>>> i=1>>> i in [1,2,3]True


可迭代对象(iterable)

很多容器都是可迭代对象,此外还有更多的对象同样也是可迭代对象,比如处于打开状态的files,sockets等等。但凡可以返回一个 迭代器的对象都可称之为可迭代对象.

实例:

>>> x=[1,2,3,4,5]>>> y=iter(x)>>> z=iter(y)>>> type(y)<class 'list_iterator'>>>> type(z)<class 'list_iterator'>>>> next(y)1>>> next(y)2>>> next(y)3>>> next(y)4>>> next(y)5


迭代器
它是一个带状态的对象,他能在你调用 next() 方法的时候返回容器中的下一个值,任何实现了 __next__() (python2中实现 next() )方法的对象都是迭代器
实例:

>>> import itertools>>> from itertools import count>>> data=count(start=1,step=2)>>> next(data)1>>> next(data)3>>> next(data)5

序列:字符串、列表、元组
序列跟迭代器不一样,序列对象没有next()方法


生成器(generator)
生成器算得上是Python语言中最吸引人的特性之一,生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。
它不需要再像上面的类一样写 __iter__() 和 __next__() 方法了,只需要一个 yiled 关键字。 因此任何生成器也是以一种懒加载的模式生成值。,因此任何生成器也是以一种懒加载的模式生成值。生成器是迭代器,但是迭代器不一定是生成器,因为生成器是有状态的。
>>> def Generator_(l):     n = 0      size = len(l)     while n < size:         yield l[n]            n += 1>>> ge = Generator_([1, 2, 3])>>> for g in ge:print("generator:" + str(g))


生成器表达式
举例:a=(x*x for x in range(10))