qiaoliang0302

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、迭代器

在原来的基础上,产生一个新的版本。

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):
            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)

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)
])

 

posted on 2019-07-24 20:22  qiaoliang0302  阅读(107)  评论(0编辑  收藏  举报