美文网首页
迭代器,可迭代对象,yield,生成器

迭代器,可迭代对象,yield,生成器

作者: ThomasYoungK | 来源:发表于2017-12-27 23:10 被阅读16次

迭代器

a = [1,2,3,45]
print(type(a))
a = iter(a)  # 生成一个跌打器
print(type(a))

print(a.__iter__())
print(a)


class MyIterator(object):
    """迭代器对象是实现了__next__()方法和__iter__()方法的对象,其中他的__iter__()返回的是迭代器对象本身。
    它只能实现一次迭代
    """
    def __init__(self, start, end):
        self.start = start
        self.end = end
        self.current = start

    def __iter__(self):
        return self

    def __next__(self):
        if self.current >= self.end:
            raise  StopIteration("haha")
        self.current += 1
        return self.current - 1

class MyIterable(object):
    """可迭代对象是实现了__iter__()方法的对象,且__iter__()返回一个迭代器对象。
    要想实现多次迭代,只要可迭代对象返回一个新的迭代器即可,for循环时,python先调用__iter__()获得
    迭代器,然后对该迭代器使用__next__()
    for val in iterable:
        print(val)
    等效于:
    iterator = iter(iterable)  # 每次都是新的
    while True:
        try:
            while True:
                print(next(iterator))
        except:
            break

    因为每次使用迭代工具迭代的时候都会调用__iter__()返回一个新的迭代器对象,这样就相当于创建多个迭代器了,自然可以看起来是重复迭代了!
    """
    def __init__(self, start, end):
        self.start = start
        self.end = end

    def __iter__(self):
        return MyIterator(self.start, self.end)



if __name__ == "__main__":
    # 迭代器
    myIterator = MyIterator(3,5)
    print(myIterator.__iter__() is myIterator)
    for val in myIterator:
        print(val)
    # 迭代器对象不支持重新迭代
    for val in myIterator:
        print(val)

    myIterator = MyIterator(3, 5)
    print([i for i in myIterator])
    # 迭代器对象不支持重新迭代
    print([i for i in myIterator])

    # 可迭代对象
    myIterable = MyIterable(1,6)
    print([i for i in myIterable])
    # 可以重复迭代啦
    print([i for i in myIterable])

    iterator = iter(myIterable)  # 每次都是新的
    while True:
            try:
                while True:
                    print(next(iterator))
            except StopIteration:
                break

协程

from time import time as current_time
from random import random
event_list = []

class Event(object):

    def __init__(self):
        event_list.append(self)
        self._callback = lambda: None

    def is_ready(self):
        ready = self._is_ready()
        if ready:
            self._callback()
        return ready

    def set_callback(self, callback):
        self._callback = callback

class IOEvent(Event):

    def __init__(self, duration):
        super(IOEvent, self).__init__()
        self._duration = duration
        self._start_time = current_time()

    def _is_ready(self):
        return current_time() - self._start_time > self._duration

def testEvent():
    e = IOEvent(3)
    tic = current_time()
    while not e.is_ready():
        pass
    toc = current_time()
    print(toc - tic)

def io(name, times, duration=1):
    for i in range(times):
        yield IOEvent(duration)
        print("{0} end: {1}".format(name, i))

def testIO():
    print([event for event in io("yangkai", 3)])

# testIO()


class Dispatcher(object):
    def __init__(self, tasks):
        self._tasks = tasks
        self._start()

    def _start(self):
        for task in self._tasks:
            self._do(task)

    def polling(self):
        while len(event_list) > 0:
            for e in event_list:
                if e.is_ready():
                    event_list.remove(e)
                    break

    def _do(self, task):
        try:
            event = next(task)
            event.set_callback(lambda: self._do(task))
        except StopIteration:
            pass


def testDispatcher():
    dispatcher = Dispatcher([io('yangkai', 3), io('Lizhen', 2), io('shushao', 4)])
    dispatcher.polling()

import timeit
timeit_times = 10
avg_cost = timeit.timeit(lambda: testDispatcher(), number=timeit_times) / timeit_times
print('%.3f' % avg_cost)

相关文章

  • 理解Python中的yield以及协程

    要理解yield,必须先清楚可迭代对象、迭代器和生成器的概念。 一、可迭代对象 大部分对象都是可迭代,只要实现了_...

  • python 如何使用生成器函数实现可迭代对象?

    生成器对象和迭代器对象相似,支持 next()生成器使用关键字 yield生成器对象也是可迭代对象使用生成器函数的...

  • python协程系列(一)生成器generator以及yield

    生成器generator详解 注意:关于什么是可迭代对象、什么是生成器、什么是迭代器这里不再赘述。 yield是实...

  • Python基础-16生成器-迭代器

    16.生成器-迭代器     可循环迭代的对象称为可迭代对象,迭代器和生成器函数是可迭代对象,在Python中提供...

  • Python可迭代对象,迭代器,生成器关系

    列表,元组,字符串,迭代器,生成器都是可迭代对象。所以,可迭代对象不一定是迭代器,生成器。 将一个可迭代对象传递给...

  • 迭代器

    可迭代对象(Iterable): for迭代器(Iterator): for + next生成器属于迭代器。 验...

  • 可迭代对象、迭代器、生成器

    可迭代对象 --> 迭代器 --> 生成器; 可迭代对象:实现了__iter__()方法的对象,该方法返回迭代对象...

  • yield and Iterator

    Generator(生成器) 生成器是特殊的迭代器,迭代器不一定是生成器。 生成器与迭代器均是可迭代对象。 目前学...

  • 迭代机制

    可迭代对象、迭代器、生成器、生成式区别 a. 可迭代对象: 一个对象能够被迭代的使用,这个对象就是可迭代对象 b....

  • python生成器、迭代器、可迭代对象

    可迭代对象 迭代器 生成器 1.可迭代对象 可以被for循环遍历的对象成为可迭代对象,其中包括list、str、t...

网友评论

      本文标题:迭代器,可迭代对象,yield,生成器

      本文链接:https://www.haomeiwen.com/subject/pdgpgxtx.html