现在的位置: 首页 > 综合 > 正文

[《Python2.1宝典》笔记] 1-3章

2013年11月18日 ⁄ 综合 ⁄ 共 5486字 ⁄ 字号 评论关闭
 

第一章 认识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 #0false,非零是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,但是不包括endstartend都可以省略,代表从开头或者到结尾。

列表、元组和字符串都是序列类型(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参量来作为他的第一个参数,类似于本对象的引用。PythonselfC++/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=2050>>3=6;仅限整型和长整型

Python的自动类型转换规则:

  1. 如果一个数字是复数,则其他数字也转为复数

  2. 如果一个数字是浮点数,其他数字转为浮点数

  3. 如果一个数字是长整数,其他数字转为长整数

  4. 不符合以上规则,入两个数都为整数,则不转换

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的区别:

  1. 扩充赋值只计算一次,普通方法计算两次

  2. 可能的情况下,扩充复制修改原值,而不创建新对象。普通写法会创建新值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时返回0x>y时返回正数。

3.1.2复合表达式

使用布尔运算符andornot合并单个(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 正、负

** 乘幂

*,/,% 乘、除、取模

+,- 加、减

<<,>> 移位

&

抱歉!评论已关闭.