一. 迭代器
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
(1)迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
(2)迭代器可以记住遍历的位置的对象,并且只能往前不会后退。
(3)其两个基本的方法:iter() 创建迭代器对象和 next() 输出迭代器的下一个元素。
(4)字符串,列表或元组对象都可用于创建迭代器。
1.使用列表对象来创建迭代器
list=[1,2,3,4]
it = iter(list) ## 创建迭代器对象
for x in it: ## 通过for循环来遍历迭代器对象中的每个元素
print (x)
## 也可以使用 next() 函数输出下一个元素
list=[1,2,3,4]
it = iter(list) ## 创建迭代器对象
while True:
print (next(it)) ## 每次循环都会获取迭代器对象中的下一个元素
2.创建一个自定义迭代器
主要是创建一个类作为一个迭代器,然后需要在这个类中实现两个方法 iter() 与 next() 。
class MyNumbersIter:
## 构造函数,定义一个迭代的数字
def __init__(self, numbers):
self.numbers = numbers
## 用于创建迭代器对象的函数
def __iter__(self):
self.a = 1
return self
## 用于输出迭代器的下一个元素,并设置在完成指定循环次数后触发 StopIteration 异常来结束迭代
def __next__(self):
if self.a <= self.numbers:
x = self.a
self.a += 1
return x
else:
raise StopIteration
## 先创建一个自定义的迭代器类的对象
myclass = MyNumbersIter(5)
## 再通过自定义的迭代器类的对象调用iter()方法来创建迭代器对象
myiter = iter(myclass)
## 最后遍历迭代对象中的每个元素
for x in myiter:
print(x)
二. 生成器
生成器其实是一个返回迭代器的函数,该函数中使用了 yield,在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
(1)生成器函数
- 调用生成器函数的时候不会立即执行代码,而是返回了一个迭代器对象;
- 调用next()方法开始执行函数,遇到yield会暂停执行;
- 再次调用next()方法会从上次暂停的地方继续执行,直至遇到 yield 再次暂停,如果没有 yield ,则抛出异常。
def generator():
print("first")
yield 1
print("second")
yield 2
print("third")
yield 3
## 调用生成器函数
g = generator() ## 函数没有立即执行,而是返回了一个迭代器
print(g) ## <generator object generator at 0x0000014EA9506440>
## 当调用next()方法时才开始执行函数,当遇到yield时便会暂停执行
print(next(g))
first
1
## 继续调用next()方法,会从上一次暂停的地方开始执行,当再次遇到yield时还会暂停执行
print(next(g))
second
2
(2)生成器表达式
与列表推导式的定义类似,生成器表达式使用 () 而列表推导式使用[]
1.生成器表达式
print((x for x in range(10))) ## <generator object <genexpr> at 0x000001DE2C8E8040>
2.列表推导式
print([x for x in range(10)]) ## [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]