【注】本文是学习《Python核心编程《第二版》》时的笔记。
1 Python快速入门
1.1 格式化输出print
1 >>> print "%s is number %d" % ('python', 1)
2 python is number 1
print语句默认会给每一行添加一个换行符,只要在print语句的最后加上一个逗号(,),带逗号的print语句输出的元素之间会自动添加一个空格,就可以改变这种行为。
1 >>> who = 'zheng'
2 >>> what = 'Ni'
3 >>> print 'we are the %s who say %s' % (who, (what + ' ')*4)
4 we are the zheng who say Ni Ni Ni Ni
1.2 标准输入raw_input
raw_inpout返回的是字符串类型,string类型。
1 >>> num = raw_input('input a number: ')
2 input a number: 123
3 >>> print 'Your input number is ', int(num)
4 Your input number is 123
当输入纯数字时,input返回的是数值类型,如int、float。
下面举例中得情况就可以看出两者的差异:
#这个不会报错
Host_ip = raw_input("Enter ftp server ip : ")
#这个会报错
Host_ip = input("Enter ftp server ip : ")
1.3 输出重定向
1 >>> import sys
2 >>> print >> sys.stderr, 'Fatal error: invalid input'
3 Fatal error: invalid input
4 >>> logfile = open('/tmp/mylog.txt', 'a')
5 >>> print >> logfile, 'Fatal error: invalid input'
6 >>> logfile.close()
1.4 运算符
< > == != and or not + - * / // %
1.5 数字
有符号整型、长整型、布尔值、浮点值、复数
1.6 字符串
字符串的索引规则:第一个字符的索引是0,最后一个字符的索引是-1。
1 >>> pystr = 'python'
2 >>> pystr[0]
3 'p'
4 >>> pystr[2:5]
5 'tho'
6 >>> pystr[-1]
7 'n'
1.7 列表
列表和数组相似,只是列表可以保存任意数量和类型的python对象,索引方式从0开始的数字索引。
1 >>> alist = [1, 2, 3, 4]
2 >>> alist[0]
3 1
4 >>> alist[-1]
5 4
6 >>> alist[0:3]
7 [1, 2, 3]
8 >>> alist[2] = 5
9 >>> alist
10 [1, 2, 5, 4]
11 >>>
1.8 元组
元组用小括号()包裹,不可以修改(尽管他们的内容可以),元组可看成是只读的列表,通过切片可以得到子集。
1 >>> atuple = ('roboots', 77, 90, 'try')
2 >>> atuple
3 ('roboots', 77, 90, 'try')
4 >>> atuple[:3]
5 ('roboots', 77, 90)
6 >>> atuple[1] = 53
7 Traceback (most recent call last):
8 File "<stdin>", line 1, in <module>
9 TypeError: 'tuple' object does not support item assignment
1.9 字典
字典是python中的映射数据类型,由键-值(key-value)对组成,一般使用数字或者字符串作为键,值可以是任意类型的python对象,字典使用大括号{}包裹。
1 >>> adict = {'host':'search'}
2 >>> adict['port'] = 90
3 >>> adict
4 {'host': 'search', 'port': 90}
5 >>> adict.keys()
6 ['host', 'port']
7 >>> adict['host']
8 'search'
9 >>> adict['port']
10 90
11 >>> for key in adict:
12 ... print key, adict[key]
13 ...
14 host search
15 port 90
1.10 if
1 if expression1:
2 if_suite
3 elif expression2:
4 elif_suite
5 else:
6 else_suite
1.11 while
1 while expression:
2 while_suite
1.12 for
python中的for接收可迭代对象(例如序列或迭代器)作为参数,每次迭代其中的一个元素
1 >>> for item in ['email', 'net', 'home']:
2 ... print item,
3 ...
4 email net home
1.13 range
range()函数通常和len()函数一起用于字符串的索引
1 >>> foo = 'abc'
2 >>> for i in (range(len(foo))):
3 ... print foo[i], '(%d)' % i
4 ...
5 a (0)
6 b (1)
7 c (2)
1.14 enumerate
enumerate()函数可同时循环索引和循环元素
1 >>> foo = 'abc'
2 >>> for i, ch in enumerate(foo):
3 ... print ch, '(%d)' % i
4 ...
5 a (0)
6 b (1)
7 c (2)
1.15 列表解析
可以在一行中使用一个for循环将所有值放到一个列表中
1 >>> squared = [x**2 for x in range(4)]
2 >>> for i in squared:
3 ... print i,
4 ...
5 0 1 4 9
6 >>> sqdevens = [x**2 for x in range(6) if not x%2]
7 >>> for i in sqdevens:
8 ... print i
9 ...
10 0
11 4
12 16
1.16 open
handle = open(file_name, access_mode = ‘r’)
access_mode取值:’r’读取,‘w’写入,‘a’添加,‘+’读写,‘b’二进制访问
返回值:文件句柄
1 >>> fobj = open(filename, 'r')
2 >>> for eachline in fobj:
3 ... print eachline ,
4 ...
5 >>> fobj.close
1.17 错误和异常
给代码添加错误检测和异常处理,将代码封装在try-except语句中,try之后放代码组,except之后放处理错误的代码。
1 >>> try:
2 ... filename = raw_input('filename: ')
3 ... for eachline in fobj:
4 ... print eachline,
5 ... fobj.close()
6 ... except IOError, e:
7 ... print 'file open error:', e
1.18 函数
1 def function_name ([arguments]):
2 ‘optional documentation string’
3 function_suite
函数参数是可选的
1 >>> def addme2me(x):
2 ... return (x+x)
3 >>> addme2me([-1, 'abc'])
4 [-1, 'abc', -1, 'abc']
注:加号操作几乎与所有的数据类型工作,不管是数值还是序列合并。
函数的参数可以有一个默认值,如果提供默认值,在函数定义中,参数以赋值语句的形式提供,表示函数调用时如果没有提供这个参数,就取这个值作为默认值
1 >>> def foo(debug = True):
2 ... if debug:
3 ... print 'in debug mode'
4 ... print 'done'
5 ...
6 >>> foo()
7 in debug mode
8 done
1.19 类
定义类:
1 class classname (base_class[es]):
2 ‘option documentation string’
3 static_member_declarations
4 method_declarations
class关键字定义类,可提供一个可选的父类或者基类,如果没有,就使用object作为基类。class之后是可选的文档描述符、静态成员和方法定义。
1 >>> class fooclass(object):
2 ... version = 0.1
3 ... def __init__(self, name='John'):
4 ... self.name = name
5 ... print 'create a class instance for', name
6 ... def showname(self):
7 ... print 'your name is ', self.name
8 ... def addme2me(self, x):
9 ... return x+x
__init__()方法是一个特殊方法,当一个类实例被创建时,__init__()方法会被自动执行,在类实例创建完毕后执行,类似构造器。主要完成初始化的工作。__init__()需要一个默认的参数。
1 >>> fool = fooclass()
2 create a class instance for John
1.20 模块
模块是一种组织形式,将彼此有关系的代码组织到一个个独立的文件中,模块可以包括执行代码,函数和类,或者这些东西的组合。
导入模块:import module_name
访问模块函数或模块变量:module.function()、module.variable
1 >>> import sys
2 >>> sys.stdout.write('hello, world!\n')
3 hello, world!
4 >>> sys.platform
5 'linux2'
1.21 赋值
增量赋值:+=、-=、*=、/=、%=、**=、<<=、>>=、&=、^=、|=
1 >>> n = 12
2 >>> n ^= 3
3 >>> n
4 15
多重赋值:x = y = z = 1
1 >>> x = y = z = 1
2 >>> x
3 1
4 >>> y
5 1
6 >>> z
7 1
“多元赋值”:采用这种方法赋值时,等号两边的对象都是元组
1 >>> (x, y, z) = (1, 2.2, 'string')
2 >>> x
3 1
4 >>> y
5 2.2000000000000002
6 >>> z
7 'string'
8 >>> (x, y) = (y, x)
9 >>> x
10 2.2000000000000002
11 >>> y
12 1
1.22 python对象
所有的python对象都有三个特性:身份(可使用id()得到)、类型(可使用type()得到)和值
身份:可看作对象的内存地址
类型:(1)标准类型:数字、整型、布尔型、长整型、浮点型、复数型、字符串、列表、元组、字典;(2)其它内建类型:类型、Null对象(None)、文件、集合/固定集合、函数/方法、模块、类。
类就是类型,实例就是类型的对象
1.23 数字
python支持多种数字类型:整型、长整型、布尔型、双精度浮点型、十进制浮点型和复数
布尔型:布尔型只有两个值,True和Fasle
标准整型:32位机器上标准整型的取值范围为-232到232-1,标准整型等价于C语言的有符号长整型,如果是八进制以数字“0”开始,十六进制整型以“0x”或“0X”开始;
长整型:python的长整型能表达的数值仅仅与机器支持的虚拟内存大小有关,长整型是标准整型类型的超集,在一个整型值后面加个L(大小写都可以),表示这个整型是长整型。
双精度浮点型:类似于C语言中的double类型,可以直接用十进制或者科学计数法表示,每个浮点型占8个字节,其中52位用于表示底,11位用于表示指数,剩下的1位表示符号,浮点型值通常都有一个小数点和一个可选的后缀e(大写或小写,表示科学计数法),在e和指数之间可以用正负号表示指数的正负。
复数:一个复数就是一对有序浮点型(x, y),表示x+yi,其中x是实数部分,y是虚数部分
复数的内建属性:分别为该复数的实部和虚部,复数还有conjugate方法,返回的该复数的共轭复数对象。
1 >>> acomplex = -8.333-1.47j
2 >>> acomplex
3 (-8.3330000000000002-1.47j)
4 >>> acomplex.real
5 -8.3330000000000002
6 >>> acomplex.imag
7 -1.47
8 >>> acomplex.conjugate()
9 (-8.3330000000000002+1.47j)
10 >>>
1.24 数字操作符
如果有一个操作数是复数,另一个操作数被转换为复数;
否则,如果有一个操作数是浮点型,这另一个操作数被转换为浮点型;
否则,如果有一个操作数是长整型,这另一个操作数被转换为长整型;
否则,两者必然为普通整型,无需要转换
1.25 算术操作符
除法:对整型操作数,执行“地板除”(floor,取比商小的最大整型),例如5除以2等于2.5,“地板除”的结果是2
传统除法 | 真正的除法 | 地板除 |
如果是整型除法,传统除法会舍去小数部分,返回一个整型 1/2=0 1.0/2.0=0.5 | 除法运算总是返回真实的商 可通过执行 from __future__ import division执行做到 | 操作符//执行的是地板除://除法不管操作数是何种数值类型,总是舍去小数部分,返回数字序列中比真正的商小的最接近的数字 |
取余:浮点数取余商取小于等于精确值的最大整型的乘积之差,即:x-(math.floor(x/y)*y)或者
。
幂运算:幂运算操作符比其左侧操作符的一元操作符优先级低,比其右侧操作符的一元操作符的优先级高。
1 >>> 3 ** 2
2 9
3 >>> -3 ** 2
4 -9
5 >>> 4.0 ** -1.0
6 0.25
1.26 位操作符
标准位运算:~、&、|、^、<<、>>
负数会当作正数的二进制补码处理
左移和右移N位等价于无溢出检查的2的N次幂,2**N
1.27 标准类型函数
cmp()、str()、type():可以用于所有的标准类型,对数字对象来说,这些函数分别比较两个数的大小,将数字转换为字符串,以及返回数字对象的类型。
1.28 数字类型函数
1 >>> int(4.12)
2 4
3 >>> long(321)
4 321L
5 >>> complex(4)
6 (4+0j)
7 >>> complex(4, -8)
8 (4-8j)
1.29 功能函数
进行数值运算:abs()、coerce()、divmod()、pow()、round()
abs():返回给定参数的绝对值,如果是复数返回模的值
coerce():为程序员提供了不依赖python解释器,而是自定义两种数值类型转换的方法,返回一个包含类型转换完毕的两个数值元素的元组。
1 >>> coerce(1, 2)
2 (1, 2)
3 >>> coerce(1.3, 2L)
4 (1.3, 2.0)
5 >>> coerce(1, 2L)
6 (1L, 2L)
7 >>> coerce(1j, 2L)
8 (1j, (2+0j))
9 >>> coerce(1.23+4j, 2L)
10 ((1.23+4j), (2+0j))
divmod():把除法和取余运算结合起来,返回一个包含商和余数的数组,对整型来说,它的返回值就是地板除和取余操作的结果,对浮点数来说,返回的商部分是math.floor(num1/num2),对复数来说,商部分是ath.floor((num1/num2).real)
1 >>> divmod(10, 3)
2 (3, 1)
3 >>> divmod(3, 10)
4 (0, 3)
5 >>> divmod(10, 2.5)
6 (4.0, 0.0)
7 >>> divmod(2+1j, 0.5-1j)
8 __main__:1: DeprecationWarning: complex divmod(), // and % are deprecated
9 (0j, (2+1j))
pow():pow()函数和(**)操作符都可以进行指数运算。
1 >>> pow(2, 5)
2 32
3 >>> pow(5, 2)
4 25
round():用于对浮点型进行四舍五入运算,它可以有一个可选的小数位数参数,如果不提供小数参数,它返回与第一个参数最接近的整型(但仍然是浮点类型),第二个参数告诉round函数将结果精确到小数点后指定位数。round()函数按四舍五入的规则进行取整。
1 >>> round(3)
2 3.0
3 >>> round(3.45)
4 3.0
5 >>> round(3.49999, 1)
6 3.5
7 >>> import math
8 >>> for eachnum in range(10):
9 ... print round(math.pi, eachnum)
10 ...
11 3.0
12 3.1
13 3.14
14 3.142
15 3.1416
16 3.14159
17 3.141593
18 3.1415927
19 3.14159265
20 3.141592654
21 >>> round(-3.5)
22 -4.0
23 >>> round(-3.4)
24 -3.0
25 >>> round(-3.49)
26 -3.0
27 >>> round(-3.49, )
28 -3.0
29 >>> round(-3.49, 1)
30 -3.5
int()、round()、math.floor()之间的区别:
函数int()直接截去小数部分,返回值为整型;
函数floor()得到最接近原数但小于原数的整型,返回值为浮点型;
函数round得到最接近原数的整型,返回值为浮点型。
1.30 仅用于整型的函数
进制转换函数:oct()返回八进制整型,hex()返回十六进制整型
1 >>> hex(255)
2 '0xff'
3 >>> oct(255)
4 '0377'
ASCLL转换函数:用于ASCLL码和其序列值之间的转换,函数chr()接受一个单字节整型值,返回一个字符串;函数ord()接受一个字符,返回其对应的整型值。
1 >>> ord('A')
2 65
3 >>> chr(97)
4 'a'
1.31 布尔数
有两个永不改变的值True和False
布尔型是整型的子类,但是不能再被继承而生成它的子类
没有__nonzero__()方法的对象的默认值是True
对于值为0的任意数字或空集(空列表、空元祖和空字典等),布尔值为False
1.32 拷贝python对象、浅拷贝和深拷贝
浅拷贝:对象赋值是简单的对象引用,当创建一个对象,然后把它赋值给另一个变量的时候,python并没有拷贝这个对象,而是拷贝了这个对象的引用。
1 >>> person = ['name', ['saving', 100.0]]
2 >>> hubby = person[:]
3 >>> wifey = list(person)
4 >>> [id(x) for x in person, hubby, wifey]
5 [140275404798072, 140275404797928, 140275404798936]
6 >>> hubby[0] = 'joe'
7 >>> wifey[0] = 'jane'
8 >>> hubby, wifey
9 (['joe', ['saving', 100.0]], ['jane', ['saving', 100.0]])
10 >>> hubby[1][1] = 50.0
11 >>> hubby, wifey
12 (['joe', ['saving', 50.0]], ['jane', ['saving', 50.0]])
这里仅仅是做了一个浅拷贝,拷贝的对象本身是新的,但是内容不是,序列类型对象的浅拷贝是默认类型拷贝,可以通过(1)完全切片操作[:];(2)利用工厂函数,比如list()、dict()等;(3)使用copy模块的copy函数。
1 >>> [id(x) for x in hubby]
2 [140275404800288, 140275404797784]
3 >>> [id(x) for x in wifey]
4 [140275404800096, 140275404797784]
深拷贝:要得到一个完全拷贝或者深拷贝-创建一个新的容器对象,包含原有对象元素(引用)全新拷贝的引用-需要copy.deepcopy()函数。
1 >>> person = ['name', ['saving', 100.0]]
2 >>> hubby = person
3 >>> import copy
4 >>> wifey = copy.deepcopy(person)
5 >>> [id(x) for x in person, hubby, wifey]
6 [140275404798792, 140275404798792, 140275404798072]
7 >>> hubby[0] = 'joe'
8 >>> wifey[0] = 'jane'
9 >>> hubby, wifey
10 (['joe', ['saving', 100.0]], ['jane', ['saving', 100.0]])
11 >>> hubby[1][1] = 50.5
12 >>> hubby, wifey
13 (['joe', ['saving', 50.5]], ['jane', ['saving', 100.0]])
14 >>> [id(x) for x in hubby]
15 [140275404801968, 140275404797136]
16 >>> [id(x) for x in wifey]
17 [140275404800624, 140275404799080]
注意:1、非容器类型(比如数字、字符串和其它“原子”类型的对象,像代码、类型和xrange对象等)没有拷贝一说,浅拷贝是用完全切片操作来完成的;2、如果元组变量只包含原子类型对象,对它的深拷贝将不会进行。
1 >>> person = ('name', ('saving', 100.0))
2 >>> newperson = copy.deepcopy(person)
3 >>> [id(x) for x in person, newperson]
4 [140275404813160, 140275404813160]
5 >>> [id(x) for x in person]
6 [140275405043824, 140275404797424]
7 >>> [id(x) for x in newperson]
8 [140275405043824, 140275404797424]
附录:
1 常用的内建函数
函数 | 描述 |
dir([obj]) | 显示对象的属性,如果没有提供参数,则显示全局变量的名字 |
help([obj]) | 显示对象的文档字符串,如果没有提供任何参数,则会进入交互式帮助 |
int(obj) | 将一个对象转换为整型 |
len(obj) | 返回对象的长度 |
open(fn, mode) | 以mode(‘r’=读,’w’=写)方式打开一个文件名为fn的文件 |
range([start,] stop [,step]) | 返回一个整型列表,起始值为start,结束值为stop-1,start默认为0,step默认为1 |
raw_input(str) | 等待用户输入一个字符串,可以提供一个可选的参数str用作提示信息 |
str(obj) | 将一个对象转换为字符串 |
type(obj) | 返回对象的类型,返回值本事是一个type对象 |
2 python类型操作符和内建函数总结
操作符/函数 | 描述 | 结果 |
字符串表示 | ||
`` | 对象的字符串表示 | str |
内建函数 | ||
cmp(obj1, obj2) | 比较两个对象 | int |
repr(obj) | 对象的字符串表示 | str |
str(obj) | 对象的字符串表示 | str |
type(obj) | 检测对象的类型 | type |
值比较 | ||
< | 小于 | bool |
> | 大于 | bool |
<= | 小于等于 | bool |
>= | 大于等于 | bool |
== | 等于 | bool |
!= | 不等于 | bool |
<> | 不等于 | bool |
对象比较 | ||
Is | 是 | bool |
not is | 不是 | bool |
布尔操作符 | ||
not | 逻辑反 | bool |
and | 逻辑与 | bool |
or | 逻辑或 | bool |
3 标准类型分类
数据类型 | 存储模型 | 更新模型 | 访问模型 |
数字 | 标量 | 不可更改 | 直接访问 |
字符串 | 标量 | 不可更改 | 顺序访问 |
列表 | 容器 | 可更改 | 顺序访问 |
元组 | 容器 | 不可更改 | 顺序访问 |
字典 | 容器 | 可更改 | 映射访问 |
4 数值工厂函数
类(工厂函数) | 操作 |
bool(obj) | 返回obj对象的布尔值,也就是obj.__nonzero__()方法的返回值 |
int(obj, base=10) | 返回一个字符串或数值对象的整型表示,类似于string.atoi() |
long(obj, base=10) | 返回一个字符或数据对象的长整型表示,类似于string.atol() |
float(obj) | 返回一个字符串或数据对象的浮点型表示,类似string.atof() |
complex(str) or complex(real, imag=0.0) | 返回一个字符串的复数表示,或者根据给定的实数(及一个可选的虚数部分)生成一个复数对象 |
5 数值运算内建函数
函数 | 功能 |
abs(num) | 返回num的绝对值 |
coerce(num1, num2) | 将num1和num2转换为同一类型,然后以一个元组形式返回 |
divmod(num1, num2) | 除法-取余运算的结合,返回一个元组(num1/num2, num1%num2),对浮点型和复数的商进行下舍入,复数仅取实数部分的商 |
pow(num1, num2, mod=1) | 取num1得num2次方,如果提供mod参数,这计算结果再对mod进行取余运算 |
round(fit, ndig=1) | 接受一个浮点型fit并对其四舍五入,保存ndig位小数,若不提供ndig参数,则默认小数点后0位 |
6 仅适用于整型的内建函数
函数 | 功能 |
hex(num) | 将数字转换为十六进制数并以字符串形式返回 |
oct(num) | 将数字转换为八进制数并以字符串形式返回 |
chr(num) | 将ASCLL值的数字转换为ASCLL字符,范围只能是0<=num<=255 |
ord(chr) | 接受一个ASCLL或Unicode字符(长度为1的字符串),返回对应的ASCLL值或Unicode值 |
unichr(num) | 接受Unicode码值,其对应的Unicode字符,所接受的码值范围依赖于你的python是内建于UCS-2还是USC-4 |
7 数值类型相关模块
模块 | 介绍 |
decimal | 十进制浮点运算类Decimal |
array | 高效数值数组(字符、整型、浮点型等) |
math/cmath | 标准C库运算函数,常规数学运算在math模块,复数运算在cmath模块 |
operator | 数字操作符的函数实现,比如tor.sub(m, n)等价于m-n |
random | 多种伪随机数生成器 |
8 random模块
函数 | 介绍 | 使用 |
randint(a, b) | 两个整型参数,返回二者之间的随机整型 | import random random.randint(a,b) |
randrange(start, stop[, step]) | 接受和range()函数一样的参数,随机返回range([start, ]stop[,step])结果中的一项 | random.randrange(1,100,2) |
uniform() | 几乎和randint()一样,不过返回的是二者之间的一个浮点型(不包括范围上限) | random.uniform(a, b) |
random() | 类似于uniform(),只不过下限恒等于0,上限恒等于1.0 | random.random()
|
choice() | 随机返回给定序列的一个元素 | random.choice(seq) |