简明Python教程是A Byte of Python的中译本, 旨在引导读者快速入门。本文总结了该教程Python 2.x版与Python 3.x版的内容和差异。
介绍
Python的特色
解释型
面向对象
动态数据类型
胶水语言
标准库功能齐全
起步
使用交互式的提示符
在命令行输入python进入交互环境。
Python 2.x 直接输入print 'hello world'。Python 3.x 中print不再是操作符,而成为函数,使用方法为print('hello world')。
运行help()获取帮助,按q退出帮助。help(func)得到函数的信息。加入引号print('str')可得到操作符的信息。
使用源文件
将代码保存为helloworld.py。然后,在终端执行python helloworld.py或者./helloworld.py。
要直接运行Python程序,在Unix有个标准的实现方法:在源文件行首加上#!/usr/bin/python。它被称作组织行,源文件的头两个字符是#!(叫做pound bang或者shebang),后面跟着一个程序的绝对路径。如果不知道位置,可以写成#!/usr/bin/env python,但有多个python版本共存时不可以,因为旧版本的Python可能运行程序。
Unix/Linux用户需要chmod a+x helloworld.py命令使文件可执行。
基本概念
数
四种类型:整数、长整数、浮点数、复数
字符串
双引号与单引号字符串完全相同
三引号('''或""")指示多行的字符串
转义符\也可用于表示下一行继续
自然字符串通过给字符串加上前缀r或R来指定
Unicode字符串前加前缀u或U
字符串不可变
相邻字符串会被自动级连,如'hello' 'world'会被自动转为'helloworld'。注意,如果输入print 'hello','world',逗号会变为空格,结果为hello world。
标识符
第一个字符为字母或下划线
其他部分可以为字母、下划线、数字
大小写敏感
对象
数、字符串、函数都是对象
使用变量时不需要声明或定义数据类型
逻辑行与物理行
建议每个物理行只写一句逻辑行
尽量避免使用分号
缩进
同一层次的语句必须有相同的缩进
运算符与表达式
控制流
if: 没有switch,用if..elif..else或字典完成同样工作
while: 有一个可选的else从句
for..in: 如for i in range(0,5), 可选else从句
break 和 continue: 在循环中使用
函数
global语句
global语句声明变量是全局的,当在函数内给赋变量的时候,变化也反映在主块中。
默认参数
只有形参表末尾的参数可以有默认值。如def func(a, b=5)是有效的,def func(a=5, b)是无效的。
关键参数
使用名字(关键字)而不是位置(默认从左到右赋值)来给函数指定实参。如def func(a,b=2,c=3):可以这样调用func(c=50, a=100)。有两个好处:1. 不必担心参数顺序。2. 可以只给我们想要的那些参数赋值
DocStrings
文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。
可以通过func.__doc__(注意双下划线)得到函数的文档字符串属性。
模块
简介
利用import语句输入sys模块
sys.argv包含了命令行参数的列表
字节编译的.pyc文件
使输入模块更快
与平台无关
from..import语句
应避免使用from..import而使用import语句,因为这样可以使程序更易读,也可以避免名称的冲突。
模块的name属性
每个Python模块都有它的__name__,如果它是'__main__',说明这个模块被用户单独运行。
dir()函数
可以使用内建的dir()来列出模块定义的标识符,如dir(sys)。标识符有函数、类和变量。
不给dir()传递参数,默认返回当前模块的属性列表。
使用del语句删除当前模块中的变量/属性。
数据结构
列表
列表是可变的数据类型
列表中的项目包括在方括号中,如shoplist = ['apple', 'mango', 'carrot', 'banana']
删除用del,如del shoplist[0]
元组
元组和字符串一样是不可变的
元组的项目包括在圆括号中,如zoo = ('wolf', 'elephant', 'penguin')
字典
键值对包含在花括号中,如d = {key1 : value1, key2 : value2 }
del语句删除键/值对,如del dict['key']
序列
列表、元组和字符串都是序列
索引操作符和切片操作符
shoplist[0]抓取第一个项目
shoplist[-2]抓取倒数第二个项目
shoplist[:]返回整个序列的拷贝
shoplist[:-1]返回除最后一个项目外包含所有项目的序列切片
开始位置包含在序列切片中,而结束位置被排斥在切片外。
引用
创建一个对象并给它赋一个变量的时候,这个变量仅仅引用那个对象,而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存。这被称作名称到对象的绑定。
要复制一个列表或者类似的序列或者其他复杂的对象(不是如整数那样的简单对象),必须使用切片操作符来取得拷贝。
解决问题
Windows把反斜杠\作为目录分隔符,而Python中表示转义符。所以Windows下路径字符串应使用'C:\\Documents'或r'C:\Documents'。
os.sep变量会根据操作系统给出目录分隔符,即在Linux、Unix下是'/',在Windows下是'\\',在Mac OS下是':'。使用os.sep而非直接使用字符使程序具有移植性。
推荐使用zipfile和tarfile创建归档。不推荐使用os.system,它容易引发严重的错误。
面向对象编程
假如有一个类MyClass和这个类的实例MyObject。调用MyObject.method(arg1, arg2)时,会由Python自动转为MyClass.method(MyObject, arg1, arg2)。
方法与函数的区别只是一个额外的self变量
__init__方法类似于C++、C#和Java中的constructor,__del__方法与destructor的概念类似。
Python中所有的类成员(包括数据成员)都是公共的,所有的方法都是有效的。
只有一个例外:如果数据成员名称以双下划线前缀,比如__privatevar,Python的名称管理体系会把它作为私有变量。
输入输出
使file类的read、readline、write、close方法
读模式('r')、写模式('w')、追加模式('a')
使用pickle或cpickle模块的dump、load方法实现存取对象
异常
使用try..except语句来处理异常
使用raise语句引发异常,可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。
在无论异常发生与否的情况下都执行特定语句,使用try..finally
在一个try块下同时使用except从句和finally块,需要把一个嵌入另外一个。
标准库
sys模块
sys.argv
sys.version、sys.version_info
sys.stdin、sys.stdout、sys.stderr
os模块
os.name字符串指示正在使用的平台。比如Windows是'nt',Linux/Unix是'posix'。
os.getcwd()得到当前Python脚本工作的目录路径。
os.getenv()和os.putenv()分别用来读取和设置环境变量。
os.listdir()返回指定目录下的所有文件和目录名。
os.remove()用来删除一个文件。
os.system()用来运行shell命令。
os.linesep字符串给出当前平台使用的行终止符。如Windows使用'\r\n',Linux使用'\n',而Mac使用'\r'。
os.path.split()函数返回一个路径的目录名和文件名。
os.path.isfile()和os.path.isdir()分别检验给出的路径是文件还是目录。
os.path.exists()检验给出的路径是否真地存在。
更多
特殊的方法
特殊的方法都被用来模仿某个行为。例如,想要为类使用x[key]这样的索引操作(就像列表和元组一样),只需要实现__getitem__()方法就可以。在《Python参考手册》中可以找到所有的特殊方法。
单语句块
语句块通过缩进层次与其它块区分开。但如果语句块只包含一条语句,可以在条件语句或循环语句的同一行指明它。但这种写法不推荐使用。
if True: print('YES')
列表综合
通过列表综合,可以从一个已有的列表导出一个新的列表。
#!/usr/bin/python
# Filename: list_comprehension.py
listone = [2, 3, 4]
listtwo = [2*i for i in listone if i > 2]
print listtwo # [6,8]
在函数中接收元组和列表
在args变量前有*前缀,所有多余的函数参数都会作为一个元组存储在args中。如果使用的是**前缀,多余的参数会被认为是一个字典的键/值对。
def powersum(power, *args):
total = 0
for i in args:
total += pow(i, power)
return total
print powersum(3,2,1) # 9
print powersum(3,10) # 1000
lambda语句
lambda需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。注意,即便是print语句也不能用在lambda形式中,只能使用表达式。
def make_repeater(n):
return lambda s: s*n
twice = make_repeater(2)
print twice('word') # wordword
print twice(5) # 10
exec语句
exec用来执行储存在字符串或文件中的语句
exec 'print "Hello World"'
eval语句
eval用来计算存储在字符串中的有效表达式
eval('2*3')
assert语句
assert用来声明某个条件是真的,非真的时候引发AssertionError。
>>> mylist = ['item']
>>> assert len(mylist) >= 1
>>> mylist.pop()
'item'
>>> assert len(mylist) >= 1
Traceback (most recent call last):
File "", line 1, in ?
AssertionError
repr函数
repr函数用来取得对象的规范字符串表示。反引号(也称转换符)可以完成相同的功能。注意,在大多数时候有eval(repr(object)) == object。可以通过定义类的__repr__方法来控制对象在被repr函数调用的时候返回的内容。
>>> i = []
>>> i.append('item')
>>> `i`
"['item']"
>>> repr(i)
"['item']"