zoukankan      html  css  js  c++  java
  • 【Python学习日记】迭代器

    class Fib:
        '''迭代器例子'''
    
        def __init__(self, vmax):
            self.max = vmax
    
        def __iter__(self):
            self.a = 0
            self.b = 1
            return self
    
        def __next__(self):
            fib = self.a
            if fib > self.max:
                raise StopIteration
            self.a, self.b = self.b, self.a + self.b
            return fib
    

      类实例创建后,__init__() 方法被立即调用。很容易将其——但技术上来说不正确——称为该类的“构造函数” 。 很容易,因为它看起来很像 C++ 的构造函数(按约定,__init__() 是类中第一个被定义的方法),行为一致(是类的新实例中第一片被执行的代码), 看起来完全一样。 错了, 因为__init__() 方法调用时,对象已经创建了,你已经有了一个合法类对象的引用。

    每个方法的第一个参数,包括 __init__() 方法,永远指向当前的类对象。 习惯上,该参数叫 self。 该参数和c++或Java中 this 角色一样, 但 self 不是 Python的保留字, 仅仅是个命名习惯。 虽然如此,请不要取别的名字,只用 self; 这是一个很强的命名习惯。

    在 __init__() 方法中, self 指向新创建的对象; 在其他类对象中, 它指向方法所属的实例。尽管需在定义方法时显式指定self ,调用方法时并  必须明确指定。 Python 会自动添加。

    迭代器工具库

    import itertools
    
    names = list(open('favorite-people.txt', encoding='gb2312'))
    print(names)
    names = [name.rstrip() for name in names]
    print(names)
    names = sorted(names)
    print(names)
    names = sorted(names, key=len)
    print(names)
    
    
    groups = itertools.groupby(names, len)
    print(list(groups))
    #调用list() 函数会“耗尽”这个迭代器,
    #也就是说 你生成了迭代器中所有元素才创造了这个列表。
    #迭代器没有“重置”按钮。你一旦耗尽了它,你没法重新开始。
    #如果你想要再循环一次(例如, 在接下去的for循环里面),
    #s你得调用itertools.groupby()来创建一个新的迭代器。
    groups = itertools.groupby(names, len)
    for name_length, name_iter in groups:
        print('Names with {0:d} letters:'.format(name_length))
        for name in name_iter:
            print(name)
    
    def mydef(name):
        return name[0]
    
    groups = itertools.groupby(names, mydef)
    for name_length, name_iter in groups:
        print('Names with {0:s} letters:'.format(name_length))
        for name in name_iter:
            print(name)
    

      

    >>> list(range(0, 3))
    [0, 1, 2]
    >>> list(range(10, 13))
    [10, 11, 12]
    >>> list(itertools.chain(range(0, 3), range(10, 13)))        
    [0, 1, 2, 10, 11, 12]
    >>> list(zip(range(0, 3), range(10, 13)))                    
    [(0, 10), (1, 11), (2, 12)]
    >>> list(zip(range(0, 3), range(10, 14)))                    
    [(0, 10), (1, 11), (2, 12)]
    >>> list(itertools.zip_longest(range(0, 3), range(10, 14)))  
    [(0, 10), (1, 11), (2, 12), (None, 13)]
    

      

  • 相关阅读:
    当Table中td内容为空时,让它显示边框的办法
    超链接可以是JS代码
    学习Filter
    关于SQL语句的拼接问题
    复习JSP时遇到的几个问题
    凡是项目中的增删改都要加事务
    Xshell和SecureCRT连不上VMware虚拟机linux系统
    IBM AIX定义数组变量
    Python模块之re 正则表达式
    Python模块之itertools 用于创建和使用迭代器的函数工具
  • 原文地址:https://www.cnblogs.com/joyber/p/4344100.html
Copyright © 2011-2022 走看看