迭代器

 

 

一、协程

  1、协程是Python语言独有的一种多任务方式。

  2、使用gevent模块实现协程。

  3、协程的实现过程(步骤)

    迭代器

    生成器

    yield

    greenlet

     gevent

 

二、迭代器

 

  1、迭代的定义: 在原有的基础之上添加新的功能。

 

  2、迭代对象的定义:即一个对象中有包含了【__iter__】的方法。

 

  3、迭代器的定义:

    即:一个对象中既包含了【__iter__】方法,又包含了【__next__】方法

    通过它可以用来节省内存空间,并且能够知道将来生成数据的方式

 

  4、判断一个数据类型是否可以迭代:

    说明:

      a、通过【isinstance】语句用于判断一个对象是否由一个类创建的。

        返回一个布尔值:是则返回True,不是则返回False。

 

        语法:  

         isinstance(对象, 类)

          # True:属于

          # False:不属于

 

      b、判断这个数据类型对象是否是属于【Iterable】类的子类。

        语法:

          

          from collections import Iterable

          isinstance(迭代对象, Iterable)

          # True:属于

          # False:不属于

 

     c、示例

       

from collections import Iterable

# 1. 判断列表
list_ret = isinstance([1, 2, 3], Iterable)
print(f"列表:{list_ret}")

# 2. 判断元组
list_ret = isinstance((1, 2, 3), Iterable)
print(f"元组:{list_ret}")

# 3. 判断字符串
list_ret = isinstance("huangwei", Iterable)
print(f"字符串:{list_ret}")

# 4. 判断数字
list_ret = isinstance(100, Iterable)
print(f"数字:{list_ret}")
View Code

 

 

  运行结果:

 

  

  列表:True

  元组:True

  字符串:True

  数字:False

    

  4、可迭代对象

     a、成为可迭代对象的条件类中必须要有【__iter__】方法。

     

   要求:自定义一个可迭代对象  

from collections import Iterable


class Demo(object):
    def __init__(self):
        self.names = list()
    
    def add(self, name):
        self.names.append(name)


obj = Demo()
obj.add(100)
obj.add(200)
obj.add(300)

print(f"判断obj对象是否为可迭代对象:{isinstance(classmate, Iterable)}")
View Code

 

运行结果:判断obj对象是否为可迭代对象:False

 

可迭代对象示例代码

from collections import Iterable


class Demo(object):
    def __init__(self):
        self.names = list()
    
    def add(self, name):
        self.names.append(name)

    def __iter__(self):
        pass


obj = Demo()
obj.add(100)
obj.add(200)
obj.add(300)

print(f"判断obj对象是否为可迭代对象:{isinstance(classmate, Iterable)}")
View Code

 

运行结果:判断obj对象是否为可迭代对象:True

 

  5、使用for循环的条件

    a、判断一个对象可以使用for循环的条件

      

    b、for循环的执行原理:

      

      1、被循环的对象是否可以迭代,即:类中必须有【__iter__】方法    

      2、在【__iter__】方法中必须要返回一个引用:迭代器。

      即:该迭代器中必须具有【__iter__方法】和【__next__方法】。

      3、迭代器中必须包含【__iter__】方法和【__next__】方法。

 

      4、通过这个迭代器的引用,for循环将调用该引用中的【__next__】的返回值

 

        即:使用【for 变量 in 可迭代对象】语句时,

       打印变量的值得到的是迭代器中【__next__】方法的返回值

 

 

    c 、演示:

      示例1:创建一个可以被for循环遍历的类。

 

      

class Demo(object):
    def __init__(self):
        self.names = list()
    
    def add(self, name):
        self.names.append(name)

    def __iter__(self):
        return ClassIterator()  # 返回一个迭代器


class ClassIterator(object):
    def __iter__(self):
        pass

    def __next__(self):
        pass


obj = Demo()

# 通过iter函数可查看obj对象的__iter__方法的返回值。
print(iter(obj))  
View Code

 

  运行结果:

  

 

 

      

      示例2:查看一个对象是否为迭代器,并通过【next】方法取到可迭代对象中的值。

       

      运行结果:

      

 

 

from collections import Iterator


class Demo(object):
    def __init__(self):
        self.names = list()

    def add(self, name):
        self.names.append(name)

    def __iter__(self):
        return ClassIterator()
    

class ClassIterator(object):
    def __iter__(self):
        pass

    def __next__(self):
        return 100


obj = Demo()
demo_iterator = iter(obj)

# 1. 判断obj对象是否为可迭代对象
print(f"obj对象是否为可迭代对象:{isinstance(demo_iterator, Iterable)}")

# 2. 判断demo_iterator对象是否为迭代器
print(f"demo_iterator对象是否为迭代器:{isinstance(demo_iterator, Iterator)}")

# 3. 通过next方法取值
print(next(demo_iterator))
View Code

 

 

    

    

posted @ 2021-01-21 17:29  御姐玫瑰  阅读(98)  评论(0编辑  收藏  举报
levels of contents