• python让实例作用于for循环并当做list来使用


    python如果想让一个类被用于for....in  循环,类型list和tuple那样,可以实现__iter__方法。

    这个方法返回一个迭代对象,python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

    class  Fib(object):
        def  __init__(self):
            self.a,self.b=0,1   #初始化两个计数器a,b
        def   __iter__(self):
            return self  #实例本身就是迭代对象,故返回自己
        def  next(self):
            self.a,self.b=self.b,self.a+self.b   #计算下一个值
            if  self.a>100000:    #退出循环的条件
                raise  StopIteration()
            return self.a
        
    

     把Fib实例作用于for循环:

    for  n  in  Fib():
        print  n   
        
        
    1
    1
    2
    3
    5
    ...
    46368
    75025
    

     Fib 实例虽然能作用于for循环,看起来和list有点像,但是,把它当成list来使用还是不行,例如,按下标取元素

    print  Fib()[5]
    此时会报错:TypeError: 'Fib' object does not support indexing

    要实现按下标取元素,需要实现__getitem__()方法

       def  __getitem__(self,n):
            a,b=1,1
            for x  in range(n):
                a,b=b,a+b
            return  a
    

     按下标获取元素

    f=Fib()
    print  f[0]   #1
    print  f[1]   #1
    print  f[10]   #89
    print f[100]   #573147844013817084101
    

     list 有个切片方法获取元素

    print  range(100)[5:10]     #[5, 6, 7, 8, 9]
    

     对于Fib却报错,原因是__getitem__传入的参数可能是一个int,也可能是一个切片对象slice,需要做判断

    def __getitem__(self, n):
            if isinstance(n, int):
                a, b = 1, 1
                for x in range(n):
                    a, b = b, a + b
                return a
            if isinstance(n, slice):
                start = n.start
                stop = n.stop
                a, b = 1, 1
                L = []
                for x in range(stop):
                    if x >= start:
                        L.append(a)
                    a, b = b, a + b
                return L
    

      试试Fib的切片

    f=Fib()
    print f[0:5]     #==>[1, 1, 2, 3, 5]
    
    print f[:10]  # ==>[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
    
  • 相关阅读:
    Android——继续深造——从安装Android Studio 2.0开始(详)
    PHP——安装wampserver丢失MSVCR110.dll
    Marza Gift for GDC 2016
    Retrieve OpenGL Context from Qt 5.5 on OSX
    Space Time Varying Color Palette
    Screen Space Depth Varying Glow based on Heat Diffusion
    Visualization of Detail Point Set by Local Algebraic Sphere Fitting
    Glass Dragon
    Jump Flood Algorithms for Centroidal Voronoi Tessellation
    京都之行
  • 原文地址:https://www.cnblogs.com/zwgblog/p/7238585.html
Copyright © 2020-2023  润新知