python 多任务-协程(十五-1)

协程:多任务
使用:简单
原理:  过程 - 复杂

内容:1、迭代对象   2、迭代器  3、生成器  4、yield  5、greenlet  6、gevent协程

一、迭代对象

(1.1) 迭代: 迭代版本(在原来的版本之上添加功能)
        for迭代数据(1,2,3)在原来的状态之下,添加新的功能。
#for循环
#(1) 列表
for i in [11,22,33]:
    print(i)

# (2) 整型1234
for i in 1234:
    print(i)
# 发生异常: TypeError: 'int' object is not iterable
# 因为for循环放的是int整型,不是可迭代对象。
# 必须是可迭代对象,才不发生异常哦!

 (2.2) 使用这两种方式检验是否是可迭代对象

    1、使用for循环可以检查是否是一个可迭代对象
    2、导包 from collections.abc  import Iterable 
       使用 isinstance() 判断一个对象是否是 Iterable 对象

如果导包from collections import Iterable ,运行时发生异常:

   解决必须导入from collections.abc import Iterable  

 from collections.abc import  Iterable
#这个方法参数1:校验的数据,参数2:类型判断,返回类型True就是迭代对象,否则返回False
res_0=isinstance([100,200,300],Iterable)
res_0=isinstance(10022,Iterable)
print(res_0)

   说明:被for循环迭代取值的类型 range,list, str, dict,tup...

 (2.3)自定义可迭代对象

class Model:
    def __init__(self):
        '''创建对象-初始化对象'''
        self.list_0=[]

    def add(self,uname):
        '''调用方法,添加数据'''
        self.list_0.append(uname)

#实例化对象
model=Model()
model.add('mike')
model.add('john')
model.add('stad')
model.add('bbob')
# (1)可以使用for循环检查
for i in model:
    print(i)

说明:发生异常TypeError: 'Model' object is not iterable ;对象不是迭代对象

 可以使用isinstance检查,参数(具体对象,Iterable类)

# (2)可以isinstance检查
res_1=isinstance(model,Iterable)
print(res_1)
总之,这样实例化一个对象并不能让他称为可迭代对象!

(2.4)如何创建可迭代对象?

              python里面,类里面只需要满足一个条件,即可成为可迭代对象.  拥有此方法__iter__即可。

     

#自定义可迭代对象
class Model:
    def __init__(self):
        '''创建对象-初始化对象'''
        self.list_0=[]

    def add(self,uname):
        '''调用方法,添加数据'''
        self.list_0.append(uname)

    def __iter__(self):
         '''魔术方法,可迭代对象条件'''
         pass

#实例化对象
model=Model()
model.add('mike')
model.add('john')
model.add('stad')
model.add('bbob')

#(1)可以使用for循环检查
for i in model:
    print(i)

说明:发生异常:TypeError: iter() returned non-iterator of type 'NoneType'   意味着已经成为了一个可迭代对象

           如果想要一个对象变成可迭代对象,那么首先起码拥有__iter__方法;

  (2.5) for循环是怎么迭代取值 可迭代对象的.

         迭代器对象满足条件?

          (1) 可迭代对象: 拥有 __iter__

          (2) 迭代器对象: 拥有 __iter__, 拥有一个__next__

class Model:
    def __init__(self):
        '''创建对象-初始化对象'''
        self.list_0=[]

    def add(self,uname):
        '''调用方法,添加数据'''
        self.list_0.append(uname)

    def __iter__(self):
         '''魔术方法,可迭代对象条件'''
         # 得返回一个迭代器对象
         # self代表可迭代对象本身, 把可迭代对象当做参数传到了迭代器对象里面
         return ModelIter(self)

# 迭代器对象的类模板
class ModelIter(object):
    #初始化参数,并计数,把可迭代参数传入哦
    def __init__(self,obj):
        self.num_=0
        #对象列表=>可迭代对象
        self.obj=obj

    def __iter__(self):
        pass
    #处理for循环取值
    def __next__(self):
        #列表长度是多少,那么方法就会调用几次
        if self.num_<len(self.obj.list_0):
            # 调用次数小于列表长度就返回数据
            name=self.obj.list_0[self.num_]
            #索引自增
            self.num_+=1
            #休眠2秒
            time.sleep(.2)
            #返回数据
            return name
        else:
           raise StopIteration  # 一旦超出索引,,让next方法的调用停止
#实例化对象
model=Model()
model.add('mike')
model.add('john')
model.add('stad')
model.add('bbob')

#(1)可以使用for循环检查
for i in model:
    print(i)

(2.6)优化于自定义可迭代对象(迭代器对象的类模板,__iter__,__next__)

import time
#自定义可迭代对象(迭代器对象的类模板,__iter__,__next__)
class Model(object):

    def __init__(self):
        '''创建对象-初始化对象'''
        self.list_0=[] #列表
        self.num_=0 #索引值

    def add(self,uname):
        '''调用方法,添加数据'''
        self.list_0.append(uname)

    def __iter__(self):
         '''魔术方法,可迭代对象条件'''
         # 得返回一个迭代器对象
         return self


    def __next__(self):
        # 列表长度是多少,那么方法就会调用几次
        if self.num_ < len(self.list_0):
            # 调用次数小于列表长度就返回数据
            name = self.list_0[self.num_]
            # 索引自增
            self.num_ += 1
            # 休眠2秒
            time.sleep(.2)
            # 返回数据
            return name
        else:
            raise StopIteration  # 一旦超出索引,,让next方法的调用停止

#实例化对象
model=Model()
model.add('mike')
model.add('john')
model.add('stad')
model.add('bbob')

#(1)可以使用for循环检查
for i in model:
    print(i)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值