《python核心编程》学习笔记
if __name__ == ‘__main__‘:
一、二、三
获得键盘输入
1、raw_input(‘‘)
2、sys.stdin.readline()
strip()取出2边的空格。
3<5>4 等同于 (3<5)and(4<5),这个可是当初C语言入门的时候经常叮嘱的经典错误呀!想不到在这里被实现了,再也不是错误了,呵呵。
print 和c里面的printf基本一致。
print "str %s , int %d"%(‘str1‘,456)
对字符串构造也可以使用,类似sprintf,或者CString.format
str2 = "int %d"%(123)
str2 = ‘int 123‘
列表(list) 中括号[] 可以改元素
表列(tuple)小括号() 不可以改元素,相当于常量
字典(disk)大括号{} 第二项可改
a=[1,2,3,4]
>>>a[2:]
[3,4]
>>>a[:3]
[1,2,3]
dist1={}
dist1.keys()
>>> range(9)
[0, 1, 2, 3, 4, 5, 6, 7, 8]
for i in range(9):
等同于
while i<9:
i++
>>>print 1,2,3
1 2 3
逗号可以连接字符串,但是添加一个空格
# 注释
\n 换行
\ 续行
; 同行2语句
: 分割标题行和后续语句
‘‘‘ ‘‘‘ 文档,可以随意换行
del 删除引用,如果是把内置函数给重新设置了引用,del后回归默认。不能删除内置函数。
比如 dir=‘123‘那么dir就失去了原来的作用,当del dir后,回归原始作用。
id(x)显示某个对象的引用id
dir(x)显示某个对象的信息
dir()无参使用,显示当前的全局对象和局部对象
type(x)显示对象的类型,没有赋过值的是NoneType
import sys 获得模块
from sys import exit 获得模块的某个函数
0为假1为真
字符串可以类似char[]
mysting = ‘123‘
mystring[0]//为1
mystring[-1]//为最后一个值3
类似C,如果定义几个同意内容字符常量,那么内存地址都一致
mystr1=‘123‘
mystr2=‘123‘
id(mystr1)==id(mystr2)
else if 为elif表示
没有switch case
打开文件为open(filename,mode),不需要包含库。
**表示乘方。
交换2个值很简单,(x,y)=(y,x)就可以了
-------------------------------------------------------------------------------------
四、对象
a1=a2=111
a1和a2的引用id相同,即id(a1)==id(a2)或a1 is a2
这里如果a3=111,那么a3和a1,a2的id相同,估计是查了全部对象。
如果a1=110或者a1+=1,那么a1的id就改变了。
如果是复杂一点的,比如列表,就不能配对了。c1=[1,2,3] c2=[1,2,3],2者id不相同。
列表某项改变,不影响列表的id,但是该项的id就变了。
c1[1]=4 那么c1[1]的id变了,但是c1的id没变。
对于id的比较,可以直接用is:a=1;c=a;a is c >>True
常量也同样有id:a=1;id(a)==id(1) >>True
a is 1 >>True
1 is a>>True
但是2个常数之间不能用is比较,但是2个字符串可以用is。
cmp 比较2个id的大小,id相同不一样数值相同(如列表),id不同也不代表值不同。
repr和str的作用在表面基本一致,但是具体差别就是repr还可以用eval恢复,没看明白,存疑。
python没有bool、byte、指针。
int就是32位,没有short。
float就是双精度,没有单精度了。
-------------------------------------------------------------------------------------
五、数字
没有i++
整数都是32位。
长整型无限长度。后加L
浮点可以用e,如4.3e25
复数可以用64.1+1.5j 实数real,虚数imag,全部conjugate()
5.51节有个错误,就算是999999*999999,也不会出错,自动转换成了长整型。
~取反 为-(num+1)
<<左移 >>右移 ^异或
int,long,float,complex用来转换,对复数取2个值的平方和。
abs绝对值 coerce协调2个数字为同一类型coerce1(1,2L) (1L,2L)
divmod除法和取余 divmod(10,3) (3,1)
pow 和**一样,是乘方运算。
round 把浮点型变成最接近的整数,四舍五入 round(3) 3.0 round(3.49) 3.0 round(3.49,1) 3.5 round(-.5) -1
math.floor 退一法
整数才能用的函数:hex oct 转换16、8进制 ord 字母转数字 chr 数字转字母
random 随机函数的模块:
ranint(a,b) a到b的整数,包括a、b,即a<=x<=b
uniform(a,b) a<=x<b //这个是浮点数
random()返回[0,1)之间的浮点数
randrange(1,10)返回1到9的值。
randrange(1,12,2) 返回从1(1+2*0)到9(1+2*4)的值。
choice(‘asd\n‘)返回一个随机字符
choice([‘abc‘,‘dfg‘,‘123‘])返回其中一个字符串
sample(‘asd\n‘,2)用list返回2个随机字符,顺序可颠倒。不过同样位置上的值不会出现2次,因此第二个参数不能大于字符串的长度。所以有什么允许重复的时候会比较麻烦,但是可以给的第一参数里面带有重复的字符串来解决这个问题。
如果要随机组成字符串,需要使用string。string.join(random.sample(‘1234567890asdf‘,5)).replace(‘ ‘,‘‘)
shuffle(list)可以打乱list里的元素顺序。
-------------------------------------------------------------------------------------
六、序列
in,not in
a + b
a * 4
a[3]
a=[1,2,3,4] 则 a[0]~a[3]或a[-4]~a[-1]
len 显示长度
list 转换seq为列表
tuple 转换seq为表列
min,max 返回最大最小
str 转换为字符串
for循环有个else,如果是循环结束而不是break则执行这个else
%c 字符
%s 字符串
%i %d 带符号的十进制
%u 不带符号的十进制
%o 八进制
%x 小写16进制
%X 大写16进制
%e %E 乘方记号
%f 浮点
%g %G 浮点和乘方比较短的格式
string.find(‘1231‘,‘1‘) 查找字符返回位置 0
python的字符串不以\0结束。
>>>str1=‘\0\0\01‘
>>>str1
‘\x00\x00\x01‘
不过实际长度还是3个元素。
len(str1)//3
str1[2]//0x01
str1.find(‘1‘)//-1
str1.find(‘\01‘)//2
str1.find(‘\x01‘)//2
列表list通过append添加新元素
通过remove以元素的值做参数删除元素,如果有2个一样的值,则删除前一个。如果参数是位置而不是元素的值,按照位置删除用del a[1]
通过pop弹出最后一个值并删除之。(pop(0)则抛出第一个值并删除之)
通过extend合并其他列表。
通过*倍增元素。
长度可以len([1,2])【书上有误,不可以[1,2].__len__】
reverse颠倒列表,注意这个不是输出一个颠倒的列表,而是真正把列表颠倒。
sort排序列表,从小到大。默认是快速排序。
count一个元素的值,返回在list里有多少个同样的值。
index比较复杂些,index(4,1,5),查找元素值为4的元素的第一个位置,这个位置必须在[1,5)之间。否则出错,所以使用这个函数当需要try与except包含才可以用,因为它不返回-1。就算只使用第一个参数,如果没有这项,同样是抛出异常,而不是返回-1 。
表列tuple可以添加【tuple1+=(1,1,)】,倍增,但是不能删除和替换。
但是这里不能加只有一个元素的表列,因为一个元素的表列的属性不是表列,如果要建设单元素的表列,就加个逗号。,如(1,)。
如:type((1))为int,但是列表不是,如:type([1])为list。
另,表列中如果有子列表,那么这个子列表是可以修改的,如t=([1,2],3,4) t[0][1]=22 这个是允许的。
str(x) list(x) tuple(x)可以将3者相互转化,不过str(list或tuple),list(tuple),tuple(list)都比较正常,但是将字符串转换为list或者tuple就很麻烦了,因为每个括号、逗号、引号都变成了单独的元素。
list之间可以使用==判断是否相同,这样比较的是具体的值,而不是id。list的id不用,但是具体的值相同,==结果为真。但是用is则为假。
子函数可以返回多个参数,如:
def foo1():
return a1,a2,a3
那么接受就可以写作 x1,x2,x3=foo1() 分别进行接受。感觉这个很不错哦,方便很多呀。
copy模块:一般操作的赋值,都是浅copy,只是把引用ID设置成同一个值。copy.copy()也是浅copy,copy.deepcopy()是深copy,真正的2个对象。
没有字符变量,只有长度为1的字符串。其实字符串就是tuple,不可替换成员。
对于判断是不是大写字母,数字等,可以import string
string.uppercase string.lowercase string.letters string.digits
用not in 和in来判断。
string里有用的很多,最常用的就是join(把列表变成字符串,第二个参数决定间隔字符),split(返回一个list,为分割后的字符串)。具体见P122
如果在引号前面加上r,则可以取消\开始的特殊效果。
print ‘\x66‘ //f
print r‘\x66‘ //\x66
如果是unicode,则使用ur
其他的一些模块:re(匹配字符串),struct(构造发包报文时最常用),c/StringIO(字符串缓冲区对象,行为类似文件),crypt(单向加密编码功能,仅linux使用),rotor(多平台编码解码服务)