非常教程

Python 3 教程教程

Python3 迭代器与生成器

Python3 迭代器与生成器

Python3 迭代器与生成器


迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter()next()

字符串,列表或元组对象都可用于创建迭代器:

实例(Python 3.0+)

>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>

迭代器对象可以使用常规for语句进行遍历:

实例(Python 3.0+)

#!/usr/bin/python3 list=[1,2,3,4] it = iter(list) # 创建迭代器对象 for x in it: print (x, end=" ")

执行以上程序,输出结果如下:

1 2 3 4

也可以使用 next() 函数:

实例(Python 3.0+)

#!/usr/bin/python3 import sys # 引入 sys 模块 list=[1,2,3,4] it = iter(list) # 创建迭代器对象 while True: try: print (next(it)) except StopIteration: sys.exit()

执行以上程序,输出结果如下:

1
2
3
4

创建一个迭代器

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。

如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。

更多内容查阅:Python3 面向对象

__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。

创建一个返回数字的迭代器,初始值为 1,逐步递增 1:

实例(Python 3.0+)

class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): x = self.a self.a += 1 return x myclass = MyNumbers() myiter = iter(myclass) print(next(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter))

执行输出结果为:

1
2
3
4
5

StopIteration

StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

在 20 次迭代后停止执行:

实例(Python 3.0+)

class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): if self.a <= 20: x = self.a self.a += 1 return x else: raise StopIteration myclass = MyNumbers() myiter = iter(myclass) for x in myiter: print(x)

执行输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

以下实例使用 yield 实现斐波那契数列:

实例(Python 3.0+)

#!/usr/bin/python3 import sys def fibonacci(n): # 生成器函数 - 斐波那契 a, b, counter = 0, 1, 0 while True: if (counter > n): return yield a a, b = b, a + b counter += 1 f = fibonacci(10) # f 是一个迭代器,由生成器返回生成 while True: try: print (next(f), end=" ") except StopIteration: sys.exit()

执行以上程序,输出结果如下:

0 1 1 2 3 5 8 13 21 34 55
Python3 迭代器与生成器
Python 3 教程

Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下兼容。

Python 3 教程目录

1.Python3 函数
2.Python3 编程第一步
3.Python3 列表
4.Python3 字符串
5.Python3 数字(Number)
6.Python3 注释
7.Python3 解释器
8.Python3 模块
9.Python3 数据结构
10.Python3 标准库概览
11.Python3 基础语法
12.Python 随机数生成
13.Python 计算三角形的面积
14.Python 二次方程
15.Python 平方根
16.Python 数字求和
17.Python Hello World 实例
18.Python3 实例
19.Python 九九乘法表
20.Python 阶乘实例
21.Python 质数判断
22.Python 获取最大值函数
23.Python 判断闰年
24.Python 判断奇数偶数
25.Python 判断字符串是否为数字
26.Python if 语句
27.Python 交换变量
28.Python 摄氏温度转华氏温度
29.Python 文件 IO
30.Python 使用递归斐波那契数列
31.Python 生成日历
32.Python 简单计算器实现
33.Python 最小公倍数算法
34.Python 最大公约数算法
35.Python ASCII码与字符相互转换
36.Python 十进制转二进制、八进制、十六进制
37.Python 阿姆斯特朗数
38.Python 斐波那契数列
39.Python list 常用操作
40.Python 获取昨天日期
41.Python 计算每个月天数
42.Python 字符串大小写转换
43.Python 字符串判断
44.Python3 ceil() 函数
45.Python3 abs() 函数
46.Python3 运算符
47.Python3 命令行参数
48.Python3 round() 函数
49.Python3 pow() 函数
50.Python3 modf() 函数
51.Python3 min() 函数
52.Python3 max() 函数
53.Python3 log10() 函数
54.Python3 log() 函数
55.Python3 floor() 函数
56.Python3 fabs() 函数
57.Python3 exp() 函数
58.Python3 atan() 函数
59.Python3 asin() 函数
60.Python3 acos() 函数
61.Python3 uniform() 函数
62.Python3 shuffle() 函数
63.Python3 seed() 函数
64.Python3 random() 函数
65.Python3 randrange() 函数
66.Python3 choice() 函数
67.Python3 sqrt() 函数
68.Python3 count()方法
69.Python3 center()方法
70.Python3 capitalize()方法
71.Python3 radians() 函数
72.Python3 degrees() 函数
73.Python3 tan() 函数
74.Python3 sin() 函数
75.Python3 hypot() 函数
76.Python3 cos() 函数
77.Python3 atan2() 函数
78.Python3 islower()方法
79.Python3 isdigit()方法
80.Python3 isalpha()方法
81.Python3 isalnum()方法
82.Python3 index()方法
83.Python3 find()方法
84.Python3 expandtabs()方法
85.Python3 endswith()方法
86.Python3 encode()方法
87.Python3 bytes.decode()方法
88.Python3 maketrans()方法
89.Python3 lstrip()方法
90.Python3 lower()方法
91.Python3 len()方法
92.Python3 ljust()方法
93.Python3 join()方法
94.Python3 isupper()方法
95.Python3 istitle()方法
96.Python3 isspace()方法
97.Python3 isnumeric()方法
98.Python3 startswith()方法
99.Python3 splitlines()方法
100.Python3 split() 方法