1迭代器:
# 什么是迭代器:一个实现了iter方法和next方法的对象就叫迭代器
from collections import Iterable
#判断对象类型使用 isinstance() 函数
#such:
print(isinstance([3,4],Iterable)) #表示出列表可迭代
print(isinstance(3,Iterable)) #int不可迭代
class MyList(object):
'''重写list'''
def __init__(self): #初始化定义属性
self.iter = []
def add(self,par): #定义列表添加数值的新方法
self.iter.append(par)
def __iter__(self):
'''魔法方法:表示对象可迭代'''
myiter = MyIter(self.iter) #引入列表的迭代器
return myiter
class MyIter(object):
'''实现迭代器'''
def __init__(self,mylist): #初始化,定义属性
self.mylist = mylist
self.current_index = 0
def __iter__(self): #魔法方法:表示对象可迭代,返回值是他自己
return self
def __next__(self): #定义next后的状态变化,也是迭代器最重要的一步
if self.current_index < len(self.mylist): #self.current_index从0开始,当他小于列表长度时
self.current_index +=1 #self.current_index加1
return self.mylist[self.current_index-1] #返回self.current_index加1前的状态(这里就是加1前的值)
else: #当self.current_index大于列表长度
raise StopIteration # raise:主动抛出错误 再停止迭代 (next方法里一定不能忘记的,不然会出错使迭代不能停止)
def main():
mylist = MyList() #创建一个对象
for i in range(10):
print('写入的数为:',i)
mylist.add(i) #调用新方法将元素加到列表里
for j in mylist:
print('取出的值为:',j)
if __name__ == '__main__':
main()
通过上面代码,我们就完成了list的重写,这是我们自己定义的list,列表添加的方法就由append改成了add
2生成器:
# 生成器是一种特殊的迭代器
# 迭代器需要手动记录迭代位置
# 生成器使用yield
# 只要存在yield就是生成器
def feibonaqi(num):
'''实现了一个斐波那契数列的生成器'''
a = 0
b = 1
current_index = 0
print('1'*30)
while current_index < num:
a,b = b,(a+b) #斐波那契实现的计算方法
current_index += 1
yield (a,b) #最重要是yield
# yield 特点:
# 1程序遇到 "只要" 遇到yield会暂停,如果yield后面有值,返回结果之后再暂停!!!!!
# 2再次启动生成器,代码从yield之后开始执行
print('2'*30)
def main():
result = feibonaqi(5)
print(result)
# next表示进入下一步状态,直至遇见下一个yield被暂停
print(next(result))
print(next(result))
print(next(result))
print(next(result))
if __name__ == '__main__':
main()