zoukankan      html  css  js  c++  java
  • Python基础知识当中容易混淆的几个知识点

    在Python的基础知识当中,对于类实现可迭代功能有了一种新的方式,而这种方式则有别于我们学.NET等其他高级语言。

    在Python当中,目前常用的有两种方式来实现这种迭代器的返回:__iter__ 方式和 __getitem__方式,而这两种方式的区别也很简单明了:

    1. __iter__方式返回的是一种可供for这样迭代访问的对象;

    2. __getitem__ 方式返回的是可以使用下标方式来对数组、元组访问的对象。

    举例说明:

    class FibArray:
      def __init__(self):
        self._1, self._2 = 0, 1   
    
      def __iter__(self):
        return self
    
      def __next__(self):
      #在执行第一次迭代的时候,先调用一次__next__返回第一个数据。
      #所以,虽然在下面FibArray()是一个类的实例,但是其也是根据类的行为返回一个迭代对象
        self._1, self._2 = self._2, self._1 + self._2
        if self._1 > 100:
          raise StopIteration()
        return self._1
    
    for i in FibArray():
      print(i)
    

      

    输出为:

    在此实例当中,有一个对于初学者来说非常难以理解的一点: for i in FibArray(),就对于学过C#和Java语言的同学来说,类名后面跟一个括号这样是一个类的实例化,也就是一个对象,为何能用在这呢?

    其实我们可以这样简单的理解就可以了:在for这个语句当中,for是用来迭代的,其访问的对象应该是一个类的迭代器。在FibArray被实例化的时候,根据上下文及内部定义的函数,自动的返回了一个迭代器对象参于到for运算当中。

    def __iter__(self):   这句标明了这是一个可迭代的类。def __next__(self):则为迭代去准备数据。

    实际当程序执行到for语句时执行的步骤为:

    1. FibArray.__init__ 构造函数;

    2. FibArray.__iter__ 标志函数,处理迭代器的初步工作;

    3. FibArray.__next__ 函数,准备数据返回;

    4. print函数;

    5. FibArray.__next__ 函数,准备数据返回;

    .......

    而__getitem__ 则简单的多,而且一般情况下也是一次性的返回到对象当中。如下所示:

    class Fib:
        def __getitem__(self, n):
            a, b = 1, 1
            for i in range(n):
                a, b = b, a + b
            return a
    
    f = Fib()
    print(f[5])
    

    程序的运行步骤为:

    1. 运行至print函数;

    2. 调用Fib类的__getitem__函数,并一次性完成数据的处理,返回数据;

    3. 传递给print函数,打印数据。

    在理解了其不同的工作原理之后,我们才能对症下药,在不同的场合下面应用不同的场景与方法。

  • 相关阅读:
    2018.10.11----2018.10.13 计算机网络(写了两天)
    2018.10.10 Java的The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 错误
    2018.10.10 MAC 的Launchpad图标改变大小的设置
    2018.10.8 Hibernate中解决乱码问题---配置一个过滤器
    2018.10.7 理解Hibernate的工作原理及其中的ORM详解
    2018.10.6 Hibernate配置文件详解-------ORM元数据配置 &&& hibernate主配置文件
    2018.10.5 hibernate导入约束,在Eclipse的xml文件实现自动提示
    2018.10.4 AndroidStudio
    2018.10.3 MianShiBaoDian JavaWeb后端部分
    C语言练习之 冒泡排序(二)
  • 原文地址:https://www.cnblogs.com/liweimyfild_0/p/7881392.html
Copyright © 2011-2022 走看看