生成器的概念
生成器是一种特殊的迭代器。以 yield 关键字标识返回值的函数就是一个生成器
引申:迭代器概念:Python中一个实现_iter_方法和_next_方法的类对象,就是迭代器。
生成器和迭代器的区别:
a、语法上:
生成器是通过函数的形式中调用 yield 或()的形式创建的。
迭代器可以通过 iter() 内置函数创建。
b、用法上:
生成器在调用next()函数或for循环中,所有过程被执行,且返回值。
迭代器在调用next()函数或for循环中,所有值被返回,没有其他过程或动作。
在使用中最好使用生成器,优点:本质上是动态生成迭代的值,使用完直接丢弃,可以有效节省内存空间,但这些值只能被迭代一次。生成器是一种惰性的序列,如果我们需要创建一个 0~xxxxxxxxx 的序列,这样大的序列创建出来会占用内存,生成器就解决这样的问题
生成器的使用
# 创建生成器函数
def hello():
print('step 1')
yield 1
print('step 2')
yield 2
print('step 3')
yield 3
# 得到生成器对象
q = hello()
res = next(q)
print(res)
#可以循环获取生成器中的值
for res in q:
print(res)
# 如果生成器值被调用完了,还去获取就会失败。
# next(q) #报错 StopIteration
使用生成器代替迭代器
迭代器概念:Python中一个实现_iter_方法和_next_方法的类对象,就是迭代器。
生成器是一种特殊的迭代器。以 yield 关键字标识返回值的函数就是一个生成器
# 迭代器例子
class Square:
def __init__(self,count) -> None:
self.count = count
self.current = 0
def __iter__(self):
return self
def __next__(self):
result = self.current ** 2
self.current += 1
if self.current > self.count:
raise StopIteration
return result
square = iter(Square(3))
print(next(square)) # 0
print(next(square)) # 1
print(next(square)) # 4
# print(next(square)) # 报错 StopIteration
## 使用生成器替代迭代器
def Square1(count):
for i in range(count):
yield i ** 2
square1 = Square1(3)
for i in square1:
print(i) # 0 1 4
迭代、迭代器、可迭代对象
迭代:当创建的对象可以被一个接一个读取里面的值,叫迭代。
列表、元组、字典、字符串都是可迭代对象。数字、布尔值是不可迭代的对象。
迭代器协议:对象需要提供next()方法,通过它返回迭代中的下一项,直到返回终止抛出StopIteration异常。
可迭代对象:实现了迭代器协议对象。list、tuple、dict都是可迭代对象(Iterable),但不是迭代器对象(Iterator)。
需要使用内建函数iter(),把这些都变成可迭代器对象(Iterable)。
for item in Iterable:循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法,
来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。