第一章 认识Python
1.1启动Python解释程序
下载一个去安装。提示符">>>"。
第一个例子:
>>> print "Hello world!"
Hello world!
要退出解释程序,输入文件结束符,在Windows中的Ctrl+Z,在Linux下的Ctrl+D,之后按下Enter键。
1.2用变量和表达式进行试验
1.2.1袖珍计算器
可以在交互模式下直接进行计算。
>>> 8/2
4
1.2.2变量
使用变量在一定时间内保留值。变量总是要引用值。变量没有类型,但是对象有类型。不需要声明变量。但是在给一个变量分配值之前,不可以访问,否则会发生NameError错误。
Python区分大小写。
1.3定义函数
def FunctionName(parameter,...):是函数定义的开始,之后是缩进。Python中的缩进有语法意义。遇到非缩进的代码行时就直到该代码块结束了。
1.4运行Python程序
python spam.py
在Windows系统中还可以用鼠标双击执行。在UNIX系统中可以在文件首行加入
#!/usr/bin/python
并且给文件加上可执行属性来直接执行脚本文件。
1.5循环和控制
一个计算500以内质数表的程序:
for PrimeTest in range(2,500):
IsPrime=1 #0是false,非零是true
for TestFactor in range(2,PrimeTest):
if(PrimeTest % TestFactor==0):
IsPrime=0
break
if(IsPrime):
print PrimeTest
1.5.1整除
运算符"%"是取模,即在整除中得到余数。整数和整数相除是整除。
1.5.2循环
for语句设置了一个循环,并在range(startnum,endnum)中设置范围。这里的每次循环PrimeTest都会从range()中获得一个值。
1.5.3采用if语句的分支
if expression:是一个控制块的开头。条件表达式中不允许赋值。
1.5.4中断和继续
break跳出最内层循环。
1.6列表和元组
列表(list)是包含0个或多个元素的有序集合,写列表时用逗号隔开元素,并放在方括号中。
FibonacciList=[1,1,2,3,5,8]
1.6.1元组
元组与列表类似,但是不可改变,使用圆括号。
1.6.2切片和切换
列表是有序的,所以每个列表元素都包含一个索引,可用listname[index]来访问某个元素。索引编号从0开始。
索引编号可用负数,代表从后向前索引,-1是最后一项。
可用listname[start:end]访问子列表,从start开始,到end,但是不包括end。start和end都可以省略,代表从开头或者到结尾。
列表、元组和字符串都是序列类型(Sequence type)。序列类型都支持索引访问,也包括切片操作。
元组和字符串都是不可变的类型,不允许修改其中的元素。但是可以先转换成列表,修改之后再转换回去。例如从元组创建列表:
aList=list(aTuple)
从列表转换到元组:
aTuple=tuple(aList)
1.7词典
词典(Dictionary)是一个Python对象,能够对不同的值交叉引用不同的键。值可为任意对象。
{key:value,key:value}
查找一个值时用dict[key]。但是当访问不存在的键时会发生异常KeyError,用dictionary.get(key,defaultValue)函数可以完成安全获取,即返回一个缺省值。一般缺省值取None,类似于C语言中的NULL。
1.8读写文件
创建文件对象用open(filename,mode)函数,mode是一个字符串指定文件打开方式。得到文件对象之后可以使用read()和write()读写文件,最后用close()来关闭文件。
1.9样例程序:字频率
不同的作者会使用不同的字频率,有助于识别作者。代码略。
1.10加载及使用模块
导入一些其他库import modulename。导入后可用moduleName.itemName访问其成员。例如用string模块的lower函数,将所有大写字母转换成小写。
CurrentWord=string.lower(CurrentWord)
当导入模块时,模块层的代码(即不属于函数也不属于类定义的代码)就会执行。为了允许用户从命令行执行脚本,通常把独立执行的代码放入如下代码块中:
if(__name__=="__main__"):
另一种导入的方法是from foo import itemName,这种语法导入之后可以不加模块名而直接使用itemName。甚至还可以用from foo import *来导入模块所有的内容。不推荐这种方式,会导致命名空间的混乱。
Python不能增强模块中的“保密性”。礼貌是一个注意,仅调用想调用的函数。
1.11创建类
1.11.1一些快速对象术语
类(class)是把数据和行为连接在一起的一种机制。把特殊类的实例(instance)称为对象(object)。类实例包含确定的方法(method)和属性(attribute)。
可以从父类中派生出其他类,称为继承(inheritance)。OOP是一种有效的软件复用方法。
1.11.2对象定位、Python风格
采用class ClassName:定义了一个新类。类后面的控制块是类声明。
采用newObject=ClassName()句法创建对象,这时会先调用__init__()函数。构造函数也可能需要参数。
每个对象方法都获取self参量来作为他的第一个参数,类似于本对象的引用。Python的self与C++/Java中的this相似。
在Python中,不能显式的声明属性。一个对象的属性并不属于本地名字空间的一部分,换句话说,要在某个对象的一个方法中访问该对象的属性foo,一定要输入self.foo。
1.11.3访问类成员
属性和方法都是公共的,全部在外部可见。但是为了保持封装性,很多类都包含一些不能够直接访问的属性和方法。易于维护。
1.11.4示例:点类
import math
class Point:
# __init__方法在创建对象时执行,可以包含参数,并在
# 创建对象时必须指定这些参数。推荐写一个__init__方法
def __init__(self,X,Y):
self.X=X
self.Y=Y
def DistanceToPoint(self,OtherPoint):
"Returns the distance from this point to another"
SumOfSquares=((self.X-OtherPoint.X)**2)+/
((self.Y-OtherPoint.Y)**2)
return math.sqrt(SumOfSquares)
1.12推荐的阅读资料
初学者http://www.honors.montana.edu/~jjc/easytut/easytut/。
全面的http://star-ship.python.net/quick-ref1_52.html
源码http://www.vex.net/parnassus
1.13小结
略...
完成...
-------------------------------------------------------------------
第二章 标识符、变量和数字类型
2.1标识符和运算符
Python中的变量名和标识符与其他语言类似,都是以字母或下划线开头,后面接字母、数字或下划线。长度不限,区分大小写。
以下一些格式有特殊意义,应该准确使用:
_name 不能由"from x import *"而导入的成员
__name__ 系统名
__name 类的私有成员
交互模式下的单下划线"_"代表上一个表达式的计算结果,适于桌面计算器。
2.1.1保留字
and del for is raise
assert elif from lambda return
break else global not try
class except if or while
continue exec import pass
def finally in print
2.1.2运算符
- != % & * ** / ^ | ~
+ < << <= <> == > >= >>
2.2数字类型
2.2.1整型
整型都是32位有符号整数,范围-20亿到+20亿。sys模块的maxint成员保存了允许的最大正整数值。
十六进制是前加0x,八进制是前加0。
2.2.2长整型
长整型的长度不固定,由内存大小所决定。在末尾加L,但是也可以用小写,但是不容易区分,建议用大写。
2.2.3浮点数
允许表示小数值,也可以使用指数。如果不加入小数点则Python理解为整数,可以在浮点数后面加.0代表浮点数,如200.0。有时计算机上会出现舍入错误,这是可以允许的。
浮点数的有效值和值的精度是独立实现的,至少是64位双精度数字,通常还兼容IEEE754。
2.2.4虚数
在语言层提供了支持,但是实际用处不大。在整数后面加上"j"形成虚部。实部和虚部共同构成复数。
>>> 2+5j
(2+5j)
>>> 2*(2+5j)
(4+10j)
2.2.5处理数字类型
+n等于n;-n等于-1*n。
~按位取反:~5=6;数字x的一元按位取反定义-(x+1)
二元运算:+、-、*、/、%、**(乘幂)
按位运算:&、|、^(异或)
移位运算:<<、>>;5<<2=20;50>>3=6;仅限整型和长整型
Python的自动类型转换规则:
-
如果一个数字是复数,则其他数字也转为复数
-
如果一个数字是浮点数,其他数字转为浮点数
-
如果一个数字是长整数,其他数字转为长整数
-
不符合以上规则,入两个数都为整数,则不转换
abs(x)取绝对值
适于整数、长整数、浮点数。用于复数时取平面点到原点的距离,即二数平方和的开方。
>>> abs(-5.0)
5.0
coerce(x,y)将两个数字转换为同一类型
按照如上的四条规则转换,返回元组。
>>> coerce(5.5,5+2j)
((5.5+0j),(5+2j))
divmod(a,b)带余数整除运算
a整除b,返回结果元组,分别是商和余数
pow(x,y[,z])求幂
同**运算符,必要时,Python试图将两个数字转换成一种通用类型,如果最后的类型无法表达正确的结果时会报错,如最后结果是浮点型而通用类型是整型。
>>> pow(2.0,-1)
0.5
>>> pow(2,-1) #报错ValueError
pow的第三个参数可选,指定对结果进行模运算。
>>> pow(2,5)
32
>>> pow(2,5,10)
2
>>> (2**5)%10
2
使用pow的运算效率更高,因为快速的幂-模运算用于一些密码术。
round(x[,n])舍入
获得浮点数x舍入的最近的数字,可以指定舍入到小数点后n位。
2.3给变量赋值
Python会自动管理变量的生存期,在首次赋值时创建变量,不用后自动清除。
2.3.1简单的赋值语句
最简单的variable=value
>>> a=5
>>> a
5
Python变量并不包含数据,只是引用数据而已。变量(by gashero)所引用的数据类型随时可以更改。
2.3.2多个赋值
>>> a,b,c=5.5,2,10
>>> a,b,c=c,a,b
多个赋值适于元组的打包和拆包。
2.3.3扩充赋值
如a+=5之类的。扩充赋值是Python2.0中的新特性。
扩充赋值运算符:+=、-=、*=、/=、%=、**=、>>=、<<=、&=、|=、^=。对于a+=5语句和a=a+5的区别:
-
扩充赋值只计算一次,普通方法计算两次
-
可能的情况下,扩充复制修改原值,而不创建新对象。普通写法会创建新值a+5。
完成...
-------------------------------------------------
第三章 表达式和字符串
3.1表达式
Python中把任何非零,非空,非None的值看作是true,其他是false。常见的比较:
>>> 12>5
1
>>> 2<1
0
3.1.1比较数字类型
Python提供了一组标准的运算符,用于比较数字数据类型:
> < <= >= == !=
Python也支持<>,但是不保证将来也支持
比较之前注意强制转换。复数之间的比较先比较实部,再比较虚部。比较表达式可以使用多个比较操作符,作为and连接。
>>> a,b,c=10,20,30
>>> a<b<c
#True because 10<20 and 20<30
在a<b>c也是合法的,但是不推荐。使用min()函数用于获取一组数字中最小的一个,参数个数不限。同时还有max()。参数也可以用序列类型。
cmp(x,y)比较函数比较两个参数的值。x<y时返回负数,x=y时返回0,x>y时返回正数。
3.1.2复合表达式
使用布尔运算符and、or和not合并单个(by gashero)表达式。Python对布尔运算符的理解与其他语言稍有差别。
and有短路,两端都是true时才为true。
or也有短路,有一端为true时就为true。
not取反。
3.1.3复合表达式
表达式可以组合。圆括号用于控制计算的顺序。
3.1.4运算符的优先顺序
优先顺序从高到低,同层的具有相同优先级
'x' 字符串转换
{key:datum,...} 词典
{x,y,...} 列表
(x,y,...) 元组
f(x,y,...) 函数调用
x[j:k] 切片
x[j] 下标
x.attribute 属性引用
~x 按位取反
+x,-x 正、负
** 乘幂
*,/,% 乘、除、取模
+,- 加、减
<<,>> 移位
&