# Iterables vs. Iterables vs. Generators

• 容器(container)
• 可迭代对象(Iterable)
• 迭代器(Iterator)
• 生成器(generator)
• 生成器表达式
• {list, set, dict} 解析式

### 容器（container)

• list， deque, ...
• set，frozesets，...
• dict, defaultdict, OrderedDict, Counter, ...
• tuple, namedtuple, ...
• str

```>>> 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 (12,3)        # tuples
>>> assert 4 not in (1,2,3) ```

```>>> d = {1:"foo", 2:"bar", 3:"qux"}
>>> assert 1 in d
>>> assert 4 not in d
>>> assert "foo" not in d  ```

```>>> s ="foobar"
>>> assert "b" in s
>>> assert "x" not in s
>>> assert "foo" in s```

### 可迭代对象

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

```x = [1,2,3]
for elem in x:
...```

```>>> import dis
>>> x = [1, 2, 3]
>>> dis.dis('for _ in x: pass')
1     0 SETUP_LOOP                     14 (to 17)
6 GET_ITER
>> 7 FOR_ITER                            6 (to 16)
10 STORE_NAME                    1 (_)
13 JUMP_ABSOLUTE               7
>> 16 POP_BLOCK
20 RETURN_VALUE```

### 迭代器(Iterators)

```>>> from itertools import count
>>> counter = count(start=13)
>>> next(counter)
13
>>> next（counter)
14```

```>>> from itertools import cycle
>>> colors = cycle(["red","white","blue"])
>>> next(colors)
"red"
>>> next(colors）
"white"
>>> next(colors)
"blue"
>>> next(colors)
"red"```

```>>> from itertools import islice
>>> colors = cycle(['red', 'white', 'blue'])               # infinite
>>> limited = islice(colors, 0, 4)                          # finite
>>> for x in limited:                                            # so safe to use for-loop on
...            print(x)
red
white
blue
red```

```>>> class fib:
...             def __init__(self):
...                   self.prev = 0
...                   self.curr = 1
...
...             def __iter__(self):
...                   return self
...
...             def __next__(self):
...                   value = self.curr
...                   self.curr += self.prev
...                   self.prev = value
...                   return value
...
>>> f = fib()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]```

1. 修改状态，以便下次调用`next()`方法
2. 计算当前调用的结果

### 生成器

• 任意生成器都是迭代器（反过来不成立）
• 任意生成器，都是一个可以延迟创建值的工厂

```>>> def fib():
...            prev, curr = 0, 1
...            while True:
...                     yield curr
...                     prev, curr = curr, prev + curr
...
>>> f = fib()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]```

`yield`

### 生成器的类型

```>>> numbers = [1, 2, 3, 4, 5, 6]
>>> [x * x for x in numbers]
[1, 4, 9, 16, 25, 36]```

`>>> {x * x for x in numbers}{1, 4, 36, 9, 16, 25}`

```>>> {x: x * x for x in numbers}
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36}```

```>>> lazy_squares = (x * x for x in numbers)
>>> lazy_squares
<generator object <genexpr> at 0x10d1f5510>
>>> next(lazy_squares)
1
>>> list(lazy_squares)
[4, 9, 16, 25, 36]```

### 总结

```def something():
result = []
for ... in ...:
result.append(x)
return result```

```def iter_something():
for ... in ...:
yield x```

0 条评论

• ### itertools模块详解

tee()创建的迭代器共享其输入迭代器，所以一旦创建了新迭代器，就不应该再使用远迭代器。

• ### 使用doctest进行测试

python中的doctest可以运行文档中嵌入的例子，并验证它们能否生成所期望的结果，从而对源代码进行测试。

• ### Python 3 之 生成器详解

------ 生成器 ------------------------------------------------------------------

• ### Python 迭代器和生成器

来源：田小计划 www.cnblogs.com/wilber2013/p/4652531.html 在Python中，很多对象都是可以通过for语句来直接遍历的...

• ### Python 迭代器、生成器和列表解析

迭代器在 Python 2.2 版本中被加入, 它为类序列对象提供了一个类序列的接口。 Python 的迭代无缝地支持序列对象, 而且它还允许迭代非序列类型, ...

• ### 你知道你的微信好友可视化后是什么样子吗？

数据分析和可视化是一个比较有意思的方向，可做的点有很多。最近看到一篇文章是玩了玩把自己的微信好友信息进行了可视化，结合了 pyecharts 和 wxpy 这两...

• ### pyecharts可视化和微信的结合

最近在研究 pyecharts 的用法，它是 python 的一个可视化工具，然后就想着结合微信来一起玩

• ### 新版微信QQ半透明主题，这才是我喜欢的

这几天科技圈还是挺多大事的，“微信之夜”，柚子看了一下，“微信之父”张小龙讲述了微信8年发展中的心路历程，对用户关心的问题进行了解答。