Python 绝对简明手册 -- [email protected] ::-- ZoomQuiet [DateTime(2006-09-15T04:35:33Z)] TableOfContents

1. Py2.5 绝对简明手册

简述

现在学的东西很容易忘记,写这篇文章的目的是能让我在需要时快速找回当时的感觉. 需要深入的请下载 attachment:diveintopython%2Dpdf%2D%35.%34.zip

版本:0.2 beta
作者:张沈鹏  电子科大大三  生物医学工程
参考:python2.5中文教程
感谢:Zoom.Quiet limodou

[http://blog.csdn.net/zuroc 我的技术Blog] [http://www.cppblog.com/zuroc 我的C++Blog] [http://www.cnweblog.com/zuroc/ 我的文学Blog]

1.1. 语法

1.1.1. if

x=int(raw_input("Please enter an integer:"))
if x<0:
    print 'Negative Number'
elif x==0:
    print 'Zero'
else:
    print 'Positive Number'

1.1.2. for

a=['cat','door','example']
for x in a:
    print x

#如果要修改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++中类似

1.1.3. pass

while True:
    pass #忽略,什么也不做

def fib(n=1000):#参数可以有默认值,多个可选参数赋值可以直接写"参数变量名=值"来快速赋值
    """这里给函数写文档注释"""
    a,b=0,1
    while b<n:
       print b
       a,b=b,a+b

#函数可以重命名,如

f=fib
f(223)

1.1.4. in

1.1.5. 参数格式 **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]

1.1.6. Lambda函数

1.1.7. 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])  返回一个单值为,计算步骤为 :

function(init,sequence[0])  sequence只有一个元素时,返回该元素,为空时抛出异常.

1.1.8. 列表推导式

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()是转换类型为可以打印的字符

1.1.9. 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

抛出异常

1.1.10. 元组

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', #单个元素的元组

1.1.11. 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'])

1.1.12. 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

1.1.13. None

表示该值不存在

1.1.14. 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.

1.1.15. reversed反向循环

for i in reversed(range(1,4)):
    print i

输出:

3
2
1

1.1.16. sorted排序

1.1.17. sequence比大小

list<string<tuple(因为字母表中l在s前...)

同类比大小按照字典序

1.1.18. 导入模块

模块的查找路径

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 函数 

然后就直接使用该函数,不需要加前缀

1.1.19. 包

引用推荐写法为

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 模块

1.1.20. 格式化输出

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.21. 等效代码

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()返回包含所有变量的字典,配合使用,无坚不摧!

1.1.22. 读写文件:

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: #交换通道

f.write("hello\n") #如果要写入字符串以外的数据,先将他转换为字符串.

f.tell() 返回一个整数,表示当前文件指针的位置(就是到文件头的比特数).

f.seek(偏移量,[起始位置])

用来移动文件指针

偏移量:单位:比特,可正可负

起始位置:0-文件头,默认值;1-当前位置;2-文件尾

f.close() 关闭文件


1.1.23. pickle

pickle 序列化/保存对象/封装

pickle.dump(x,f) #把文件对象f保存到x变量中

x=pickle.load(f) #还原这个对象


try:

except 异常类型:

#如果有多个异常类型,可以将他们放在括号()中

#如except(RuntimeError,TypeError,NameError):

最后一个异常名可以省略异常类型,作为通配项将所有异常pass.慎用!!!

在except后可以包含一个else

raise可以抛出异常,同时可以附带异常参数

try:

except Exception,inst:

如果抛出异常没有指定参数,则捕获异常时的参数包含的是该异常的默认信息

>>>try:

Handling run-time error:integer division or modulo by zero


自定义异常:惯例是以Error结尾的类,同类的异常一般派生自同一个基类,基类异常可以匹配派生类异常

class MyError(Exception):

try:

except MyError,e:

>>>

My exeception occurred,value 4


finally:和C++中类似,即使是break,continue或return后一样会执行。一般用于释放资源,如文件,网络连接。

def divide(x,y):


with #with可以帮助你自动释放资源,下一个版本可用

with open('myfile.txt') as f:

#该文件会自动被释放


1.1.24. 初识类

class ClassName:

#创建类实例

x=ClassName()

#给类的方法重命名

xf=ClassName.f


1.1.24.1. 类继承

class DerivedClassName(BassClassName):

如果基类定义在另一个模块中, 要写成

modname.BaseClassName

派生类的函数会覆盖基类的同名函数,如果想扩充而不是改写基类的函数,可以这样调用基类函数

BaseClassName.methodname(self,arguments)

注意:该基类要在当前全局域或被导入


1.1.24.2. 多重继承

类多继承//小心使用

class DerivedClassName(Base1,Base2,Base3):

.................

对于一个函数的解析规则是深度优先,先是Base1,然后是Base1的基类,诸如此类.


1.1.25. Iterators 迭代器

for element in [1,2,3]:

for key in {'one':1,'two':2}:

for line in open("my.txt"):

在容器中定义next()逐一返回元素,并在迭代完成时抛出StopIteration异常,然后定义iter()返回self,便可以for...in循环

用Generators(生成器)可以快速生成一个序列,在调用next()时依次返回序列中的值.

def reverse(data):

#yield会自动创建next()和iter(),每次调用next()时yield会进行下一步循环,并在yield处返回值


1.1.26. 生成器表达式

生成器表达式:类似于没有中括号的列表推导式,可用在参数中

>>>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))

>>>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']


1.2. 常用函数不完全手册

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\')


模块:smtplib

发送电子邮件

例:

sever=smtplib.smtp('localhost')

sever.sendmail(' [email protected] ',' [email protected] ')

"""TO:[email protected]

From:[email protected]

"""

sever.quit()


模块:datetime

时间