简明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 "<stdin>", line 1, in ?
AssertionError
repr函数
- repr函数用来取得对象的规范字符串表示。反引号(也称转换符)可以完成相同的功能。注意,在大多数时候有
eval(repr(object)) == object
。可以通过定义类的__repr__
方法来控制对象在被repr函数调用的时候返回的内容。
>>> i = []
>>> i.append('item')
>>> `i`
"['item']"
>>> repr(i)
"['item']"
网友评论