您的位置:首页 > 编程语言 > Python开发

python 学习笔记(7)类和迭代器

2013-05-09 09:43 323 查看

声明:本文系本人学习python3总结,如有侵权等,请及时告知;

                       欢迎转载:请保留http://blog.csdn.net/kevinx_xu/article/details/8903785

一、迭代器

         生成器是一类特殊 迭代器。 一个产生值的函数 yield 是一种产生一个迭代器却不需要构建迭代器的精密小巧的方法。

        

二、类

         Python 是完全面向对象的:你可以定义自己的类,从你自己或系统自带的类继承,并生成实例。  

         1、没有从其他类继承。 类名通常是大写字母分隔(注意习惯)。

         2、类内部的内容都需缩进,就像函数中的代码一样, if 语句, for 循环, 或其他代码块。第一行非缩进代码表示到了类外。

         3、Python中的pass 就像Java 或 C中的空大括号对 ({}) 。

         4、__INIT__()方法

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

         5、self对象

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

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

         6、实例化类

                   Python 中实例化类很直接。 实例化类时就像调用函数一样简单,将 __init__() 方法需要的参数传入。 返回值就是新创建的对象。  Python里面, 和调用函数一样简单的调用一个类来创建该类的新实例。 与C++ 或 Java不一样,没有显式的 new 操作符。

         7、实例对象

                   self.val=

                   用self实例的对象在其他方法中可以通过self.val进行访问和改写;

         8、菲波拉稀迭代器

                  现在 你已经准备学习如何创建一个迭代器了。 迭代器就是一个定义了 __iter__() 方法的类。 这些类的所有三种方法, __init__, __iter__, 和 __next__, 起始和结束均为一对下划线(_) 字符。 为什么这样? 并无什么神奇之处, 只是通常表示这是“特殊方法。” 唯一“特殊”的地方,就是这些方法不是直接调用的; 当你使用类或实例的某些语法时,Python会自动调用他们。

        在python2x version中next()调用不成功。

        换python3x version 后发现print一直报语法错误,在python3x中这样使用print()

eg:

#!/usr/bin/env python3

 

 class fib:

    def __init__(self, Max):

        self.Max=Max

    def __iter__(self):

        self.a,self.b = 0,1

        return self

    def __next__(self):

        fi = self.a

        if fi >self.Max:

            raise ValueMax

        else:

            self.a,self.b=self.b,self.a+self.b

        return fi

 

  if __name__ == '__main__':

    #f = fib(20)

    #iter(f)

    try:

         #for i in range(1,100):

                            #print(next(f))

        for i in fib(20):

            print (i, end=' ')     

    except:

        print ("number max\n")

        exit()

         1)注释掉的第一种方法,很好理解,就如上面说的fib()构造一个实例,iter(f)相当于yield a,
iter()调用__iter__()函数:

next()的时候,就和next()是一样的,但是next()是调用fib中的__next__()函数

         2)第二种方法,使用很简单for循环去创建fib实例,创建后,背地里,且十分聪明的, for 循环调用 iter(), 它返回迭代器。为“循环通过”迭代器, for 循环调用 next(), 它又调用 实例对象的 __next__() 方法,产生下一个菲波拉稀计算并返回值。 并把值返回给i;

上例中,调用自定义raise
异常;用try ...except处理所有异常,但是ValueMax是没有定义的也会出现异常;

 

三、实例特点

         1.  类的每个实例继承了 共有属性及它在类中定义的值。  

         2.  修改一个实例属性的值不影响其他实例……  

         3.  ……也不会修改类的属性。可以使用特殊的 __class__ 属性来访问类属性(于此相对的是单独实例的属性)。  

         4.  如果修改类属性, 所有仍然继承该实例的值的实例会受影响。  

         5.  已经覆盖(overridden)了该属性的所有实例 将不受影响。  

四、迭代器优点

         1.  最小化初始代价。 在 import 时发生的唯一的事就是实例化一个单一的类并打开一个文件(但并不读取)。  

         2.  最大化性能 读遍文件并动态创建功能。同时缓存功能,在最坏情况下,仅需要读完一遍文件。  

         3.  将代码和数据分离。 所有模式被存在一个分开的文件。代码是代码,数据是数据,二者永远不会交织。  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: