# 0.本集概览

1.生成器可以避免一次性生成整个列表 2.生成器函数的运行过程解析及状态保存 3.生成器表达式的使用方法 4.生成器表达式的可迭代特性

# 2.生成器函数

## 2.1.运行过程分析

```def gen_squares(num):
for x in range(num):
yield x ** 2

G = gen_squares(5)
print(G)
print(iter(G))```

```<generator object gen_squares at 0x0000000002402558>
<generator object gen_squares at 0x0000000002402558>```

```def gen_squares(num):
for x in range(num):
yield x ** 2

G = gen_squares(3)
print(G)
print(iter(G))
print(next(G))
print(next(G))
print(next(G))
print(next(G))```

```<generator object gen_squares at 0x00000000021C2558>
<generator object gen_squares at 0x00000000021C2558>
0
1
4
Traceback (most recent call last):
File "E:/12homework/12homework.py", line 10, in <module>
print(next(G))
StopIteration```

```def gen_squares(num):
for x in range(num):
yield x ** 2

for i in gen_squares(5):
print(i, end=' ')```

`0 1 4 9 16`

## 2.2.状态保存

```def gen_squares(num):
for x in range(num):
yield x ** 2
print('x={}'.format(x))

for i in gen_squares(4):
print('x ** 2={}'.format(i))
print('--------------')```

```x ** 2=0
--------------
x=0
x ** 2=1
--------------
x=1
x ** 2=4
--------------
x=2
x ** 2=9
--------------
x=3```

# 3.生成器表达式

## 3.1.使用方法

```print([x ** 2 for x in range(5)])
print((x ** 2 for x in range(5)))```

```[0, 1, 4, 9, 16]
<generator object <genexpr> at 0x0000000002212558>```

## 3.2.适用于迭代环境

```for x in (x ** 2 for x in range(5)):
print(x, end=',')```

`0,1,4,9,16,`

`print(sum(x ** 2 for x in range(5)))`

`30`

`print(sorted((x ** 2 for x in range(5)), reverse=True))`

`[16, 9, 4, 1, 0]`

`print(list(x ** 2 for x in range(5)))`

`[0, 1, 4, 9, 16]`

## 3.3.集合解析式与生成器对象

```set(f(x) for x in S if P(x))
{f(x) for x in S if P(x)}

{key:val for (key, val) in zip(keys, vals)}
dict(zip(keys, vals))

{x:f(x) for x in items}
dict((x, f(x)) for x in items)```

0 条评论

• ### Python协程演进过程

Milestone 协程相关的关键字和方法的引入： Python 2.2（2001年）yield Python 2.5（2006年） .send() .thro...

• ### Python迭代器使用详解

这一集的内容看起来比较绕，反反复复出现的是迭代二字。大家注意，这一节的内容很pythonic，是很有特色也非常重要的知识点。敲黑板啦！

• ### 一文读懂Python可迭代对象、迭代器和生成器

序列可以迭代的原因：iter 函数。解释器需要迭代对象 x 时，会自动调用 iter(x)。内置的 iter 函数有以下作用：

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

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

• ### Python-生成器

通过列表生成式，我们可以直接创建一个列表。但是，受到内存限制，列表容量肯定是有限的。而且，创建一个包含100万个元素的列表，不仅占用很大的存储空间，如果我们仅仅...

• ### Python迭代器协议及for循环工作机制详解

1、迭代器协议是指：对象必须提供一个next方法，执行该方法要么返回迭代中的下一项，要么就引起一个stopiteration异常，已终止迭代（只能往后走不能往前...

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

第二，本次迭代的要依赖上一次的结果继续往下做，如果中途有任何停顿，都不能算是迭代。

• ### python3--迭代器，生成器

现在是从结果分析原因，能被for循环的就是"可迭代的"，但是如果按常规想，for怎么知道谁是可迭代的呢？

• ### itertools模块详解

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

• ### python迭代器(函数名的应用,新版格

s1 = 'asdf' obj = iter(s1) #转化为迭代器 print(obj)#<str_iterator object at 0x000002...