import time
from collections import Iterable
from collections import Iterator
classClassmate(object):def__init__(self):
self.names =list()defadd(self, name):
self.names.append(name)def__iter__(self):"""如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""return ClassIterator()classClassIterator(object):def__iter__(self):passdef__next__(self):return11
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")# print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable))# classmate_iterator = iter(classmate)# print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterator))# print(next(classmate_iterator))for name in classmate:print(name)
time.sleep(1)
2.自己选择一个可以迭代的对象02
import time
from collections import Iterable
from collections import Iterator
classClassmate(object):def__init__(self):
self.names =list()defadd(self, name):
self.names.append(name)def__iter__(self):"""如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""return ClassIterator(self)classClassIterator(object):def__init__(self, obj):
self.obj = obj
def__iter__(self):passdef__next__(self):return self.obj.names[0]
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")# print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable))# classmate_iterator = iter(classmate)# print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterator))# print(next(classmate_iterator))for name in classmate:print(name)
time.sleep(1)
3.自己选择一个可以迭代的对象03
import time
from collections import Iterable
from collections import Iterator
classClassmate(object):def__init__(self):
self.names =list()defadd(self, name):
self.names.append(name)def__iter__(self):"""如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""return ClassIterator(self)classClassIterator(object):def__init__(self, obj):
self.obj = obj
self.current_num =0def__iter__(self):passdef__next__(self):
ret = self.obj.names[self.current_num]
self.current_num +=1return ret
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")# print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable))# classmate_iterator = iter(classmate)# print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterator))# print(next(classmate_iterator))for name in classmate:print(name)
time.sleep(1)
4.自己选择一个可以迭代的对象04
import time
from collections import Iterable
from collections import Iterator
classClassmate(object):def__init__(self):
self.names =list()defadd(self, name):
self.names.append(name)def__iter__(self):"""如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""return ClassIterator(self)classClassIterator(object):def__init__(self, obj):
self.obj = obj
self.current_num =0def__iter__(self):passdef__next__(self):if self.current_num <len(self.obj.names):
ret = self.obj.names[self.current_num]
self.current_num +=1return ret
else:raise StopIteration
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")# print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable))# classmate_iterator = iter(classmate)# print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterator))# print(next(classmate_iterator))for name in classmate:print(name)
time.sleep(1)
5.自己选择一个可以迭代的对象05
import time
from collections import Iterable
from collections import Iterator
classClassmate(object):def__init__(self):
self.names =list()
self.current_num =0defadd(self, name):
self.names.append(name)def__iter__(self):"""如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""return self # 调用iter(xxobj)的时候 只要__iter__方法返回一个 迭代器即可,至于是自己 还是 别的对象都可以的, 但是要保证是一个迭代器(即实现了 __iter__ __next__方法)def__next__(self):if self.current_num <len(self.names):
ret = self.names[self.current_num]
self.current_num +=1return ret
else:raise StopIteration
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")# print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable))# classmate_iterator = iter(classmate)# print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterator))# print(next(classmate_iterator))for name in classmate:print(name)
time.sleep(1)
6.fibonacci01
nums =list()
a =0
b =1
i =0while i <10:
nums.append(a)
a, b = b, a+b
i +=1for num in nums:print(num)
7.fibonacci02迭代器
classFibonacci(object):def__init__(self, all_num):
self.all_num = all_num
self.current_num =0
self.a =0
self.b =1def__iter__(self):return self
def__next__(self):if self.current_num < self.all_num:
ret = self.a
self.a, self.b = self.b, self.a+self.b
self.current_num +=1return ret
else:raise StopIteration
fibo = Fibonacci(10)for num in fibo:print(num)
8.使用生成器完成feibonacci
defcreate_num(all_num):print("----1---")# a = 0# b = 1
a, b =0,1
current_num =0while current_num < all_num:print("----2---")# print(a)yield a # 如果一个函数中有yield语句,那么这个就不在是函数,而是一个生成器的模板print("----3---")
a, b = b, a+b
current_num +=1print("----4---")# 如果在调用create_num的时候,发现这个函数中有yield那么此时,不是调用函数,而是创建一个生成器对象
obj = create_num(10)
ret =next(obj)print(ret)
ret =next(obj)print(ret)
obj2 = create_num(2)
ret =next(obj2)print(ret)# for num in obj:# print(num)
9.生成器的研究
defcreate_num(all_num):print("----1---")# a = 0# b = 1
a, b =0,1
current_num =0while current_num < all_num:print("----2---")# print(a)yield a # 如果一个函数中有yield语句,那么这个就不在是函数,而是一个生成器的模板print("----3---")
a, b = b, a+b
current_num +=1print("----4---")# 如果在调用create_num的时候,发现这个函数中有yield那么此时,不是调用函数,而是创建一个生成器对象
obj = create_num(10)
obj2 = create_num(2)
ret =next(obj)print("obj:", ret)
ret =next(obj)print("obj:", ret)
ret =next(obj2)print("obj2:", ret)
ret =next(obj)print("obj:", ret)
ret =next(obj)print("obj:", ret)
ret =next(obj)print("obj:", ret)# for num in obj:# print(num)
ret =next(obj2)print("obj2:", ret)
ret =next(obj2)print("obj2:", ret)
10.通过异常判断生成器已经结束
defcreate_num(all_num):# a = 0# b = 1
a, b =0,1
current_num =0while current_num < all_num:# print(a)yield a # 如果一个函数中有yield语句,那么这个就不在是函数,而是一个生成器的模板
a, b = b, a+b
current_num +=1return"ok...."
obj2 = create_num(50)whileTrue:try:
ret =next(obj2)print(ret)except Exception as ret:print(ret.value)break
11.通过send来启动生成器
defcreate_num(all_num):
a, b =0,1
current_num =0while current_num < all_num:
ret =yield a
print(">>>ret>>>>", ret)
a, b = b, a+b
current_num +=1
obj = create_num(10)# obj.send(None) # send一般不会放到第一次启动生成器,如果非要这样做 那么传递None
ret =next(obj)print(ret)# send里面的数据会 传递给第5行,当做yield a的结果,然后ret保存这个结果,,, # send的结果是下一次调用yield时 yield后面的值
ret = obj.send("hahahha")print(ret)