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

本文详细介绍了Python中的迭代器概念,特别是生成器的作用,以及类的定义、实例化和使用方法。还通过实例展示了如何创建迭代器,强调了Python类在数据处理和代码组织方面的优势。

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

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

一、迭代器

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

        

二、类

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

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

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

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

         4__INIT__()方法

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

         5self对象

                   每个方法的第一个参数,包括 __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 versionnext()调用不成功。

        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.  将代码和数据分离。 所有模式被存在一个分开的文件。代码是代码,数据是数据,二者永远不会交织。  

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值