生成器:(一边循环一边计算)
学习地址:https://www.cnblogs.com/wj-1314/p/8490822.html
目的:不必创建完整list,节省内存
理解:
- 一个函数中只要存在yield就代表不是一个普通函数,而是一个生成器
- 函数每次运行到yield后就会停止运行,等下次再调用时再继续执行yield之后的语句,再循环执行到yield后又停止()
- 当生成器中有返回值语句return时,直接不能拿到返回值,需要捕获StopIteration错误,返回值包含在StopIteration的value中
try:
pass
except StopIteration as e:
print("生成器返回值:",e.value)
迭代器(Iterator),可迭代对象(Iterable),生成器(generator):
- 可迭代对象:直接作用于for 循环的对象(一种是如list的集合数据类型,一类是generator,包括生成表达式和带yield的函数)
- 迭代器:可以被next()函数调用并不断返回下一个值的对象
- 生成器:不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,生成器是迭代器的一种
- iter()函数可以使可迭代对象变成迭代器
注:文件是可迭代对象,也是迭代器
yield: - 一个函数中只要存在yield就代表不是一个普通函数,而是一个生成器,可用于迭代。该函数可用于某个函数的参数,只要这个函数的参数也允许迭代参数。
- yield是一个类似return 的关键字,每次运行到yield后返回yield后买你的值并且停止运行,等下次再迭代时再继续执行yield之后的语句,再循环执行到yield后又停止
3.send()和next()的区别就在于send可传递参数给yield表达式,这时候传递的参数就会作为yield表达式的值
迭代器:
iter(a) :参数a是一个可迭代对象,把一个可迭代对象转化成一个迭代器
可迭代对象iterable:对象包含_ _ getitem_ _ ,_ _ iter _ _
迭代器interator:对象包含_ _ next _ _,,迭代器可以使用next()方法取数
def _ _ iter _ _(self):
return self #固定写法
_ _ next _ _:一个变量村粗数据,另一个变量存储索引
class Test():
#一般的类里没有__iter__和__next__方法,如果定义类的时候加上了这两个方法,则标识这个类的对象就变成了一个迭代器
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
"""
# 这里固定这样写就行
"""
return self
def __next__(self):
"""
# 一个变量存储数据,另一个变量存储索引。
"""
try:
item = self.data[self.index]
self.index += 1
return item
except IndexError:
raise StopIteration
test = Test(['a', 'b', 'c', 'd'])
#方式一:使用for遍历
for i in test:
print(i)
#方式二:使用__next__()方法,每调用一次循环一次
print(test.__next__())
#方式二:使用next()方法,每调用一次循环一次
print(next(test))
生成器:
生成器表达式,生成器函数
通过一个代码块来生成数据,节省内存
yield理解:暂存,每次调用时,循环只执行一次,
class Generator(object):
#使用yield来标识这是一个生成器
def __init__(self, count, price):
self.count = count
self.price = price
def test(self):
for i in range(self.count):
yield (i + 1) * self.price
if __name__ == '__main__':
cart = Generator(5, 0.8)
good = cart.test()
print(good.__next__()) #使用内置方法__next__()调用
for g in good: #使用for遍历
print(g)
生成器练习:
def check_file(filename):
with open(filename,encoding='utf-8') as f: #句柄 : handler,文件操作符,文件句柄
for i in f:
yield '***'+i
for i in check_file('test.txt'):
print(i.strip())
#打印结果:
***aaa
***bbbbb
***cccccc
***
***dddddd
***cccc