zoukankan      html  css  js  c++  java
  • 5.python数据结构-迭代器(iterator)&生成器(generator)

    # 迭代器(Iterator)&生成器(generator)
    # 若要对象可迭代:
    # 在python2中对象必须包含__iter__(self)和next(self)
    # 在python3中对象必须包含__iter__(self)和__next__(self)
    # 其中:__iter__(self)必须返回一个含有含有__next__(self)的对象,
    #     可以是自身(见SimpleCounter),也可以其他对象(见SimpleCounter1)
    
    
    # 创建一个迭代器
    class SimpleCounter(object):
        def __init__(self, start, end):
            self.start = start
            self.current = self.start
            self.end = end
    
        def __iter__(self):
            return self
    
        # 如果是python2这里用next,python用__next__
        def __next__(self):
            if self.current > self.end:
                raise StopIteration
            else:
                self.current += 1
                return self.current - 1
    
    
    class SimpleCounter1(object):
        def __init__(self, start, end):
            self.start = start
            self.current = self.start
            self.end = end
    
        def __iter__(self):
            return SimpleCounter(self.start, self.end)
    
        # 该类中该函数可要可不要
        # 如果是python2这里用next,python用__next__
        def __next__(self):
            if self.current > self.end:
                self.current = self.start
                raise StopIteration
            else:
                self.current += 1
                return self.current - 1
    
    
    # 访问迭代器
    simple_counter = SimpleCounter(1, 4)
    
    print('first traversal simple_counter:')
    for x in simple_counter:
        print(x)
    # output:
    # 1
    # 2
    # 3
    # 4
    
    # 第二次迭代没有结果,因为迭代器只能被遍历一次
    print('second traversal simple_counter:')
    for x in simple_counter:
        print(x)
    
    simple_counter1 = SimpleCounter1(1, 4)
    print('traversal simple_counter1...')
    for x in simple_counter1:
        print(x)
    
    # 使用生成器生成一个迭代器,b为迭代器对象,(x ** 2 for x in a)为生成器
    a = [0, 1, 2, 3, 4]
    b = (x ** 2 for x in a)
    
    print('traverse the iterator created by one generator for the first time:')
    for x in b:
        print(x);
    print('traverse the iterator created by one generator for the second time:')
    # 本次遍历没有结果,因为b是迭代器
    for x in b:
        print(x);
    
    注:
    -python玩转数据科学之准备数据(使用到generator)
  • 相关阅读:
    python 端口扫描仪
    [ruby on rails] 深入(1) ROR的一次request的响应过程
    [ruby on rails] 跟我学之(10)数据输入验证
    [ruby on rails] 跟我学之(9)删除数据
    [ruby on rails] 跟我学之(8)修改数据
    [ruby on rails] 跟我学之(7)创建数据
    BZOJ 2301 [HAOI2011]Problem b (分块 + 莫比乌斯反演)
    BZOJ 2005 [Noi2010]能量采集 (数学+容斥 或 莫比乌斯反演)
    BZOJ 1497 [NOI2006]最大获利 (最小割)
    BZOJ [FJOI2007]轮状病毒 (找规律)
  • 原文地址:https://www.cnblogs.com/wjc920/p/9256159.html
Copyright © 2011-2022 走看看