python入门(13)
生成器
return和yield的区别
yield的特点:
程序在执行的时候遇到yield会暂停执行,如果yield后面有返回值,先把值返回再暂停
再次启动生成器获取数据的时候会从暂停的地方开始执行
Return只返回一次值,后面有代码不执行,yield可以多次返回值
send()
def fei(num):
a=0
b=1
current_index=0
while current_index<num:
# print(a)
par=yield a
print("参数为:",par)
a,b=b,a+b
current_index+=1
gen=fei(5)
next(gen)
gen.send("hello")
注意点:
第一次为send(None),一般用next()
可传入参数
迭代器
定义
迭代器只会向前,不能向后
class MyList(object):
'''这是自定的列表类'''
def __init__(self):
self.listnew=[]
def add_num(self,num):
self.listnew.append(num)
def __iter__(self):
return MyIterator(self)
class MyIterator(object):
'''这是自定义的迭代器类,将来用来返回的是一个迭代器对象'''
def __init__(self, list_obj):
self.mylist = list_obj
self.current_index = 0
def __iter__(self):
return self
def __next__(self):
'''
1、记录迭代的位置
2、记录返回访问的数据
'''
if self.current_index < len(self.mylist.listnew):
data = self.mylist.listnew[self.current_index]
self.current_index += 1
return data
else:
raise StopIteration
list1=MyList()
list1.add_num(10)
list1.add_num(100)
print(list1.listnew)
iter2=iter(list1)
try:
while True:
print(next(iter2))
except Exception as e:
pass