生成器与迭代器

容器(container)

容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用innot 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

原文地址:https://www.cnblogs.com/gaowy/p/9732857.html