在懂得Python的数据构造时,容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(list,set,dict comprehension)浩瀚概念参杂在一路,不免让初学者一头雾水,我将用一篇文┞仿试图将这些概念以及它们之间的关系捋清跋扈。
容器(container)
容器比较轻易懂得,因为你就可以把它看作是一个盒子、一栋房子、一个柜子,琅绫擎可以塞任何器械。大年夜技巧角度来说,当它可以用来询问某个元素是否包含在个中时,那么这个对象就可以认为是一个容器,比如 list,set,tuples都是容器对象:
- >>> assert 1 in [1, 2, 3] # lists
- >>> assert 4 not in [1, 2, 3]
- >>> assert 1 in {1, 2, 3} # sets
- >>> assert 4 not in {1, 2, 3}
- >>> assert 1 in (1, 2, 3) # tuples
- >>> assert 4 not in (1, 2, 3)
询问某元素是否在dict顶用dict的中key:
- >>> d = {1: 'foo', 2: 'bar', 3: 'qux'}
- >>> assert 1 in d
- >>> assert 'foo' not in d # 'foo' 不是dict中的元素
询问某substring是否在string中:
- >>> s = 'foobar'
- >>> assert 'b' in s
- >>> assert 'x' not in s
- >>> assert 'foo' in s
尽管绝大年夜多半容器都供给了某种方法来获取个中的每一个元素,但这并不是容器本身供给的才能,而是可迭代对象付与了容器这种才能,当然并不是所有的容器都是可迭代的,比如:Bloom filter,固然Bloom filter可以用来检测某个元素是否包含在容器中,然则并不克不及安闲器中获取个中的每一个值,因为Bloom filter压根就没把元素存储在容器中,而是经由过程一个散列函数映射成一个值保存在数组中。
都可以用生成器函数来调换:
可迭代对象(iterable)
刚才说过,很多容器都是可迭代对象,此外还有更多的对象同样也是可迭代对象,比如处于打开状况的files,sockets等等。但凡是可以返回一个迭代器的对象都可称之为可迭代对象,听起来可能有点困惑,没紧要,先看一个例子: