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. 将代码和数据分离。 所有模式被存在一个分开的文件。代码是代码,数据是数据,二者永远不会交织。
相关文章推荐
- 流畅python学习笔记:第十四章:迭代器和生成器
- python数据结构学习笔记-2016-11-07-03-多重链表以及相应的迭代器
- python学习笔记四 迭代器,生成器,装饰器(基础篇)
- python学习笔记-函数式编程、迭代器和生成器
- python学习笔记9-迭代器和生成器整理
- python学习笔记4.2-python高级之迭代器
- Python 学习笔记 迭代器和生成器
- python 学习笔记(8)高级迭代器
- Python学习笔记014——迭代器 Iterator
- Python学习笔记——迭代器
- python学习手册笔记--第14.20章--迭代器和解析
- Python3 学习笔记------迭代器
- Python学习笔记(5) -- 迭代器(Iterable/Iterator/iter())
- python学习笔记-迭代器和类
- Python学习笔记 迭代器
- 【Python】学习笔记——-4.5、迭代器
- python学习笔记--可迭代对象和迭代器的理解
- Python学习笔记7-高级迭代器
- Python3 学习笔记18_高级特性(迭代器)_20180308
- Python学习笔记——迭代器(RandSeq和AnyIter)