Python复习笔记(八)迭代器和生成器和协程

1. 迭代器

1.1 可迭代对象

1. 判断xxx_obj是否可以迭代

2. 在第1步成立的前提下,调用iter函数得到xxx_obj对象的 __iter__方法的返回值

3. __iter__方法的返回值是一个迭代器

4. 如果想要一个对象称为一个 可以迭代的对象,即可以使用for,必须实现 __iter__方法

5. __iter__中必须返回对象的引用(只要这个对象有__iter__和__next__方法,实际上取的__next__的返回值;

6. 迭代器结束,需要抛出一个 StopIteration异常。

from collections import Iterable
from collections import Iterator
import time


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("王1")
classmate.add("李2")
classmate.add("张3")

# print("classmate是否是可以迭代的对象: ", isinstance(classmate, Iterable))
# classmate_iterator = iter(classmate)
# print("classmate_iterator是否是迭代器: ", isinstance(classmate_iterator, Iterator))

# iter
# print(next(classmate_iterator))
#
for name in classmate:
    print(name)
    time.sleep(1)

王1
李2
张3

调用自己的__next__方法

from collections import Iterable
from collections import Iterator
import time


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      # 调用返回对象的__next__方法(这里调用自己的__next__方法

    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("王1")
classmate.add("李2")
classmate.add("张3")

# print("classmate是否是可以迭代的对象: ", isinstance(classmate, Iterable))
# classmate_iterator = iter(classmate)
# print("classmate_iterator是否是迭代器: ", isinstance(classmate_iterator, Iterator))

# iter
# print(next(classmate_iterator))
#
for name in classmate:
    print(name)
    time.sleep(1)

王1
李2
张3


2. 生成器

3. 多任务-协程

猜你喜欢

转载自www.cnblogs.com/douzujun/p/10502984.html