python多任务---协程

一、迭代器

   1.可迭代对象 

我们把可以通过for...in...这类语句迭代 读取的一条数据供我们使用的对象称之为可迭代对象

   a>通过isinstance()可以判断一个对象是否可以迭代

        判断列表是否为可迭代对象

import collections

   print(isinstance([],collections.Iterable)

        若输出值为True则说明是可迭代对象,若输出的值为False则说明是不可迭代对象 

   c>自定义一个能容纳数据的类,测试可迭代性

from collections import Iterable
class ClassMates(object):
    def __init__(self):
        self.names = []
    def add_name(self,name):
        self.names.append(name)

my_classmates = ClassMates()
my_classmates.add_name("lisi")
my_classmates.add_name("zhangsan")
my_classmates.add_name("wanger")
#判断该类是否为可迭代类对象
print(isinstance(ClassMates,Iterable))

   通过测试我们发现随便分装的一个存放多条数据的类也是不可迭代的

    2.可迭代对象的实质

    a>可迭代对象的本质

可迭代对象的本质是提供一个中间人帮助我们 对存储的数据进行遍历使用,这个中间人我们称之为迭代器

    b>可迭代对象是如何取得迭代器的

可迭代对象(Iterable)

通过__iter__()取得迭代器(Iterator)

    c>如何定义一个可迭代类

只要实现__iter__方法,返回一个迭代器(iterator),就可以实现可迭代类

 


from collections import Iterable

class ClassMate(object):

    def __init__(self):

        self.name=[]

        self.current = 0

def add_names(self,name):

        self.name.append(name)

def __iter__(self): ###通过该方法取得迭代器对象

        psaa

my_classmate = ClassMate()

my_classmate.add_names("lisi")

my_classmate.add_names("wanger")

my_classmate.add_names("zhangsan")

 

           print("是否为可迭代对象:",isinstance(my_classmate,Iterable))

可以发现返回值是True

    3.再认识iter()函数与next()函数

    a>iter(Iterable) : 

iter(iterable) -> iterator 通过可迭代对象(iterable) 取得该可迭代对象的迭代器(iterator),内部可迭代对象通过__iter__方法取得迭代器(iterator)
    b>next(iterator):

Return the next item from the iterator

返回迭代器指向的下一个位置的数据
  内部是通过迭代器的__next__()方法来取得下一个位置的数据

注意: 当迭代器已经指向最后一个位置,当再调用next(),则抛 StopIteration 

    3.自定义迭代器

from collections import Iterable

class ClassMate(object):

     def __init__(self):
self.name=[]
self.current = 0
def add_names(self,name):
self.name.append(name)
def __iter__(self): ###通过该方法取得迭代器对象
return self
def __next__(self):
if self.current< len(self.name):
name = self.name[self.current]
self.current+=1
return name
else:
raise StopIteration
my_classmate = ClassMate()
my_classmate.add_names("lisi")
my_classmate.add_names("wanger")
my_classmate.add_names("zhangsan")

print("是否为可迭代对象:",isinstance(my_classmate,Iterable))
from collections import Iterable
class ClassMate(object):
def __init__(self):
self.name=[]
self.current = 0
def add_names(self,name):
self.name.append(name)
def __iter__(self): ###通过该方法取得迭代器对象
return self
def __next__(self):
if self.current< len(self.name):
name = self.name[self.current]
self.current+=1
return name
else:
raise StopIteration
my_classmate = ClassMate()
my_classmate.add_names("lisi")
my_classmate.add_names("wanger")
my_classmate.add_names("zhangsan")

print("是否为可迭代对象:",isinstance(my_classmate,Iterable))

猜你喜欢

转载自www.cnblogs.com/zhangtq/p/9078076.html