《王纯业版Python学习笔记心得》小结
·概要:
我也忘记最开始为什么学习Python了。后来就是学习了基础语法,而库就没有学--主要是还没找到要需要Python的地方。
在Python中的核心概念是:一切都是对象,对象都有名字(很OO啊)。
同时Python的一大特色就是用空格控制程序块;
·要点:
基础类型:
Python是动态语言,不需要像C++/Java等要先声明类型。
--整型:
所看到的1,3等数字就是整型--内部表示为整数对象所以有相关方法。
--浮点型:
Python对浮点型的支持还存在跟Java(我学的时候的Java)一样的精度问题。
比较来说,Python给我的感觉不适合处理数字。
--None类型:
这是一种概念常量,多用于函数返回类型和判断式。
--逻辑表达式:
首先需要说明的是Python中没有boolean类型;
对于逻辑假的集合为:None,0,0.0(浮点数),""(空串),()(空元组),[],{}
替代三元运算符(?:)的是:<cond> and <expr_true> or <expr_false>
数据结构:
需要提醒的是这些数据结构都是对象,也拥有各种方法来处理不同情况。
--字符串(string,不可变):
定义形式有单引号('str')、双引号("str")和三引号('''str'''或"""str""")形式。
对于单引号和双引号还可以通过符号(\)进行多行定义;
三引号具有原文呈现的特性,可以作为多行注释使用;
支持转移字符和格式化输出。
支持字符串连接操作符("david"+'yang')
类型转换:float(str),int(str),int(str,base),long(str),long(str,base);
--元组(tuple,常量list不支持pop/remove/insert等方法):
定义方式为:a=(1,2,3,4)形式--括号可省略,单元素元组为(1,)形式;
可通过下标操作符返回元素或子元组(切片操作)。
可用于多变量的赋值操作;
性能比list好--不提供动态内存管理的功能;
使用的地方:可变参数、格式化输出和继承结构;
--列表(list):
类似于C++中的Vector和C中的数组--顺序存储结构;
用操作符[]定义,支持扩展的下标操作符--索引从0开始且支持负索引;
支持切片操作--采用[start[:end[:step]]];
支持列表推导式:[<expr1> for k in L if<expr2>];
函数range([start,]stop[,step])可生成一个list;
--序列(sequence):
一种概念结构,包括string,list和tuple。
支持的操作:in判断,len函数,下标操作,切片操作,+连接,*重复和列表推导式;
--字典(dictionary):
用{}定义,是一种无需存储结构,每个元素都是一个pair--两个元素的tuple;
其中key类型:integer或stirng或任何含有__hash__和__cmp__方法的对象;
要求是没重复的key,而value的类型随意;
支持下标操作符;
可通过函数dict(list)构造字典—list是一个元素为tuple的list。
程序流程:
整体结构跟C++中流程控制很像,不过没有switch,而且曾加了可选的else;
--分支结构if:
if<expr1>:
<statement-block>
elif<expr2>:
<statement-block>
else:
<statement-block>
--循环while:
while<expr1>:
<statement-block>
else:
<statement-block>
--循环for:
for x in <range>:
<statement-block>
else:
<statement-block>
--流程控制continue/break:
continue跳过一次循环;break则跳出当前循环;
函数:
函数是一段可重复使用的代码。
函数也是对象,可以把函数赋值给另一个变量;
定义方式:def <function_name>(<parameters_list>):
<code_block>
返回指使用return语句;
--默认参数/可变参数:
跟C++一样,可使用默认参数并遵守默认参数都放在最右侧;
在调用多默认参数函数时可通过赋值参数方法来改变参数顺序和个数;
可变参数有两种方式:
*args方式:传递的是tuple,通过访问tuple的方式来访问;
**args方法:传递的是dict,调用函数时采用赋值方式来指定key;
--Doc String:
Doc String是函数对象的__doc__属性;
定义方式是函数体中的第一个string(一般采用三引号),否则为None;
作用是对函数的注释,在使用Python内置的帮助得到的函数的用法就是这个;
--lambda函数:
这是fucntional programming的概念,简单理解的话就是匿名函数;
定义方式:f=lambda a,b:a+b等价于def f(a,b):return a+b形式;
因为函数也是对象,所以一个函数也可以返回一个lambda函数;
--函数作用域:
遵循LGB原则:local namespace>global namespace
>building namespace;
通过使用global语句可以改变变量的命名空间(与C++不同概念);
--嵌套函数:
嵌套函数即允许在函数中嵌套定义函数;
嵌套的函数不可以访问外层函数的变量;
--参数传递:
因为Python中"一切都是对象",所以参数传递的也是对对象的引用;
模块和包:
一个module是包含函数和类的文件;
而package是一组module的集合--即文件夹;
module也含有Doc String--出注释外的第一条string;
--引人module:
引入module有两种方式:
import module方式:在global namespace中创建名字,使用方式是
module_name.attr形式;
from module import attr形式:不会在global namespace中创建名字,
直接使用attr,同时module_name.attr形式会报错;
如果源文件修改了,可通过reload(module)函数重新加载;
--查找module顺序:
首先会在当前目录中查找=》然后在环境变量PYTHONPATH中查找
=》最后在安装目录中查找;
所以尽量不要起跟库相同名字的module--即文件;
--创建package步骤:
在当前目录中创建一个目录—package名字命名;
在目录中创建一个命名为__init__.py的空文件;
可以创建包中的modules了;
使用时采用package.module.attr形式;
命名空间:
这是一种概念:我的理解是命名空间就是{对象、名称}绑定关系的集合;
是对象(object)和名字的映射关系,是动态数据结构dictionary;
常用命名空间有:
build-in namespace,global namespace和local namespace;
在一进入python的解释器就会建立一个module和唯一的blobal namespace,
其中一个重要属性是__name__来标志module,globale namespace的
__name__属性为"__main__"(测试可用)。
函数locals()和globals()分别返回local namespace和global namespace;
函数del可以接触对象和名字之间的绑定关系,而系统会自动垃圾回收内存;
面向对象编程:
面向对象(OO)是一种编程思想;
目的是代码重用;机制是封装、继承和多态;核心是抽象;
--类和对象:
类定义格式:class <class_name>(super_class1,super_class3,…):
<class_attr>
def <method_name>(self,<args>):
<self.attr和method_body>
其中类方法的第一个参数是self--表示类实例对象;
在Python中对象(object)泛指一切;
通过object.__dict__可得到对象的命名空间--即对象与名字的映射关系;
通过object.__dict__.keys()和object.__dict__[name]得到key和值;
vars(obj)得到obj的namespace,dir(obj)得到obj所有attribute;
attribute(property和method)中name搜索算法:
1.首先搜索对象的namespace;
2.如果对象是类实例会搜索对象所属类的namespace;
2.1如果对象所属类有父类则会从子类到父类顺序搜索类的namespace;
3.如果对象有__getattr__函数,调用这个函数返回结果;
PS:可以看出在第2步就实现了继承的概念;
--类方法和数据成员:
类方法分为对象绑定方法和对象未绑定方法:
对象绑定方法:第一个参数是self,通过对象调用如obj_name.method();
对象未绑定方法:第一个参数不必是self,通过class_name.method()调用;
class_name.method()的典型应用是调用父类方法;
抽象虚拟函数的定义方式是在函数内直接抛出异常来阻止调用;
在<class_attr>处定义的是类的属性,可通过类和对象调用;
通过self.attr定义的是对象的属性,只能通过对象调用;
使用attribute的定义方法是加前缀"__",这种方法并不是像C++中的private
一样控制,而是系统会在有"__"的属性前加"_classname"前缀预防;
--继承:
python中可以多继承,方式是父类作为元素的tuple放在类名和冒号之间;
每个类实例都有一个"__bases__"的属性记录直接父类的tuple;
重载是通过attribute的所有算法实现的:先搜索子类后搜索父类;
在多继承中父类的顺序决定了搜索算法的查找顺序;
--特殊函数:
如同C++中的构造/析构函数和复制函数等一样,pyhon中也存在特殊函数:
__init__:不同与C++中的构造函数,是在构造完成后的初始化函数;
__del__(self):删除对象时调用;
__repr__(self):使用repr(obj)函数时调用;
__str__(self):返回对象的字符串描述,在需要字符串的地方调用;
__cmp__(self,other):用于比较操作,返回值有(-1,0,1)三个;
__hash__(self):返回一个32位的hash value;
__nozero__(self):定义对象是否为逻辑假(0假1真);
__len__(self):调用内置函数len()时调用;
__getitem__(self,key):模拟obj[key];
__setitem__(self,key,value):模拟obj[key]=value;
__delitem__(self,key):模拟del obj[key];
__contains__(self,other):用于in语句的判断;
__call__(self,arg1,arg2,…):让对象具有函数的行为--类似函数对象;
__getattr__:控制函数的调用;
重载运算操作符:__add__(self,other),__sub__(self,other),
__mul__(self,other),__div__(self,other),__mod__(self,other),
__divmod__(self,other),__pow__(self,other),
__pow__(self,other,modulo),__lshift__(self,other)(左移),
__rshift__(self,other)等;
这里列出的是常用的,但并不是全部;
--new style class:
如果一个class的祖先有"object"类那么这个类就是new style class了;
即:可直接或间接地继承object,但要求祖先中只有一个object;
增加的两种函数:
static methord:定义方法是在函数定义后,在增加一条语句:
func_name=staticmethod(fucn_name)
特点是类和实例都可以调用,而行为与普通函数类似;
class methord:定义方法是在函数定义后,增加语句:
fucn_name=classmethod(fucn_name)
要求函数的第一个参数是类,而不是self表示的对象;
以上两种方法的定义都在函数定义完成后增加一条声明语句;
增加的特殊函数:
__new__:真正的构造函数,默认为class method;
__getattribute__:与__getattr__不同,位于搜索算法的第一步;
在传统类中调用父类是通过父类名来调用,
而new style class通过super(clsobj,obj)返回父类;
异常处理:
抛出异常是使用raise语句--可以抛出任何对象作为异常;
--捕获异常:
格式:try:
<body>
except ExceptionType:
<body>
except (ExcptionType1,ExcpetionType2):
<body>
except: #捕获任意类型异常
<body>
else: #只有在没发生异常是才会执行
<body>
finally结构:
try:
<body>
except:
<body>
finally: #无论是否发生异常都执行
<body>
模块:
模块就是python的类库,提供了丰富的功能;
学习的上面的语法才算是刚起步;
--常用模块:
提供内置函数:help(),callable(),repr(),eval(),dir(),hasattr()setattr()
delattr(),get(),vars(),locals(),globals(),type(),
isinstance(),issubclass();
类型转换函数:chr(),ord(),oct(),hex(),str(),list(),tuple(),dict(),
int(),long(),complex(),max(),min();
执行代码函数:exec语句,compile(),eval();
file对象:对文件支持的内置对象;
相关方法:open();f.write(),f.read(),f.open(),f.readline(),
f.tell(),f.seek(),f.close();
sys模块:包含和系统相关的信息;
os模块:和操作系统相关的调用和操作;
re模块:正则表达式功能模块;
struct模块:二进制序列化相关模块:pacak(),unpack()和cacsize();
cmd模块:编写命令行接口,用于大型程序的测试;
getop模块:命令行参数处理模块;
time模块:时间处理模块;
socket模块:网络模块;
--图形编程:
标准模块是Tkinter模块;
第三方模块是wxWidgets提供的python接口图形库;
--其他模块:
标准库中还有很多有用的模块如thread/urllib2等模块需要学习;
同时丰富的第三方模块也是编程更加简单和容易;
·小结:
最近一段时间工作轻松些,把以前搜集记录的学习资料都整理下。