Python基础——生成器
Python基础——生成器
生成器
简单理解:生成器就是一个迭代器
生成器本身是一个函数,区别在于;
- 使用了 yield 的函数——生成器
- 函数的返回值是一个:迭代器
- 函数只能return一次,生成器可以return多次
- 在调用生成器(函数)的过程中,当遇到关键字 yield 暂停运行该函数,并保存当前所有的运行信息返回 yield的值,在下一次调用的时候,从当前位置继续运行。
自定义一个生成器
#定义一个生成器:带有yield关键字的函数
def func():
print('start')
a = yield 1#遇到yield关键字停止运行
print(a)
print('middle')
b = yield 2
print(b)
print('next')
c = yield 3
print(c)#***********
调用生成器
生成器本身是一个函数,所以调用方法不变
不同:
执行下面的语句并不会执行函数里边的方法体,而是返回一个迭代器对象
next()的时候才会执行函数里的方法
#调用迭代器函数
name = func()
迭代器<==>生成器
所以对 生成器的访问同迭代器用next()方法
此时的 name就是一个迭代器了,访问的方法同 迭代器,用:
next(迭代器名)
第一次访问:
print('----------第一次调用-------------')
print(next(obj))
第二次访问
print('----------第一次调用-------------')
print(next(obj))
print('----------第二次调用-------------')
print(next(obj))
a = yield 1 语句第一次已经执行完,第二次从 print(a)开始执行,所以此时的 a = None
第三次访问:
print('----------第一次调用-------------')
print(next(obj))
print('----------第二次调用-------------')
print(next(obj))
print('----------第三次调用-------------')
print(next(obj))
b = yield 2 语句第二次已经执行完,第三次从 print(a)开始执行,所以此时的 b = None
第三次next()之后,函数中的print©语句没有被执行
生成器的作用
生成器可以简单的理解成迭代器,所以
作用:省内存
比如从外部读取文件时,用一次,readlines()一次避免一次全部读取,从而节省内存。
生成器使用例子
生成器 + 读取文件
文件中的内容及格式
#定义一个函数
def txt_read(filename):
#打开文件
with open (filename,mode='r',encoding='utf-8') as fin
for line in fin:#遍历读取每一行数据
yield line
#调用生成器
reader = txt_read('test.txt')
print('-----------取第一次--------------')
print(next(reader))
print('-----------取第二次--------------')
print(next(reader))
遍历迭代器:
def txt_read(filename):
with open(filename,mode='r',encoding='utf-8') as fin:
for line in fin:
yield line.strip()
reader = txt_read('test.txt')
print('--------循环编列迭代器------------')
for line in reader:
print(line)