一、迭代器
在原来的基础上,产生一个新的版本。
for temp in 100:
print(temp)
int不是一个可以迭代类型。
from collections import Iterable
判断是否迭代,只要判断是否是Iterable的一个子类即可。
用isinstance判断。
isinstance(a,A) 返回值是true,表示a对象是由A类创建出来的。例如:
isinstance([11,22,33],Iterable) 返回True。表示[11,22,33]可以迭代。
isinstance("abc",Iterable) 返回True。表示"abc"可以迭代。
isinstance(100,Iterable) 返回False。表示100不可迭代。
from collections import Iterable
class Classmate(object):
def __init__(self):
self.names = list()
def add(self,name):
self.names.append(name)
def __iter__(self):
"""如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""
return ClassIterator(self)
class ClassIterator(object): # 迭代器
def __init__(self,obj):
self.obj = obj
self.current_num = 0
def __iter__(self):
pass
def __next__(self):
if self.current_num < len(self.obj.names):
class Classmate(object):
def __init__(self):
self.names = list()
def add(self,name):
self.names.append(name)
def __iter__(self):
"""如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""
return ClassIterator(self)
class ClassIterator(object): # 迭代器
def __init__(self,obj):
self.obj = obj
self.current_num = 0
def __iter__(self):
pass
def __next__(self):
if self.current_num < len(self.obj.names):
ret = self.obj.names[self.current_num]
self.current_num+=1
return ret
else:
raise StopIteration
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")
print("判断classmate是否是可以迭代的对象:",isinstance(classmate,Iterable))
for name in classmate:
print(name)
self.current_num+=1
return ret
else:
raise StopIteration
classmate = Classmate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")
print("判断classmate是否是可以迭代的对象:",isinstance(classmate,Iterable))
for name in classmate:
print(name)
for temp in xxx_obj:
pass
1、判断xxxx_obj是否是可以迭代。
2、在第一步成立的前提下,调用iter函数得到xxxx_obj对象的__iter__方法的返回值。
3、__iter__方法的返回值是一个迭代器。
from collections import Iterable class Classmate(object): def __init__(self): self.names = list() self.current_num = 0 def add(self,name): self.names.append(name) def __iter__(self): """如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法""" return self def __next__(self): if self.current_num < len(self.names): ret = self.names[self.current_num] self.current_num+=1 return ret else: raise StopIteration classmate = Classmate() classmate.add("老王") classmate.add("王二") classmate.add("张三") print("判断classmate是否是可以迭代的对象:",isinstance(classmate,Iterable)) for name in classmate: print(name)
class Fibonacci(object): def __init__(self,num): self.a = 0 self.b = 1 self.num = num self.count = 0 def __iter__(self): return self def __next__(self): if self.count<self.num: ret = self.a self.a,self.b = self.b,self.a+self.b self.count+=1 return ret else: raise StopIteration fibo = Fibonacci(10) print("-----start-----") for num in fibo: print(num)
二、生成器
生成器是一种特殊的迭代器
第一种方法:
print([x for x in range(10)]) print((x for x in range(10))) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <generator object <genexpr> at 0x7f9911ec8dc0>
第二种方法:
def create_num(num): a,b = 0,1 i = 0 while i < num: #print(a) yield a # 1.停止运行 2.返回a值 a,b = b,a+b i += 1 ret = create_num(10) for num in ret: print(num) 0 1 1 2 3 5 8 13 21 34
def create_num(num): a,b = 0,1 i = 0 while i < num: #print(a) yield a # 1.停止运行 2.返回a值 a,b = b,a+b i += 1 ret = create_num(10) #for num in ret: # print(num) temp = next(ret) print(temp) temp = next(ret) print(temp) temp = next(ret) print(temp) temp = next(ret) print(temp) 0 1 1 2
def create_num(num): a,b = 0,1 i = 0 while i < num: #print(a) ret = yield a # 1.停止运行 2.返回a值 print("ret>>>",ret) a,b = b,a+b i += 1 ret = create_num(10) #for num in ret: # print(num) temp = next(ret) print(temp) temp = ret.send("hello") print(temp) 0 >>ret>>> hello 1
三、用生成器实现协程
import time def task_1(): while True: print("1") time.sleep(0.1) yield def task_2(): while True: print("2") time.sleep(0.1) yield def main(): while True: ret1 = task_1() ret2 = task_2() next(ret1) next(ret2) if __name__ == '__main__': main()
from greenlet import greenlet import time def task_1(): while True: print("1") time.sleep(0.1) gr2.switch() def task_2(): while True: print("2") time.sleep(0.1) gr1.switch() def main(): gr1 = greenlet(task_1) gr2 = greenlet(task_2 gr1.switch() if __name__ == '__main__': main()
import gevent def f1(n): for i in range(n): print(gevent.getcurrent(),i) gevent.sleep(0.5) def f2(n): for i in range(n): print(gevent.getcurrent(),i) gevent.sleep(0.5) def f3(n): for i in range(n): print(gevent.getcurrent(),i) gevent.sleep(0.5) g1 = gevent.spawn(f1,5) g2 = gevent.spawn(f2,5) g3 = gevent.spawn(f3,5) g1.join() g2.join() g3.join()
import gevent import time from gevent import monkey monkey.patch_all() #把所有的耗时操作换成gevent def f1(n): for i in range(n): print(gevent.getcurrent(),i) time.sleep(0.5) def f2(n): for i in range(n): print(gevent.getcurrent(),i) time.sleep(0.5) def f3(n): for i in range(n): print(gevent.getcurrent(),i) time.sleep(0.5) g1 = gevent.spawn(f1,5) g2 = gevent.spawn(f2,5) g3 = gevent.spawn(f3,5) g1.join() g2.join() g3.join()
import gevent import time from gevent import monkey monkey.patch_all() #把所有的耗时操作换成gevent def f1(n): for i in range(n): print(gevent.getcurrent(),i) time.sleep(0.5) def f2(n): for i in range(n): print(gevent.getcurrent(),i) time.sleep(0.5) def f3(n): for i in range(n): print(gevent.getcurrent(),i) time.sleep(0.5) gevent.joinall([ gevent.spawn(f1,5), gevent.spawn(f2,5), gevent.spawn(f3,5) ])