# 0.本集概览

1.生成器可以避免一次性生成整个列表

2.生成器函数的运行过程解析及状态保存

3.生成器表达式的使用方法

4.生成器表达式的可迭代特性

# 2.生成器函数

## 2.1.运行过程分析

1. def gen_squares(num):

2.     for x in range(num):

3.         yield x ** 2

4. G = gen_squares(5)

5. print(G)

6. print(iter(G))

1. <generator object gen_squares at 0x0000000002402558>

2. <generator object gen_squares at 0x0000000002402558>

1. def gen_squares(num):

2.     for x in range(num):

3.         yield x ** 2

4. G = gen_squares(3)

5. print(G)

6. print(iter(G))

7. print(next(G))

8. print(next(G))

9. print(next(G))

10. print(next(G))

1. <generator object gen_squares at 0x00000000021C2558>

2. <generator object gen_squares at 0x00000000021C2558>

3. 0

4. 1

5. 4

6. Traceback (most recent call last):

7.  File "E:/12homework/12homework.py", line 10, in <module>

8. print(next(G))

9. StopIteration

1. def gen_squares(num):

2.     for x in range(num):

3.         yield x ** 2

4. for i in gen_squares(5):

5.     print(i, end=' ')

1. 0 1 4 9 16

## 2.2.状态保存

1. def gen_squares(num):

2.     for x in range(num):

3.         yield x ** 2

4.         print('x={}'.format(x))

5. for i in gen_squares(4):

6.     print('x ** 2={}'.format(i))

7.     print('--------------')

1. x ** 2=0

2. --------------

3. x=0

4. x ** 2=1

5. --------------

6. x=1

7. x ** 2=4

8. --------------

9. x=2

10. x ** 2=9

11. --------------

12. x=3

# 3.生成器表达式

## 3.1.使用方法

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

2. print((x ** 2 for x in range(5)))

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

2. <generator object <genexpr> at 0x0000000002212558>

## 3.2.适用于迭代环境

1. for x in (x ** 2 for x in range(5)):

2.     print(x, end=',')

1. 0,1,4,9,16,

1. print(sum(x ** 2 for x in range(5)))

1. 30

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

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

1. print(list(x ** 2 for x in range(5)))

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

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

1. set(f(x) for x in S if P(x))

2. {f(x) for x in S if P(x)}

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

4. dict(zip(keys, vals))

5. {x:f(x) for x in items}

6. dict((x, f(x)) for x in items)

Python中文社区作为一个去中心化的全球技术社区，以成为全球20万Python中文开发者的精神部落为愿景，目前覆盖各大主流媒体和协作平台，与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系，拥有来自十多个国家和地区数万名登记会员，会员来自以公安部、工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司，全平台近20万开发者关注。

▼ 点击下方阅读原文免费成为社区会员