Size: 16415
Comment:
|
Size: 17661
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 7: | Line 7: |
= Py2.5 绝对简明手册 = |
|
Line 11: | Line 9: |
现在学的东西很容易忘记,写这篇文章的目的是能让我在需要时快速找回当时的感觉. 需要深入的请下载 attachment:diveintopython%2Dpdf%2D%35.%34.zip . -- For Python2.5 {{{ 版本:0.2 beta 作者:张沈鹏 电子科大大三 生物医学工程 |
##下载本手册:attachment:Python2.5%20绝对简明手册-张沈鹏.7z 学而易忘,需时速查. -- For Python2.5 作者:[wiki:zsp 张沈鹏] 电子科大 {{{ 版本:0.3 beta 2007-5-18 |
Line 20: | Line 22: |
[http://blog.csdn.net/zuroc 我的技术Blog] [http://www.cppblog.com/zuroc 我的C++Blog] [http://www.cnweblog.com/zuroc/ 我的文学Blog] . -- 欢迎指出错误和遗漏,提出建议和意见, 请发信到[email protected] == 语法 == === if === {{{ x=int(raw_input("Please enter an integer:")) |
[http://zsp.javaeye.com 我的Blog] -- 欢迎指出错误和遗漏,提出建议和意见, 请发信到[email protected] = 阅读须知 = 文中使用 {{{ >>> }}} 作为会命令行中的输出信息的前缀 对于不清楚用用途的函数可以在解释器下面输入 {{{ help(函数名) }}} 来获取相关信息 另外,自带的文档和google也是不可少的 = 基本语法 = == if / elif / else == {{{ x=int(raw_input("Please enter an integer:"))#获取行输入 |
Line 29: | Line 49: |
print 'Negative Number' | print '正数' |
Line 31: | Line 51: |
print 'Zero' | print '零' |
Line 33: | Line 53: |
print 'Positive Number' }}} === for === {{{ |
print '负数' }}} 此外C语言中类似"xxx?xxx:xxx"在Python中可以这样写 {{{ >>>number=8 >>>print "good" if 8==number else "bad" #当满足if条件时返回"good",否则返回"bad" good }}} == in == in判断 一个数 是否在 一个集合(如:元组,列表等) 中 {{{ if 'yes' in ('y','ye','yes'):print 'ok' }}} == for ... in == python中没有类似C中的for循环,而是使用for...in来对集合中的每一个元素进行操作 {{{ |
Line 42: | Line 76: |
#如果要修改a的内容,则用a的副本循环,如: {{{ for x in a[:] : ..................... }}} {{{ >>>range(10,0,-3) [10,7,4,1] a=['cat','door','example'] for i in range(len(a)): print i,a[i] }}} break,continue 用法和C++中类似 === pass === |
如果要修改a的内容,请用a的副本循环(否则不安全),如: {{{ a=["cat","[email protected]"] for x in a[:]: if len(x)>6:a.insert(0,x) >>>a ['[email protected]', 'cat', '[email protected]'] }}} 若需要得到循环的次数,参见 函数 range 的用法 == break / continue == 这两个的用法和C中相同 {{{ for i in range(10): if 2==i:continue #结束当前循环,进入下一步循环 if 6==i:break #跳出循环 print i }}} 输出 {{{ 0 1 3 4 5 }}} == while / pass == |
Line 63: | Line 107: |
pass #忽略,什么也不做 }}} {{{ def fib(n=1000):#参数可以有默认值,多个可选参数赋值可以直接写"参数变量名=值"来快速赋值 |
pass #什么也不做 }}} == is == 用来比较两个变量是否指向同一内存地址(也就是两个变量是否等价) 而 == 是用来比较两个变量是否逻辑相等 {{{ a=[1,2] b=[1,2] >>> a is b False >>> a == b True }}} == del == 用于删除元素 {{{ a=[1,2,3,4,5,6] del a[0] a >>>[2,3,4,5,6] del a[2:4] a >>>[2,3,6] del a[:] a >>>[] del a a #抛出异常 >>>NameError: name 'a' is not defined }}} == try ... except ... finally / raise == try ... except用于异常处理 {{{ try: x=int(raw_input("请输入数字:")) except ValueError: #可以同时捕获多个异常,写法如except(RuntimeError,ValueError): #当输入非数字时 print"您输入不是数字" except: #省略异常名,可以匹配所有异常,慎用 pass else:#当没有异常时 print 'result=',result finally:#和Java中类似。一般用于释放资源,如文件,网络连接。 print 'finish' }}} raise用于抛出异常,可以为自定义的异常类 惯例是以Error结尾的类,同类的异常一般派生自同一个基类(如Exception) {{{ class MyError(Exception): def __init__(self,value): self.value=value def __str__(self): return reper(self.value) }}} 基类异常可以匹配派生类异常 {{{ try: raise Exception("spam","egg") except Exception,inst:#inst为该异常类的实例,为可选项 print type(inst) #异常的类型 print inst }}} = 内建类型 = == None == None 表示该值不存在,比如 没有定义返回值 的函数就 返回None == Ture / False == 布尔类型,Ture等价于1,False等价于0 == List == {{{ >>>test=[1,2,"yes"] }}} === 内建函数 === append(x) 追加到链尾 extend(L) 追加一个列表,等价于+= insert(i,x) 在位置i插入x remove(x) 删除第一个值为x的元素,如果不存在会抛出异常 reverse() 反转序列 pop([i]) 返回并删除位置为i的元素,i默认为最后一个元素(i两边的[]表示i为可选的,实际不用输入) index(x) 返回第一个值为x的元素,不存在则抛出异常 count(x) 返回x出现的次数 sort() 排序 例子: {{{ >>>test=[1,2,"yes"] >>>test.append(1) #追加到链尾 >>>test [1, 2, 'yes', 1] >>>test.extend([ 'no','maybe']) #追加一个列表 >>>test [1, 2, 'yes', 1, 'no', 'maybe'] >>> test.insert(0,'never') #在位置0插入'never' >>> test ['never', 1, 2, 'yes', 1, 'no', 'maybe'] >>> test.remove('no') #删除第一个值为"no"的元素,如果不存在会抛出异常 >>> test ['never', 1, 2, 'yes', 1, 'maybe'] >>> test.reverse() #反转序列 >>> test ['maybe', 1, 'yes', 2, 1, 'never'] >>> test.pop() #返回并删除位置为i的元素,i默认为最后一个元素 'never' >>> test ['maybe', 1, 'yes', 2, 1] >>> test.index('yes') #返回第一个值为'yes'的元素,不存在则抛出异常 2 >>> test.count(1) #返回1出现的次数 2 >>>test.sort() #排序 >>> test [1, 1, 2, 'maybe', 'yes'] }}} === 列表推导式 === 可以直接通过for循环生成一个list {{{ >>>freshfruit=[' banana ',' loganberry '] >>>[weapon.strip() for weapon in freshfruit] ['banana', 'loganberry'] }}} 说明:strip()是去除字符串两端多于空格,该句是去除序列中的所有字串两端多余的空格 {{{ >>>vec=[2,4,6] >>>[3*x for x in vec if x>3] [12, 18] }}} {{{ >>>[(x,x**2) for x in vec] #循环变量要是一个sequence,而[x,x**2 for x in vec]是错误的 [(2,4),(4,16),(6,36)] }}} {{{ >>>vec2=[4,3,-9] >>>[x*y for x in vec for y in vec2] [8, 6, -18, 16, 12, -36, 24, 18, -54] >>>[vec[i]+vec2[i] for i in range(len(vec))] [6, 7, -3] }}} {{{ >>>[str(round(355/113.0,i)) for i in range(1,6)] #str()是转换类型为可以打印的字符 #round(x,n)表示对x保留n位小数(四舍五入) ['3.1', '3.14', '3.142', '3.1416', '3.14159'] }}} == 元组 == 一旦初始化便不能更改的数据结构,速度比list快 {{{ >>>t=1234,5567,'hello' #t=(1234,5567,'hello')的简写 >>>x,y,z=t #拆分操作可以应用于所有sequence >>>x 1234 >>>u=t,(1,2,3) >>>u ((1234,5567,'hello'),(1,2,3)) >>>empty=() #空元组 >>>singleton='hi', #单个元素的元组,注意逗号 }}} 通过元组可以很简单的进行数据交换. 比如: {{{ a=1 b=2 a,b=b,a }}} == set == set(集合):无序不重复的元素集 {{{ >>>basket = ['apple','orange','apple','pear','apple','banana'] >>>fruit=set(basket) >>>fruit set(['orange', 'pear', 'apple', 'banana']) >>>'orange' in fruit True >>>a=set('abracadabew') >>>a set(['a', 'c', 'b', 'e', 'd', 'r', 'w']) >>>b=set('wajgwaoihwb') >>>b set(['a', 'b', 'g', 'i', 'h', 'j', 'o', 'w']) >>>a-b #差 set(['c', 'r', 'e', 'd']) >>>a|b #并 set(['a', 'c', 'b', 'e', 'd', 'g', 'i', 'h', 'j', 'o', 'r', 'w']) >>>a&b #交 set(['a', 'b', 'w']) >>>a^b #(并-交) set(['c', 'e', 'd', 'g', 'i', 'h', 'j', 'o', 'r']) }}} == dict == 字典:关键字为不可变类型,如字符串,整数,只包含不可变对象的元组. 列表等不可以作为关键字. 如果列表中存在关键字对,可以用dict()直接构造字典.而这样的列表对通常是由列表推导式生成的. {{{ >>>tel={'jack':4098,'sape':4139} >>>tel['guido']=4127 >>>tel {'sape': 4139, 'jack': 4098, 'guido': 4127} >>>tel['jack'] #如果jack不存在,会抛出KeyError 4098 >>>a.get("zsp",5000) #如果"zsp"为tel的键则返回其值,否则返回5000 >>>del tel['sape'] #删除键'sape'和其对应的值 >>>tel.keys() #复制一份键的副本,同理tel.items()为值的副本 ['jack', 'guido'] >>>"jack" in tel #判断"jack"是否tel的键 True >>>"zsp" not in tel True >>>for k,v in tel.iteritems():print k,v #同理tel.iterkeys()为键的迭代器,tel.itervalues()为值的迭代器 jack 4098 guido 4127 >>>tel.copy() #复制一份tel {'jack': 4098, 'guido': 4127} >>> tel.fromkeys([1,2],0) #从序列生成并返回一个字典,其值为第二个参数(默认为None),不改变当前字典 {1: 0, 2: 0} >>>tel.popitem() #弹出一项 ('jack', 4098) }}} = 函数相关 = == 函数定义 / 参数默认值 == {{{ def fib(n=2,a=1):#参数可以有默认值 |
Line 69: | Line 408: |
a,b=0,1 while b<n: print b a,b=b,a+b }}} #函数可以重命名,如 {{{ f=fib f(223) }}} === in === . {{{ if 'yes' in ('y','ye','yes'):print 'ok' }}} === 参数格式 **para === #参数格式为 **para 表示接受一个字典,为 *para 表示接受一个元组 {{{ def test(para1,*args,**dic): print para1 for arg in args : print arg keys=dic.keys() keys.sort() for key in keys:print key ,':',dic[key] }}} === Lambda函数 === . {{{ |
for i in range(n): print a >>>f=fib #可以用一个变量表示函数 >>>f(3) 1 1 1 >>>fib(a=2) #多个可选参数赋值可以直接写"参数变量名=值"来快速赋值 2 2 }}} == Lambda函数 == 一种无名函数的速写法 {{{ |
Line 103: | Line 429: |
Line 104: | Line 431: |
>>>f(0) 42 >>>f(1) 43 }}} === List的函数 === {{{ append(x) 追加到链尾 extend(L) 追加一个列表 insert(i,x) 在位置i插入x remove(x) 删除第一个值为x的元素,如果不存在会抛出异常 pop([i]) 返回并删除位置为i的元素,i未给定时默认作用在最后一个元素.[i]表示i为可选的 index(x) 返回第一个值为x的元素,不存在则抛出异常 count(x) 返回x出现的次数 sort() 排序 reverse() 翻转,反转 }}} {{{filter(function函数 , sequence序列) }}} 返回sequence中使filer为true的 {{{map(function,sequence,[sequence...]) }}} 返回新的sequence,序列中值为对每个元素分别调用function. {{{reduce(function,sequence,[init]) }}} 返回一个单值为,计算步骤为 : |
#f等价于 #def f(x): # return x+n }}} == 不定长参数 *para,**para == 参数格式为 *para 表示接受一个元组 为 **para 表示接受一个字典 *para要在**para之前 {{{ def test(*args,**dic): for arg in args : print arg for k,v in dic.iteritems(): print k ,':',v >>> test("yes",1,2,me="张沈鹏",where="中国") #"yes",1,2传递给元组;me="张沈鹏",where="中国"传递给字典 yes 1 2 me : 张沈鹏 where : 中国 }}} == @ 装饰器 == @A def B:pass 等价于 def B:pass B=A(B) 即将函数B作为参数传给参数A {{{ from time import time #测试运行时间 def cost_time(func): def result(*args,**dic): beign=time() func(*args,**dic) print "cost time : ",time()-beign return result @cost_time def show(n): for x in range(n):print x >>> show(10) 0 1 2 3 4 5 6 7 8 9 cost time : 0.0469999313354 }}} == 生成器表达式 == 生成器表达式:类似于没有中括号的列表推导式,可用在参数中 {{{ >>>sum(i*i for i in range(10)) 285 >>>unique_words=set(word for line in page for word in line.split())#page为打开的文件 >>>data='golf' >>>list(data[i] for i in range(len (data)-1,-1,-1)) ['f','l','o','g'] }}} == yield == 每次调用next()(即for...in所用的迭代器)时返回一个值,并记录当前执行位置所有的变量 {{{ def reverse(data): for index in range(len(data)-1,-1,-1): yield data[index] for char in reverse("golf"): print char, }}} 输出 {{{ f l o g }}} = 常用函数 = == help == help(类/函数) 返回相应对象的文档字符串 {{{ >>> help(vars) Help on built-in function vars in module __builtin__: vars(...) vars([object]) -> dictionary Without arguments, equivalent to locals(). With an argument, equivalent to object.__dict__. }}} == len == 返回序列/字典的长度 {{{ >>> len([1,2,3]) 3 }}} == print == {{{ for x in xrange(1,11): print repr(x).rjust(2),repr(x*x).rjust(3) #repr是将变量类型转换为可以被编译器处理的文字格式 #rjust是调整宽度为参数个字符,r表示右对齐;ljust为左对齐,ljust(n)[:n]可以截断输出;center为居中 #zfill()可以向数值表达式的左侧填充0 }}} 输出 {{{ 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100 }}} {{{ for x in xrange(1,11): print '%2d %3d' % (x,x*x) #%10s 表示用str转化为字符串 #小数输出如 %5.3f }}} 对于字典可以用变量名来直接格式化,如: {{{ >>>table={'Sjoerd':4127,'Jack':4098,'Dcab':8637678} >>>print 'Jack:%(Jack)d; Sjoerd:%(Sjoerd)d; Dcab:%(Dcab)d' % table Jack:4098; Sjoerd:4127; Dcab:8637678 }}} 同时,函数vars()返回包含所有变量的字典,配合使用,无坚不摧! == raw_input == {{{ x=raw_input("Please enter an sentence:") #将输入的内容赋值给x }}} == range == {{{ range(10,0,-3)#参数的含义为起点(默认为0),终点(不含终点),步长(默认为1) >>>[10,7,4,1] }}} 和for...in配合使用 {{{ a=['cat','door','example'] for i in range(len(a)):#len()函数为求序列的长度 print i,a[i] }}} == filter == filter(function , sequence) 返回序列,为原序列中能使function返回true的值 {{{ >>>a=[1,2,3,4] >>>filter(lambda x:x%2,a) [1, 3] }}} == map == map(function,sequence,[sequence...]) 返回序列,为对原序列每个元素分别调用function获得的值. 可以传入多个序列,但function也要有相应多的参数,如 map(lambda x,y,z:x+y+z,range(1,3),range(3,5),range(5,7)) 计算过程为 1+3+5=9 2+4+6=12 返回[9,12] == reduce == reduce(function,sequence,[init]) 返回一个单值为,计算步骤为 : |
Line 130: | Line 635: |
* 如果有init,则先调用 {{{function(init,sequence[0]) }}} sequence只有一个元素时,返回该元素,为空时抛出异常. === 列表推导式 === {{{ freshfruit=[' banana ',' loganberry '] >>>[weapon.strip() for weapon in freshfruit] ['banana','loganberry'] vec=[2,4,6] >>>[3*x for x in vec if x>3] [12,18] >>>[(x,x**2) for x in vec] #一个元素一定要是一个sequence,而 [x,x**2 for x in vec]是错误的 [(2,4),(4,16),(6,36)] vec2=[4,3,-9] [x*y for x in vec for y in vec2] [vec[i]+vec2[i] for i in range(len(vec))] [str(round(355/113.0,i)) for i in range(1,6)] #str()是转换类型为可以打印的字符 }}} === del === {{{ a=[1,2,3,4,5,6] del a[0] >>>a [2,3,4,5,6] del a[2:4] >>>a [2,3,6] del a[:] >>>a [] del a >>>a }}} 抛出异常 === 元组 === {{{ t=1234,5567,'hello' x,y,z=t #拆分操作可以应用于所有sequence >>>x 1234 u=t,(1,2,3) >>>u ((1234,5567,'hello'),(1,2,3)) empty=() #空元组 singleton='hi', #单个元素的元组 }}} === set === set(集合):无序不重复的元素集 {{{ basket = ['apple','orange','apple','pear','apple','banana'] fruit=set(basket) >>>fruit set(['orange', 'pear', 'apple', 'banana']) >>>'orange' in fruit True a=set('abracadabew') >>>a set(['a', 'c', 'b', 'e', 'd', 'r', 'w']) b=set('wajgwaoihwb') >>> b set(['a', 'b', 'g', 'i', 'h', 'j', 'o', 'w']) >>> a-b #差 set(['c', 'r', 'e', 'd']) >>> a|b #并 set(['a', 'c', 'b', 'e', 'd', 'g', 'i', 'h', 'j', 'o', 'r', 'w']) >>> a&b #交 set(['a', 'b', 'w']) >>>a^b #(并-交) set(['c', 'e', 'd', 'g', 'i', 'h', 'j', 'o', 'r']) }}} === dict === 字典:关键字为不可变类型,如字符串,整数,只包含不可变对象的元组.列表等不可以作为关键字.如果列表中存在关键字对,可以用dict()直接构造字典.而这样的列表对通常是由列表推导式生成的. {{{ tel={'jack':4098,'sape':4139} tel['guido']=4127 >>> tel {'sape': 4139, 'jack': 4098, 'guido': 4127} >>>tel['jack'] 4098 del tel['sape'] >>>tel.keys() ['jack', 'guido'] >>>tel.has_key('jack') True knight={'gallahad':'the pure','robin':'the brave'} for k,v in knight.iteritems(): print k,v }}} 输出: {{{ gallahad the pure robin the brave }}} enumerate()返回索引位置和对应的值 {{{ for i,v in enumerate(['tic','tac','toe']) print i,v }}} 输出: 0 tic 1 tac 2 toe === None === 表示该值不存在 === zip === |
* 如果有init,则先调用{{{function(init,sequence[0]) }}} * sequence只有一个元素时,返回该元素,为空时抛出异常. 如 {{{reduce(lambda x,y:x+y,range(3),99)}}} 的计算为 99+0=99 => 99+1=100 => 100+2=102 返回102 注:实际使用中用内建函数sum来完成这个累加更合适,如这里等价sum(range(3),99) == zip == |
Line 251: | Line 649: |
{{{ |
{{{ |
Line 256: | Line 652: |
Line 259: | Line 656: |
Line 260: | Line 658: |
Line 266: | Line 663: |
=== reversed反向循环 === | == reversed反向循环 == |
Line 271: | Line 669: |
Line 273: | Line 672: |
Line 279: | Line 677: |
=== sorted排序 === === sequence比大小 === list<string<tuple(因为字母表中l在s前...) 同类比大小按照字典序 === 导入模块 === |
== sorted排序 == 返回一个有序的新序列 {{{ >>>sorted([2,5,1,4]) [1, 2, 4, 5] }}} == enumerate 返回索引位置和对应的值 == {{{ for i,v in enumerate(['tic','tac','toe']) print i,v }}} 输出: {{{ 0 tic 1 tac 2 toe }}} == open/文件操作 == f=open('/tmp/hello','w') #open(路径+文件名,读写模式) #读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件.常用模式 如:'rb','wb','r+b'等等 f.read([size]) size未指定则返回整个文件,如果文件大小>2倍内存则有问题.f.read()读到文件尾时返回""(空字串) file.readline() 返回一行 file.readline([size]) 返回包含size行的列表,size 未指定则返回全部行 for line in f: print line #通过迭代器访问 f.write("hello\n") #如果要写入字符串以外的数据,先将他转换为字符串. f.tell() 返回一个整数,表示当前文件指针的位置(就是到文件头的比特数). f.seek(偏移量,[起始位置]) 用来移动文件指针 偏移量:单位:比特,可正可负 起始位置:0-文件头,默认值;1-当前位置;2-文件尾 f.close() 关闭文件 = 模块化 = == 导入模块 == |
Line 321: | Line 763: |
=== 包 === | == 包 == |
Line 347: | Line 789: |
只有当__init__.py存在时python才将该文件夹视为一个包,该文件可以为空文件 一般在__init__.py文件中定义一个__all__列表,包含要import *时要导入的模块. 如Sound/Effects/__init__.py可以有如下内容 | 只有当__init__.py存在时python才将该文件夹视为一个包. 该文件可以为空文件 一般在__init__.py文件中定义一个__all__列表,包含要import *时要导入的模块. 如Sound/Effects/__init__.py可以有如下内容 |
Line 359: | Line 804: |
=== 格式化输出 === {{{ for x in xrange(1,11): print repr(x).rjust(2),repr(x*x).rjust(3) #repr是将变量类型转换为可以被编译器处理的文字格式 #rjust是调整宽度为参数个字符,r表示右对齐;ljust为左对齐,ljust(n)[:n]可 以截断输出;center为居中 #zfill()可以向数值表达式的左侧填充0 }}} === 等效代码 === {{{ for x in xrange(1,11): print '%2d %3d' % (x,x*x) #%10s 表示用str转化为字符串 #小数输出如 %5.3f }}} 对于字典可以用变量名来直接格式化,如: {{{ >>>table={'Sjoerd':4127,'Jack':4098,'Dcab':8637678} >>>print 'Jack:%(Jack)d; Sjoerd:%(Sjoerd)d; Dcab:%(Dcab)d' % table Jack:4098; Sjoerd:4127; Dcab:8637678 }}} 同时,函数vars()返回包含所有变量的字典,配合使用,无坚不摧! === 读写文件: === f=open('/tmp/hello','w') #open(路径+文件名,读写模式) #读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件.常用模式 如:'rb','wb','r+b'等等 f.read([size]) size未指定则返回整个文件,如果文件大小>2倍内存则有问题.f.read()读到文件尾时返回""(空字串) file.readline() 返回一行 file.readline([size]) 返回包含size行的列表,size 未指定则返回全部行 for line in f: #交换通道 . print line f.write("hello\n") #如果要写入字符串以外的数据,先将他转换为字符串. f.tell() 返回一个整数,表示当前文件指针的位置(就是到文件头的比特数). f.seek(偏移量,[起始位置]) 用来移动文件指针 偏移量:单位:比特,可正可负 起始位置:0-文件头,默认值;1-当前位置;2-文件尾 f.close() 关闭文件 ---------- === pickle === pickle 序列化/保存对象/封装 pickle.dump(x,f) #把文件对象f保存到x变量中 x=pickle.load(f) #还原这个对象 ---------- try: . ............. except 异常类型: #如果有多个异常类型,可以将他们放在括号()中 #如except(RuntimeError,TypeError,NameError): . .............. 最后一个异常名可以省略异常类型,作为通配项将所有异常pass.慎用!!! 在except后可以包含一个else raise可以抛出异常,同时可以附带异常参数 try: . rasie Exception('message1','message2') #只有一个参数时也可以这样写rasie Exception,'message1' except Exception,inst: . #inst是该异常类的一个实例 print inst.args #打印出参数名 print inst #直接打印__str__属性 x,y=inst print 'x=',x print 'y=',y 如果抛出异常没有指定参数,则捕获异常时的参数包含的是该异常的默认信息 >>>try: . 1/0 . except ZeroDivisionError,detail: . print 'Handling run-time error:',detail Handling run-time error:integer division or modulo by zero ---------- 自定义异常:惯例是以Error结尾的类,同类的异常一般派生自同一个基类,基类异常可以匹配派生类异常 class MyError(Exception): . def __init__(self,value): . self.value=value def __str__(self): . return reper(self.value) try: . raise MyError(2,2) except MyError,e: . print 'My exeception occurred,value',e.value >>> My exeception occurred,value 4 ---------- finally:和C++中类似,即使是break,continue或return后一样会执行。一般用于释放资源,如文件,网络连接。 def divide(x,y): . try: . try: . result=x/y except ZeroDivisionError: . print "zero" else: . print 'result=',result finally: . print 'finish' ---------- with #with可以帮助你自动释放资源,下一个版本可用 with open('myfile.txt') as f: . for line in f: . print line #该文件会自动被释放 ---------- === 初识类 === |
== 面向对象 == === 概要 === {{{ |
Line 505: | Line 808: |
. "类文档,可以通过类名.__doc__访问" #类的私有变量是至少以双下划线开头,最多以单下划线结尾的类变量,调用时会变量名会被混淆成 _ClassName__变量名 __ i=12345 def f(self) . return "hello world" . def __init(self)__: . "构造函数,可以初始化变量,可以有参数" #可以通过self调用当前类的函数和数据 self.data=[] #创建类实例 x=ClassName() #给类的方法重命名 xf=ClassName.f ---------- ==== 类继承 ==== |
"类文档,可以通过类名.__doc__访问" def f(self): return self.content def __init__(self,word=''): #构造函数,可以初始化变量,可以有参数" self.content=word }}} 创建类实例 {{{x=ClassName("good")}}} === 类继承 === |
Line 524: | Line 820: |
. ................................... |
pass |
Line 535: | Line 831: |
---------- |
|
Line 542: | Line 836: |
................. |
pass |
Line 547: | Line 840: |
---------- === Iterators 迭代器 === for element in [1,2,3]: . print element for key in {'one':1,'two':2}: . print key for line in open("my.txt"): . print line 在容器中定义next()逐一返回元素,并在迭代完成时抛出StopIteration异常,然后定义__iter__()返回self,便可以for...in循环 用Generators(生成器)可以快速生成一个序列,在调用next()时依次返回序列中的值. def reverse(data): . for index in range(len(data)-1,-1,-1): . yield data[index] #yield会自动创建next()和__iter__(),每次调用next()时yield会进行下一步循环,并在yield处返回值 ---------- === 生成器表达式 === 生成器表达式:类似于没有中括号的列表推导式,可用在参数中 >>>sum(i*i for i in range(10)) 285 >>>xvec=[10,20,30] >>>yvec=[7,5,3] >>>sum(x*y for x,y in zip(xvec,yvec)) . 260 >>>from math import pi,sin >>>sine_table=dict((x,sin(x*pi/180) for x in range(1,91)) >>>unique_words=set(word for line in page for word in line.split()) >>>data='golf' >>>list(data[i] for i in range(len (data)-1,-1,-1)) ['f','l','o','g'] ---------- == 常用函数不完全手册 == dir(模块) #来获取模块的函数/变量列表 help(模块/函数) #获取相关的帮助 ---------- 模块:os . 与操作系统相关的函数 例: import os os.getcwd() #当前脚本的工作目录 os.chidr() #改变当前工作目录 ---------- 模块:shutil . 目录和文件管理的接口 例: import shutil shutil.copyfile('data.txt','archive.txt') shutil.move('/build/a.txt','b.txt') ---------- 模块:glob 生成文件列表,支持通配符 例: import glob >>>glob.glob('*.py') ['primes.py','random.py','quote.py'] ---------- 模块:sys 提供命令行参数,错误输出重定向和脚本终止 例: 命令行参数 如执行python demo.py one,two,three后 import sys print sys.argv 会输出 ['demo.py','one','two','three'] 终止脚本 sys.exit() 错误输出重定向,可以在stdout被重定向时显示错误信息 >>>sys.stderr.write('Warning , log file not found starting a new one\n') Warning , log file not found starting a new one ---------- 模块:re 字符正值表达式匹配 例: import re >>>re.findall(r'\bf[a-z]*','which foot or hand fell fastest') ['foot','fell','fastest'] >>>re.sub(r'(\b[a-z]+)\l',r'\l','cat in the hat') 'cat in the hat ---------- 模块:math 为浮点运算提供了底层C函数库的访问 例: >>>math.cos(math.pi/4.0) 0.70710678118654757 >>>math.log(1024,2) 10.0 ---------- 模块:random 生成随机数 例: import random >>>random.choice(['apple','pear','banana']) 'apple' >>> random.sample(xrange(100),10) #随机值不会重复 [20,42,12,44,57,88,93,80,75,56] >>>random.random() 0.26676389968666669 >>> random.randrange(10) 7 ---------- 模块:urblib2 打开url地址 例: for line in urllib2.urlopen('http:\\www.python.org\') . print line ---------- 模块:smtplib 发送电子邮件 例: sever=smtplib.smtp('localhost') sever.sendmail(' [email protected] ',' [email protected] ') """TO:[email protected] From:[email protected] """ sever.quit() ---------- 模块:datetime 时间 |
---- [[Include(PyCommonUsageMod)]] |
Python 绝对简明手册 -- [email protected] ::-- ZoomQuiet [DateTime(2006-09-15T04:35:33Z)] TableOfContents
简述
学而易忘,需时速查.
- -- For Python2.5
作者:[wiki:zsp 张沈鹏] 电子科大
版本:0.3 beta 2007-5-18 参考:python2.5中文教程 感谢:Zoom.Quiet limodou
[http://zsp.javaeye.com 我的Blog]
-- 欢迎指出错误和遗漏,提出建议和意见, 请发信到[email protected]
1. 阅读须知
文中使用
>>>
作为会命令行中的输出信息的前缀
对于不清楚用用途的函数可以在解释器下面输入
help(函数名)
来获取相关信息
另外,自带的文档和google也是不可少的
2. 基本语法
2.1. if / elif / else
x=int(raw_input("Please enter an integer:"))#获取行输入 if x<0: print '正数' elif x==0: print '零' else: print '负数'
此外C语言中类似"xxx?xxx:xxx"在Python中可以这样写
>>>number=8 >>>print "good" if 8==number else "bad" #当满足if条件时返回"good",否则返回"bad" good
2.2. in
in判断 一个数 是否在 一个集合(如:元组,列表等) 中
if 'yes' in ('y','ye','yes'):print 'ok'
2.3. for ... in
python中没有类似C中的for循环,而是使用for...in来对集合中的每一个元素进行操作
a=['cat','door','example'] for x in a: print x
如果要修改a的内容,请用a的副本循环(否则不安全),如:
a=["cat","[email protected]"] for x in a[:]: if len(x)>6:a.insert(0,x) >>>a ['[email protected]', 'cat', '[email protected]']
若需要得到循环的次数,参见 函数 range 的用法
2.4. break / continue
这两个的用法和C中相同
for i in range(10): if 2==i:continue #结束当前循环,进入下一步循环 if 6==i:break #跳出循环 print i
输出
0 1 3 4 5
2.5. while / pass
while True: pass #什么也不做
2.6. is
用来比较两个变量是否指向同一内存地址(也就是两个变量是否等价) 而 == 是用来比较两个变量是否逻辑相等
a=[1,2] b=[1,2] >>> a is b False >>> a == b True
2.7. del
用于删除元素
a=[1,2,3,4,5,6] del a[0] a >>>[2,3,4,5,6] del a[2:4] a >>>[2,3,6] del a[:] a >>>[] del a a #抛出异常 >>>NameError: name 'a' is not defined
2.8. try ... except ... finally / raise
try ... except用于异常处理
try: x=int(raw_input("请输入数字:")) except ValueError: #可以同时捕获多个异常,写法如except(RuntimeError,ValueError): #当输入非数字时 print"您输入不是数字" except: #省略异常名,可以匹配所有异常,慎用 pass else:#当没有异常时 print 'result=',result finally:#和Java中类似。一般用于释放资源,如文件,网络连接。 print 'finish'
raise用于抛出异常,可以为自定义的异常类
惯例是以Error结尾的类,同类的异常一般派生自同一个基类(如Exception)
class MyError(Exception): def __init__(self,value): self.value=value def __str__(self): return reper(self.value)
基类异常可以匹配派生类异常
try: raise Exception("spam","egg") except Exception,inst:#inst为该异常类的实例,为可选项 print type(inst) #异常的类型 print inst
3. 内建类型
3.1. None
None 表示该值不存在,比如 没有定义返回值 的函数就 返回None
3.2. Ture / False
布尔类型,Ture等价于1,False等价于0
3.3. List
>>>test=[1,2,"yes"]
3.3.1. 内建函数
append(x) 追加到链尾
extend(L) 追加一个列表,等价于+=
insert(i,x) 在位置i插入x
remove(x) 删除第一个值为x的元素,如果不存在会抛出异常
reverse() 反转序列
pop([i]) 返回并删除位置为i的元素,i默认为最后一个元素(i两边的[]表示i为可选的,实际不用输入)
index(x) 返回第一个值为x的元素,不存在则抛出异常
count(x) 返回x出现的次数
sort() 排序
例子:
>>>test=[1,2,"yes"] >>>test.append(1) #追加到链尾 >>>test [1, 2, 'yes', 1] >>>test.extend([ 'no','maybe']) #追加一个列表 >>>test [1, 2, 'yes', 1, 'no', 'maybe'] >>> test.insert(0,'never') #在位置0插入'never' >>> test ['never', 1, 2, 'yes', 1, 'no', 'maybe'] >>> test.remove('no') #删除第一个值为"no"的元素,如果不存在会抛出异常 >>> test ['never', 1, 2, 'yes', 1, 'maybe'] >>> test.reverse() #反转序列 >>> test ['maybe', 1, 'yes', 2, 1, 'never'] >>> test.pop() #返回并删除位置为i的元素,i默认为最后一个元素 'never' >>> test ['maybe', 1, 'yes', 2, 1] >>> test.index('yes') #返回第一个值为'yes'的元素,不存在则抛出异常 2 >>> test.count(1) #返回1出现的次数 2 >>>test.sort() #排序 >>> test [1, 1, 2, 'maybe', 'yes']
3.3.2. 列表推导式
可以直接通过for循环生成一个list
>>>freshfruit=[' banana ',' loganberry '] >>>[weapon.strip() for weapon in freshfruit] ['banana', 'loganberry']
说明:strip()是去除字符串两端多于空格,该句是去除序列中的所有字串两端多余的空格
>>>vec=[2,4,6] >>>[3*x for x in vec if x>3] [12, 18]
>>>[(x,x**2) for x in vec] #循环变量要是一个sequence,而[x,x**2 for x in vec]是错误的 [(2,4),(4,16),(6,36)]
>>>vec2=[4,3,-9] >>>[x*y for x in vec for y in vec2] [8, 6, -18, 16, 12, -36, 24, 18, -54] >>>[vec[i]+vec2[i] for i in range(len(vec))] [6, 7, -3]
>>>[str(round(355/113.0,i)) for i in range(1,6)] #str()是转换类型为可以打印的字符 #round(x,n)表示对x保留n位小数(四舍五入) ['3.1', '3.14', '3.142', '3.1416', '3.14159']
3.4. 元组
一旦初始化便不能更改的数据结构,速度比list快
>>>t=1234,5567,'hello' #t=(1234,5567,'hello')的简写 >>>x,y,z=t #拆分操作可以应用于所有sequence >>>x 1234 >>>u=t,(1,2,3) >>>u ((1234,5567,'hello'),(1,2,3)) >>>empty=() #空元组 >>>singleton='hi', #单个元素的元组,注意逗号
通过元组可以很简单的进行数据交换. 比如:
a=1 b=2 a,b=b,a
3.5. set
set(集合):无序不重复的元素集
>>>basket = ['apple','orange','apple','pear','apple','banana'] >>>fruit=set(basket) >>>fruit set(['orange', 'pear', 'apple', 'banana']) >>>'orange' in fruit True >>>a=set('abracadabew') >>>a set(['a', 'c', 'b', 'e', 'd', 'r', 'w']) >>>b=set('wajgwaoihwb') >>>b set(['a', 'b', 'g', 'i', 'h', 'j', 'o', 'w']) >>>a-b #差 set(['c', 'r', 'e', 'd']) >>>a|b #并 set(['a', 'c', 'b', 'e', 'd', 'g', 'i', 'h', 'j', 'o', 'r', 'w']) >>>a&b #交 set(['a', 'b', 'w']) >>>a^b #(并-交) set(['c', 'e', 'd', 'g', 'i', 'h', 'j', 'o', 'r'])
3.6. dict
字典:关键字为不可变类型,如字符串,整数,只包含不可变对象的元组.
列表等不可以作为关键字.
如果列表中存在关键字对,可以用dict()直接构造字典.而这样的列表对通常是由列表推导式生成的.
>>>tel={'jack':4098,'sape':4139} >>>tel['guido']=4127 >>>tel {'sape': 4139, 'jack': 4098, 'guido': 4127} >>>tel['jack'] #如果jack不存在,会抛出KeyError 4098 >>>a.get("zsp",5000) #如果"zsp"为tel的键则返回其值,否则返回5000 >>>del tel['sape'] #删除键'sape'和其对应的值 >>>tel.keys() #复制一份键的副本,同理tel.items()为值的副本 ['jack', 'guido'] >>>"jack" in tel #判断"jack"是否tel的键 True >>>"zsp" not in tel True >>>for k,v in tel.iteritems():print k,v #同理tel.iterkeys()为键的迭代器,tel.itervalues()为值的迭代器 jack 4098 guido 4127 >>>tel.copy() #复制一份tel {'jack': 4098, 'guido': 4127} >>> tel.fromkeys([1,2],0) #从序列生成并返回一个字典,其值为第二个参数(默认为None),不改变当前字典 {1: 0, 2: 0} >>>tel.popitem() #弹出一项 ('jack', 4098)
4. 函数相关
4.1. 函数定义 / 参数默认值
def fib(n=2,a=1):#参数可以有默认值 """这里给函数写文档注释""" for i in range(n): print a >>>f=fib #可以用一个变量表示函数 >>>f(3) 1 1 1 >>>fib(a=2) #多个可选参数赋值可以直接写"参数变量名=值"来快速赋值 2 2
4.2. Lambda函数
一种无名函数的速写法
def make_incrementor(n): return lambda x: x+n f=make_incrementor(n) #f等价于 #def f(x): # return x+n
4.3. 不定长参数 *para,**para
参数格式为 *para 表示接受一个元组
为 **para 表示接受一个字典
*para要在**para之前
def test(*args,**dic): for arg in args : print arg for k,v in dic.iteritems(): print k ,':',v >>> test("yes",1,2,me="张沈鹏",where="中国") #"yes",1,2传递给元组;me="张沈鹏",where="中国"传递给字典 yes 1 2 me : 张沈鹏 where : 中国
4.4. @ 装饰器
@A def B:pass 等价于 def B:pass B=A(B) 即将函数B作为参数传给参数A
from time import time #测试运行时间 def cost_time(func): def result(*args,**dic): beign=time() func(*args,**dic) print "cost time : ",time()-beign return result @cost_time def show(n): for x in range(n):print x >>> show(10) 0 1 2 3 4 5 6 7 8 9 cost time : 0.0469999313354
4.5. 生成器表达式
生成器表达式:类似于没有中括号的列表推导式,可用在参数中
>>>sum(i*i for i in range(10)) 285 >>>unique_words=set(word for line in page for word in line.split())#page为打开的文件 >>>data='golf' >>>list(data[i] for i in range(len (data)-1,-1,-1)) ['f','l','o','g']
4.6. yield
每次调用next()(即for...in所用的迭代器)时返回一个值,并记录当前执行位置所有的变量
def reverse(data): for index in range(len(data)-1,-1,-1): yield data[index] for char in reverse("golf"): print char,
输出
f l o g
5. 常用函数
5.1. help
help(类/函数) 返回相应对象的文档字符串
>>> help(vars) Help on built-in function vars in module __builtin__: vars(...) vars([object]) -> dictionary Without arguments, equivalent to locals(). With an argument, equivalent to object.__dict__.
5.2. len
返回序列/字典的长度
>>> len([1,2,3]) 3
5.3. print
for x in xrange(1,11): print repr(x).rjust(2),repr(x*x).rjust(3) #repr是将变量类型转换为可以被编译器处理的文字格式 #rjust是调整宽度为参数个字符,r表示右对齐;ljust为左对齐,ljust(n)[:n]可以截断输出;center为居中 #zfill()可以向数值表达式的左侧填充0
输出
1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100
for x in xrange(1,11): print '%2d %3d' % (x,x*x) #%10s 表示用str转化为字符串 #小数输出如 %5.3f
对于字典可以用变量名来直接格式化,如:
>>>table={'Sjoerd':4127,'Jack':4098,'Dcab':8637678} >>>print 'Jack:%(Jack)d; Sjoerd:%(Sjoerd)d; Dcab:%(Dcab)d' % table Jack:4098; Sjoerd:4127; Dcab:8637678
同时,函数vars()返回包含所有变量的字典,配合使用,无坚不摧!
5.4. raw_input
x=raw_input("Please enter an sentence:") #将输入的内容赋值给x
5.5. range
range(10,0,-3)#参数的含义为起点(默认为0),终点(不含终点),步长(默认为1) >>>[10,7,4,1]
和for...in配合使用
a=['cat','door','example'] for i in range(len(a)):#len()函数为求序列的长度 print i,a[i]
5.6. filter
filter(function , sequence) 返回序列,为原序列中能使function返回true的值
>>>a=[1,2,3,4] >>>filter(lambda x:x%2,a) [1, 3]
5.7. map
map(function,sequence,[sequence...])
返回序列,为对原序列每个元素分别调用function获得的值.
可以传入多个序列,但function也要有相应多的参数,如
map(lambda x,y,z:x+y+z,range(1,3),range(3,5),range(5,7))
计算过程为
1+3+5=9
2+4+6=12
返回[9,12]
5.8. reduce
reduce(function,sequence,[init])
返回一个单值为,计算步骤为 :
- 第1个结果=function(sequence[0],sequence[1])
- 第2个结果=function(第1个结果,sequence[2])
- 返回最后一个计算得值
如果有init,则先调用function(init,sequence[0])
- sequence只有一个元素时,返回该元素,为空时抛出异常.
如 reduce(lambda x,y:x+y,range(3),99) 的计算为
99+0=99 => 99+1=100 => 100+2=102
返回102
注:实际使用中用内建函数sum来完成这个累加更合适,如这里等价sum(range(3),99)
5.9. zip
zip用于多个sequence的循环
questions=['name','quest','favorite color'] answers=['lancelot','the holy grail','blue'] for q,a in zip(questions,answers): print 'What is your %s ? It is %s.'%(q,a)
输出:
What is your name ? It is lancelot. What is your quest ? It is the holy grail. What is your favorite color ? It is blue.
5.10. reversed反向循环
for i in reversed(range(1,4)): print i
输出:
3 2 1
5.11. sorted排序
返回一个有序的新序列
>>>sorted([2,5,1,4]) [1, 2, 4, 5]
5.12. enumerate 返回索引位置和对应的值
for i,v in enumerate(['tic','tac','toe']) print i,v
输出:
0 tic 1 tac 2 toe
5.13. open/文件操作
f=open('/tmp/hello','w')
#open(路径+文件名,读写模式)
#读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件.常用模式
如:'rb','wb','r+b'等等
f.read([size]) size未指定则返回整个文件,如果文件大小>2倍内存则有问题.f.read()读到文件尾时返回""(空字串)
file.readline() 返回一行
file.readline([size]) 返回包含size行的列表,size 未指定则返回全部行
for line in f: print line #通过迭代器访问
f.write("hello\n") #如果要写入字符串以外的数据,先将他转换为字符串.
f.tell() 返回一个整数,表示当前文件指针的位置(就是到文件头的比特数).
f.seek(偏移量,[起始位置])
用来移动文件指针
偏移量:单位:比特,可正可负
起始位置:0-文件头,默认值;1-当前位置;2-文件尾
f.close() 关闭文件
6. 模块化
6.1. 导入模块
模块的查找路径
1.当前的目录
2.环境变量PYTHONPATH所指的目录列表
3.python解释器的安装目录
如将代码保存上述的一个目录中的的fibo.py文件中,便可以
import fibo fibo.function().............
如果想直接使用fibo.function可以重命名这个函数,如
f=fibo.function f()
也可以
form fibo import function function()
甚至可以form fibo import *
可以 form 包.子包.模块 imort 函数
然后就直接使用该函数,不需要加前缀
6.2. 包
引用推荐写法为
form 包 import 模块
几个功能类似的模块可以组合成一个包,
比如一个可以处理.wav,.mp3,.wma等音频文件的有类似如下结构:
Sound/ __init__.py Formats/ __init__.py wavread.py wavwrite.py mp3read.py mp3write.py wmaread.py wmawrite.py Effects/ __init__.py echo.py surround.py reverse.py
只有当init.py存在时python才将该文件夹视为一个包.
该文件可以为空文件 一般在init.py文件中定义一个all列表,包含要import *时要导入的模块. 如Sound/Effects/init.py可以有如下内容
__all__=["echo","surround","reverse"]
包的作者在发布包时可以更新这个列表,也可以根据需要让某个模块不支持import *
对于包中同一个文件夹下的模块可以把
form 包.子包 imort 模块
简写为 imort 模块
6.3. 面向对象
6.3.1. 概要
class ClassName: "类文档,可以通过类名.__doc__访问" def f(self): return self.content def __init__(self,word=''): #构造函数,可以初始化变量,可以有参数" self.content=word
创建类实例 x=ClassName("good")
6.3.2. 类继承
class DerivedClassName(BassClassName):
- pass
如果基类定义在另一个模块中, 要写成
modname.BaseClassName
派生类的函数会覆盖基类的同名函数,如果想扩充而不是改写基类的函数,可以这样调用基类函数
BaseClassName.methodname(self,arguments)
注意:该基类要在当前全局域或被导入
6.3.2.1. 多重继承
类多继承//小心使用
class DerivedClassName(Base1,Base2,Base3):
- pass
对于一个函数的解析规则是深度优先,先是Base1,然后是Base1的基类,诸如此类.