以Mark Lutz著的《Python学习手册》为教程,每天花1个小时左右时间学习,争取两周完成。 --- 写在前面的话


2013-7-19 14:30 学习笔记

1,Python程序的结构是这样的:程序由模块构成,模块包含语句,语句包含表达式,表达式建立并处理对象。

2,与C语言不同,Python语句会要求强制缩进,来保证代码的可读性和可维护性。同时语句顶端位于测试两端的括号是可以省略的。语句也不需要分号结尾。这样做Python会允许通过,但全世界都会知道你是一个正在学习Python的前C程序员。

x = 1
y = 2
if x > y:
	print x
else:
	print y



3,赋值语句建立对象引用值,变量名在首次赋值时会被创建,变量名在引用前必须先赋值。Python中赋值语句的形式如下表:

运算

解释

name = 'mathboy'

基本形式

name, age = 'mathboy', 23

元组赋值

[name, age] = ['mathboy', 23]

列表赋值

a,b,c,d = 'girl'

序列赋值

boy = girl = 'mo'

多目标赋值

age += 23

增强赋值(相当于age = age + 23)


4,元组赋值可以利用来交换两个变量的值。例如:

a = 1
b = 2
a,b = b,a
print a,b

输出结果为:

2 1

5,理论上,序列赋值的右侧可以是任意可迭代的对象,但右边元素的数目要跟左侧变量的数目相同。例如:

name = 'math'

a,b,c,d = name
print a,b,c,d

a,b,c = name[0], name[1], name[2:]
print a,b,c

a,b,c = list(name[:2]) + [name[2:]]
print a,b,c

a,b = name[:2]
print a,b

(a,b),c = name[:2], name[2:]
print a,b,c

结果为:

m a t h
m a th
m a th
m a
m a th



6,利用range()函数可以给系列变量赋整数值。例如:

a,b,c,d = range(4)
print a,b,c,d

结果为:

0 1 2 3

7,多目标赋值时,要注意共享引用的情况。例如:

a = b = 0
b += 1
print a,b

c = d = []
d.append(3.14)
print c,d

输出结果为:

0 1
[3.14] [3.14]



8,增强赋值通常比完整形式的赋值执行得更快,同时会自动选择优化技术。例如对于列表,+= 赋值会自动调用较快的extend()方法,而不是使用较慢的 + 合并运算。

L = [1,2]
L = L + [3,4]		# slower
L.extend([5,6])		# faster
L += [7,8]			# mapped to L.extend([7,8])

9,Python的变量名以下划线或字母开头,后面可以接任意数目的字母、数字或下划线。变量名区分大小写。

10,由于import语句中的模块变量名会变成脚本中的变量,所以虽然你可以写and.py和my-code.py这类文件,但你无法将其导入。因为and是Python保留字,而my-code中含有Python变量不允许的符号。

11,Python变量命名还有一些惯例,这些并非必要的规则,但一般在实际中都会遵守。

  • 以单一下划线开头的变量名(_X)不会被 from module import * 语句导入
  • 前后各有两个下划线的变量名(__X__)是系统定义的变量名,对解释器有特殊的意义
  • 以两个下划线开头、但结尾没有连个下划线的变量名(__X)是类的本地(“压缩”)变量
  • 通过交互模式运行时,只有单个下划线的变量名(_)会保存最后表达式的结果

12,Python允许吧大小比较测试串在一起。例如(A < B <C) 相当于 (A < B and B < C)

13,Python不允许把赋值语句(=)嵌入到其它表达式中,这样做的理由是为了避免常见的编码错误。例如用“==”做相等测试时,不会打成"="而意外修改变量的值。

14,下面两个打印程序等价:

X = 3.14
print X

等价于

import sys
X = 3.14
sys.stdout.write(str(X) + '\n')



15,标准输出流可以重定向。例如:

import sys
sys.stdout = open('log.txt', 'w')
a,b,c = 1,2,3
print a,b,c

在上面这段程序中,print语句会调用sys.stdout的write方法。

16,print可以通过>>重定向到文件流,这种重定向只是暂时的。例如:

a,b,c = 1,2,3
x,y,z = 8,9,10
log = open('log.txt','w')
print >> log, a,b,c
print x,y,z