赞
踩
目录
在正式开始之前,你需要安装python软件,准备一款好用的IDE工具。墙裂推荐anaconda + pycharm,网上有很多安装教程的博客,这里就不再赘述了。
编写的方式有两种:一是在Dos界面写交互式编码,一是在IDE工具中进行编码
交互模式的优点是,不需要刻意的使用“print”打印,也能自动打印,方便观察每一步的结果
- >>> print 2 ** 8
- 256
- >>> 2 ** 8
- 256
- >>> lumberjack = 'okay'
- >>> lumberjack
- 'okay'
或者说打开文本编辑器,(使用win+R调出“运行”对话框,输入notepad回车即可),在文本中输入以下两行python语句,保存为spam.py。然后,我们用“python spam.py”命令运行该文件
- ### file: spam.py
- print 2 ** 100
- print 'Spam!'
-
- >>> python spam.py
- 2 ** 100
- 'Spam!'
我们选择pycharm,即可开始代码练习,将代码明确保存为.py格式,使用菜单栏的“run”→“run...” 运行该代码
- ### file: threenames.py
- a = 'dead'
- b = 'parrot'
- c = 'sketch'
- print a, b, c
-
- Output:dead parrot sketch
IDE中如果要观察每一步的结果,则需要Debug
python内置对象优点
内置对象
对象类型 | 例子 常量/创建 |
数字 | 1234,3.1415,999L,3+4j,Decimal |
字符串 | ‘spam’,“guido's’’ |
列表 | [1,[2,‘three’],4] |
字典 | {‘food’:‘spam’,‘taste’:‘yum’} |
元组 | (1,‘spam’,4,‘U’) |
文件 | myfile=open(‘eggs’,‘r’) |
其他类型 | 集合、类型、None、布尔型 |
数字、字符串、元组具有不可变性,即对象创建后不能更改。
字符串、列表、元组都属于序列,可以对序列进行一些通用的操作,如索引、合并以及分片,同时每个内置对象也有特定的方法调用。
字典是唯一具有映射属性的对象,没有左右位置关系,支持键值对操作
关于多态的问题
操作符取决于被操作的对象,这就是多态。例如,‘a’+‘b’和1+2,输出的结果分别是ab和3。操作符是‘+’,由于被操作对象不同,输出的结果呈现不同的结果。
数字 | 常量 |
1234,-24,0 | 一般整数(C语言长整型) |
88888888888888888888L | 长整型数(无限大小) |
1.23,3.14e-10,4E210,4.0e+210 | 浮点数(C语言双精度浮点数) |
0177,0x9ff,0xff | 整数的八进制和十六进制数常量 |
3+4j,3.0j+4.0j,3j | 复数常量 |
python表达式操作符及程序
操作符 | 描述 |
yield x | 生成器函数发送协议(2.5版新增) |
lambda args:expression | 生成匿名函数 |
x if y else z | 三元选择表达式(2.5版新增) |
x or y | 逻辑或(只有x为假,才会计算y) |
x and y | 逻辑与(只有x为真,才会计算y) |
not x | 逻辑非 |
x<y,x<=y,x>y,x>=y,x!=y,x is y,x is not y,x in y,x not in y | 比较操作,值相等操作,对象身份测试,序列成员测试 |
x | y | 位或 |
x ^ y | 位异或 |
x & y | 位与 |
x << y,x>>y | x左移或右移y位 |
-x + y,x - y | 加法/合并,减法 |
x * y,x % y,x / y,x // y | 乘法/重复,余数/格式化,除法 |
-x,+x,~x,x**y | 一元减法,识别,按位求补,幂运算 |
x[i],x[i:j],x.attr,x(...) | 索引,分片,点号取属性运算,函数调用 |
(...),[...],{...},‘...’ | 元组,列表,字典,字符串 |
其他知识点
oct(十进制)、hex(十进制),分别表示八进制和十六进制
int(数字,进制)可以将八进制、十六进制的数字(字符串形式)转化为十进制
内置数学工具:math.pi,math.e,math.sin,math.sqrt(),abs(),x**y / pow(x,y),round(2.567,2)
集合:x=set('abcda'),output :{'c', 'd', 'b', 'a'},可以看出集合中的元素是不重复且无序的。
操作符 | 描述 |
s1 = ' ' | 空字符串 |
s2 = "spam's" | 双引号 |
block = """...""" | 三重引号块 |
s3 = r'\temp\spam' | Raw字符串 |
s4 = u'spam' | Unicode字符串 |
s1 + s2,s2 * 3 | 合并,重复 |
s2[i],s2[i:j],len(s2) | 索引,分片,求长度 |
"a %s parrot" % type | 字符串格式化 |
s2.find('pa') | 搜索 |
s2.rstrip() | 移除空格 |
s2.replace('pa','xx') | 替换 |
s1.split(' , ') | 用占位符分隔 |
s1.isdigit() | 测试字符串内容是否为数字,返回bool值 |
s1.lower() | 转换为小写字母 |
for x in s2 | 迭代 |
'spam' in s2 | 成员关系 |
单双引号字符串是一样的,"knight's"也可以表示为'knight\'s'或者"knight\"s"
用转义序列代表特殊字节
转义序列:反斜杠+特殊字节编码。例如,这里有五个字符的字符串,其中嵌入了一个换行符'\n'和一个制表符'\t'
>>>s = 'a\nb\tc'
字符串反斜线字符
转义 | 意义 |
\\ | 反斜线(保留\) |
\' | 单引号(保留 ' ) |
\" | 双引号(保留 " ) |
\a | 响铃(BEL) |
\b | 退格(BS) |
\f | 换页(FF) |
\n | 换行(LF) |
\r | 返回(CR) |
\t | 水平制表(HT) |
\v | 垂直制表(VT) |
\uhhhh | Unicode 16位的十六进制值 |
\Uhhhh | Unicode 32位的十六进制值 |
\xhh | 十六进制值 |
\000 | 八进制值 |
\0 | 空字符(NULL) |
字符串抑制转义
在字符串前面增加‘r’或是加入转义字符,如下所示
- myfile = open('C:\new\text.dat','w')
- myfile = open(r'C:\new\text.dat','w') #方法一
- myfile = open('C:\\new\\text.dat','w') #方法二
索引和分片
偏移量是从0开始的,负偏移看作是从结束处反向计数
- >>> S = 'spam'
- >>> S[0], S[-2] # 索引
- ('s', 'a')
- >>> S[1:3], S[1:], S[:-1] # 分片
- ('pa', 'pam', 'spa')
扩展分片:第三个值表示步长
- >>> S = 'abcdefghijklmnop'
- >>> S[1:10:2]
- 'bdfhj'
- >>> S[::2]
- 'acegikmo'
-
- >>> S = 'hello'
- >>> S[::-1]
- 'olleh'
-
- >>> S = 'abcedfg'
- >>> S[5:1:-1]
- 'fdec'
字符串的修改
在第4章我们提到过,字符串本身是不支持修改的,我们用如下的方法来进行修改:
- >>> S = 'spam'
- >>> S[0] = "x"
- Raises an error!
-
- >>> S = S + 'SPAM!'
- >>> S
- 'spamSPAM!'
- >>> S = S[:4] + 'Burger' + S[-1]
- >>> S
- 'spamBurger!'
-
- >>> S = 'splot'
- >>> S = S.replace('pl', 'pamal')
- >>> S
- 'spamalot'
字符串转列表,列表转字符串
- >>> S = 'spammy'
- >>> L = list(S)
- >>> L
- ['s', 'p', 'a', 'm', 'm', 'y']
-
- >>> L[3] = 'x' # Works for lists, not strings
- >>> L[4] = 'x'
- >>> L
- ['s', 'p', 'a', 'x', 'x', 'y']
-
- >>> S = ''.join(L)
- >>> S
- 'spaxxy'
字符串方法实例:文本解析
>>> line = 'aaa bbb ccc' >>> col1 = line[0:3] >>> col3 = line[8:] >>> col1 'aaa' >>> col3 'ccc' >>> line = 'aaa bbb ccc' >>> cols = line.split() >>> cols ['aaa', 'bbb', 'ccc'] >>> line = 'bob,hacker,40' >>> line.split(',') ['bob', 'hacker', '40'] >>> line = "i'mSPAMaSPAMlumberjack" >>> line.split("SPAM") ["i'm", 'a', 'lumberjack']
操作 | 解释 |
L1 = [] | 空列表 |
L2 = [0,1,2,3] | 四项:索引为0到3 |
L3 = ['abc',['def','ghi']] | 嵌套的子列表 |
L2[i] | 索引 |
L3[i][j] | 索引的索引 |
L2[i:j] | 分片 |
len(L2) | 求长度 |
L1 + L2 | 合并 |
L1 * 3 | 重复 |
for x in L | 迭代 |
3 in L2 | 成员关系 |
L2.append(4) | 增长 |
L2.extend([5,6,7]) | 扩展 |
L2.sort() | 排序 |
L2.index(1) | 搜索 |
L2.insert(I,X) | 插入 |
L2.reverse() | 反转 |
del L2[k] | 裁剪索引 |
del L2[i:j] | 裁剪分片 |
L2.pop() | 删除列表末端元素,也可以按索引删除 |
L2.remove(2) | 按索引删除列表中某元素 |
L2[i:j] = [] | 清空列表 |
L2[i] = 1 | 索引赋值 |
L2[i:j] = [4,5,6] | 分片赋值 |
range(4) | 生成整数列表 |
xrange(0,4) | 返回一个生成器(在版本3.0中已移除) |
L4 = [x**2 for x in range(5)] | 列表解析 |
L3.count('abc') | 对‘123’进行计数 |
操作 | 解释 |
D1 = {} | 空字典 |
D2 = {'spam':2,‘eggs’:3} | 两项目字典 |
D3 = {'food':{'ham':1,'egg':2}} | 嵌套的字典 |
D2['eggs'] | 以键进行索引 |
D3['food']['ham'] | 索引的索引 |
D2.has_key('eggs') | 成员测试 |
'eggs' in D2 | 成员测试 |
D2.keys() | 键列表 |
D2.values() | 值列表 |
D2.copy() | 复制 |
D2.get(key,default) | 获取key,找不到返回default值 |
D2.update(D1) | 合并 |
D2.pop(key) | 按键索引删除元素 |
len(D1) | 长度(储存的元素的数目) |
D2[key] = 42 | 新增/修改键 |
del D2[key] | 删除键 |
D4 = dict.fromkeys(['a','b']) | 构造字典技术 |
D5 = dict(zip(keyslist,valslist)) | 构造字典技术 |
D6 = dict(name='Bob',age=42) | 构造字典技术 |
字典能用作稀疏数据的存取,这一点在实际生活中是经常用到的。
举出五种创建字典的方法
- {'a':0,'b':1}
-
- D = {}
- D['a'] = 0
- D['b'] = 1
-
- dict('a'=0,'b'=1)
-
- dict(['a',0],['b',1])
-
- dict(zip(['a','b'],[0,1]))
运算 | 解释 |
() | 空元组 |
t1 = (0,) | 单个元素的元组(非表达式) |
t2 = (0,'Ni',1.2,3) | 四个元素的元组 |
t2 = 0,'Ni',1.2,3 | 四个元素的元组 |
t3 = ('abc',('def','ghi')) | 嵌套元组 |
t1[i] | 索引 |
t3[i][j] | 索引的索引 |
t1[i:j] | 分片 |
len(t1) | 长度 |
t1 + t2 | 合并 |
t2 * 3 | 重复 |
for x in t2 | 迭代 |
'spam' in t2 | 成员关系 |
列表和元组的区别:列表提供可变性,元组提供不可变性。
myfile = open('myfile','w')
参数‘w’是指写入。'r'是指读取,是默认值,‘a’是在文件尾部追加内容。
- >>> D = {'a': 1, 'b': 2}
- >>> F = open('datafile.pkl', 'wb')
- >>> import pickle
- >>> pickle.dump(D, F) # Pickle any object to file
- >>> F.close()
-
- >>> F = open('datafile.pkl', 'rb')
- >>> E = pickle.load(F) # Load any object from file
- >>> E
- {'a': 1, 'b': 2}
以上是用pickle模块来储存python的原生对象
python中,类型是在运行过程中自动决定的,而不是通过代码去声明。
>>>a = 3
上面的代码反映了python语言中所有赋值的操作:
其中,a代表对象,3代表变量名。类型是属于对象的,而不是变量
关于对象的垃圾收集,我们给出如下的代码,每当一个变量名被赋予了一个新的对象,之前那个对象占用的空间就会被收回。
- >>>a = 3
- >>>a = 'spam'
共享引用
- >>>a = 3
- >>>b = a
- >>>a = 'spam'
以上代码,只会改变a的值,b的值是不变的。在第4章,我们所介绍过的,整数是不可变的。
- >>>L1 = [ 2,3,4]
- >>>L2 = L1
- >>>L1 = 24
以上代码,仍然只改变L1的值,L2的值也是不变的。L1的列表自身也是对象,就像整数和字符串一样,自身是不会被改变的。
- >>>L1 = [ 2,3,4]
- >>>L2 = L1
- >>>L1[0] = 24
以上代码,L1和L2的值都被改为了[24,3,4]。L1列表中的元素是可以被改变的。如果我们不想L2发生改变,我们需要做如下改动
- >>>L1 = [ 2,3,4]
- >>>L2 = L1[:]
- >>>L1[0] = 24
L1[:]是对L1的对象的copy。字典D有两种的copy方法,分别是copy()和deepcopy()
共享引用和相等
- >>>L = [ 1,2,3]
- >>>M = L
- >>>L == M
- True
- >>>L is M
- True
- >>>L = [ 1,2,3]
- >>>M = [ 1,2,3]
- >>>L == M
- True
- >>>L is M
- False
"==操作符",测试两个被引用的对象是否有相同的值,"is操作符"是在检查对象的同一性
- >>>X = 42
- >>>Y = 42
- >>>X == Y
- True
- >>>X is Y
- True
这里因为小的整数和字符串会被缓存并复用,所以is告诉我们X和Y是一个相同的对象。我们能查询python对于一个对象重复的引用次数,如下所示:
- >>>import sys
- >>>sys.getrefcount(42)
- 23
随着python的发展,内置的对象操作或许还会扩展更多,也会更易用,我们需要不断学习,不断更新自己的知识。
送大家一句鸡汤:知识要用起来才会变成自己的,经验不在于多,而在于精。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。