容器(container)
容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in
, not in
关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(特殊情况除外,比如迭代器和生成器对象)在Python中,常见的容器对象有:
- list, deque, ....
- set, frozensets, ....
- dict, defaultdict, OrderedDict, Counter, ....
- tuple, namedtuple, …
- str
容器比较容易理解,因为你就可以把它看作是一个盒子、一栋房子、一个柜子,里面可以塞任何东西。从技术角度来说,当它可以用来询问某个元素是否包含在其中时,那么这个对象就可以认为是一个容器,比如 list,set,tuples都是容器对象:
1 1 in [1, 2, 3] # lists 2 4 not in [1, 2, 3] 3 1 in {1, 2, 3} # sets 4 4 not in {1, 2, 3} 5 1 in (1, 2, 3) # tuples 6 4 not in (1, 2, 3)
判断元素的key是否存在
1 d = {1: 'foo', 2: 'bar', 3: 'qux'} 2 print('foo' in d) #False 3 print(1 in d) #True
判断一个字符串是否在另一个字符串中
1 s = 'foobar' 2 print('ob' in s) #True
尽管绝大多数容器都提供了某种方式来获取其中的每一个元素,但这并不是容器本身提供的能力,而是可迭代对象赋予了容器这种能力
可迭代对象(iterable)
很多容器都是可迭代对象,此外还有很多的对象同样也是可迭代对象,比如处于打开状态的files
可以返回一个迭代器对象的都可称之为可迭代对象
1 x = [1, 2, 3] 2 y = iter(x) 3 z = iter(x) 4 next(y) #1 5 next(y) #2 6 next(z) #1 7 type(x) #<class 'list'> 8 type(y) #<class 'list_iterator'>
这里x是可迭代对象,y、z是两个独立的迭代器
迭代器
迭代器是一个带状态的对象,从第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
只有在调用时才会生成相应数据
只记录当前位置
只有一个next()方法
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
本文转自:https://foofish.net/iterators-vs-generators.html