0x00 准备
数据结构
数据结构是通过某种方式组织在一起的数据元素的集合
0x01 序列
六种内建序列:
列表(可以修改)
元组(不能修改)
Unicode字符串(不能修改)
buffer对象
xrange对象
Python的数据访问模型:直接存取 ,序列 ,映射
对非容器类都可以直接存取,所有的数值类型归为此类。
序列类型是指容器内的元素从0开始的索引顺序访问,一次可以访问一个或者多个元素。 字符串列表元组归到次类
映射类型和序列类型不同之处,它使用的索引和顺序的数字偏移量不同,它的元素无序存放,通过唯一的key来访问。 字典就是这种类型。
字符串(strings),列表(lists),元组(tuples),我们可以统称为序列。
序列通用的操作符
- 连接操作符(+)
- 重复操作符(*)
- 切片操作符 [ ] [:] [: : ]
- 成员操作符( in , not in )
序列通用操作
索引
>>> t='hello'
>>> t[0]
'h'
分片
第一个索引元素是包含在分片内,第二个不在分片内
>>> tag='<a href="http://www.python.org">python web site</a>'
>>> tag[32:-4]
'python web site'
>>> number=[1,2,3,4,5,6,7,8,9,10]
>>> number[3:6]
[4,5,6]
>>> number[0:1]
[1]
>>> number[-3:-1]
[8,9]
分片中左边索引比右边晚出现在序列中,结果就是一个空的序列
>>> number[-3:0]
[]
>>> number[-3:]
[8,9,10]
>>>number[:3]
[1,2,3]
步长
a[0:10:1]
最后一个元素表示步长
>>> number=[1,2,3,4,5,6,7,8,9,10]
>>> number[0:10:1]
[1,2,3,4,5,6,7,8,9,10]
>>> number[0:10:2]
[1,3,5,7,9]
>>> number[3:6:3]
[4]
快速使用
>>> number[::4]
[1,5,9]
步长为负数
>>> number[8:3:-1]
[9,8,7,6,5]
>>> number[10:0:-2]
[10,8,6,4,2]
>>> number[0:10:-2]
[]
>>> number[::-2]
[10,8,6,4,2]
>>> number[5::-2]
[6,4,2]
>>> number[:5:-2]
[10,8]
序列运算
>>> [1,2,3]+[4,5,6]
[1,2,3,4,5,6]
>>> 'Hello,'+'world!'
'Hello,world!'
>>> 'python'*5
'pythonpythonpythonpythonpython'
>>> [42]*5
[42,42,42,42,42]
例子:
根据用户输入自动调整大小的盒子
sentence = raw_input("Sentence:")
screen_width = 80
text_width = len(sentence)
box_width = text_width +6
left_margin = (screen_width - box_width) // 2
print
print ' ' * left_margin + '+' + '-' * text_width + '+'
print ' ' * left_margin + '|' + ' ' * text_width + '|'
print ' ' * left_margin + '|' + sentence + '|'
print ' ' * left_margin + '|' + ' ' * text_width + '|'
print ' ' * left_margin + '+' + '-' * text_width + '+'
print
成员资格
检查值是否存在序列中
>>> t1 = 'ew'
>>> 'w' in t1
>>> True
database = [['t1','1234'],['t2','5678'],['t3','4321'],['t4','9876']]
username = raw_input('User name:')
pin = raw_input('PIN code:')
if [username,pin] in database:print 'Access granted'
内建函数
len
>>> number = [100,34,678] >>> len(number) 3
min
>>> number = [100,34,678] >>> min(number) 34
- max
>>> max(2,3,4,5)
>>> 5
0x02 元组tuple()
不能修改的一种序列、用圆括号括起来表示
tuple函数
将序列转换为元组
>>> tuple([1,2,3])
(1,2,3)
>>> tuple('abc')
('a','b','c')
>>> tuple((1,2,3))
(1,2,3)
1、创建元组
>>> a = (1, 3, 5, 7)
>>> a
(1, 3, 5, 7)
>>> a = ('physics', 'chemistry', 1997, 2000)
>>> a
('physics', 'chemistry', 1997, 2000)
>>> a="1","b","33"
>>>a
('1', 'b', '33')
创建空元组
tup1=()
元组中只包含一个元素时,需要在元素后面添加逗号来消除歧义
tup1 = (50,)
元组与字符串类似,下标索引从0开始,可以进行截取,组合等。
2、访问元组
>>> a = ('a', 3, 5, 7)
>>> a
('a', 3, 5, 7)
>>>a[2]
5
>>>a[1:2]
(3,)
>>>a[:2]
('a', 3)
>>>a[2:]
(5, 7)
3、增、删、改
需要重新组成一个新的元组
>>> aTuple=aTuple[0],aTuple[1],aTuple[-1]
>>> aTuple
(123,'abc',(7-9j))
>>> t1=(12,34.23)
>>> t2=('asv','12xyz')
>>> t3=t1+t2
>>> t3
(12,34.23,'asv','12xyz')
4、内建函数
Python元组包含了以下内置函数
1、cmp(tuple1, tuple2):比较两个元组元素。
2、len(tuple):计算元组元素个数。
3、max(tuple):返回元组中元素最大值。
4、min(tuple):返回元组中元素最小值。
5、tuple(seq):将序列作为参数转换为元组。
>>> tuple([1,2,3])
(1,2,3)
>>> tuple('abc')
('a','b','c')
>>> tuple((1,2,3))
(1,2,3)
0x03 列表[]
能够修改的一种序列,用[]表示
list函数
内建函数、将其他类型的序列转换成列表
>>> list('Hello')
['H','e','l','l','o']
1、创建列表
>>> x=[]
>>> x=[1,2,3]
>>> x
[1,2,3]
>>> x=[1,]
>>> x
[1]
2、列表的基本操作
改变列表、元素赋值
>>> x=[1,2,3]
>>> x[1]=3
>>> x
[1,3,3]
删除元素
>>> a=[1,2,3,4]
>>> del a[2]
>>> del
[1,2,4]
分片
分片赋值
>>> name=list('Perl')
>>> name
['P','e','r','l']
>>> name[2:]=list('ar')
>>> name
['P','e','a','r']
分片插入
>>> number=[1,5]
>>> number[1:1]=[2,3,4]
>>> number
[1,2,3,4,5]
分片删除
>>> number
[1,2,3,4,5]
>>> number[1:4]=[]
>>> number
[1,5]
3、列表方法
1、append
——列表末尾追加对象
>>> lst=[1,2,3]
>>> lst.append(4)
>>> lst
[1,2,3,4]
2、count——统计某个元素在列表中出现的次数
>>> ['to','be','or','to'].count('to')
2
>>> x=[[1,2],1,1,[2,1,[1,2]]
>>> x.count(1)
2
>>> x.count([1,2])
1
3、extend——在列表末尾一次性追加另一个序列中的多个值
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> a.extend(b)
>>> a
[1,2,3,4,5,6]
注意
extend方法修改被扩展的序列、
而+操作是全新的列表、效率比extend低
4、index——用于从列表中找出某个值第一个匹配项的索引位置
>>> number=['1','2']
>>> number.index('2')
1
5、insert——将对象插入到列表的指定位置
>>> number=[1,2,3,5,6,7]
>>> number.insert(3,'four')
>>> number
[1,2,3,'four',5,6,7]
6、pop
pop会移除列表中的一个元素(默认是最后一个),并且返回该元素的值
>>> x=[1,2,3]
>>> x.pop()
3
>>> x
[1,2]
>>> x.pop(0)
1
>>> x
[2]
入栈append
出栈pop
>>> x=[1,2,3]
>>> x.append(x.pop())
>>> x
[1,2,3]
7、remove
移除列表中某个值的第一个匹配项 没有返回值
>>> x=['to','be','not','be']
>>> x.remove('be')
>>> x
['to','not']
8、reverse
将列表中的元素反向存放
>>> x=[1,2,3]
>>> x.reverse()
>>> x
[3,2,1]
9、sort
在原位置对列表进行排序,没有返回值,是None、不能够直接赋值
>>> x=[4,6,2,1,7,9]
>>> x.sort()
>>> x
[1,2,4,6,7,9]
10、sorted
获取另一种已排序的列表副本方法
>>> x=[4,6,2,1,7,9]
>>> y=sorted(x)
>>> x
[4,6,2,1,7,9]
>>> y
[1,2,4,6,7,9]
- 高级排序
>>> cmp(42.32)
1
>>> cmp(99,100)
-1
>>> cmp(10,10)
0
>>> number=[5,2,9,7]
>>> number.sort(cmp)
>>> number
[2,5,7,9]
参数key与参数cmp类似——必须提供一个在排序过程中使用的函数、为每一个元素创建一个键,然后将所有元素根据键来排序
>>> x=['asfdfd','abc','acme']
>>> x.sort(key=len)
>>> x
['abc','acme','asfdfd']
反向排序
>>> x=[4,6,2,1,7,9]
>>> x.sort(reverse=True)
>>> x
[9,7,6,4,2,1]
0x04 字符串
不可变类型
1、创建字符串
>>> website = 'tetete'
2、字符串基本操作
索引
>>> string = 'string'
>>> string[2]
'r'
不能够直接改变值
>>> string[2] = 'd'
❌ 错误
3、字符串方法
字符串常量
引入import string
- string.digits:包含数字0~9的字符串
- string.letters:包含所有字母(大写或者小写)的字符串
- string.lowercase:包含所有小写字母的字符串
- string.printable:包含所有可打印字符的字符串
- string.punctuation:包含所有标点的字符串
- string.uppercase:包含所有大写字母的字符串
find
查找字符串中的子字符串,返回子串所在位置的最左端索引,没有则返回-1
join
连接字符串列表
>>> seq = ['1','2','3','4','5']
>>> sep = '+'
>>> sep.join(seq)
'1+2+3+4+5'
lowr
返回字符串小写字母
>>> name = 'Gumby'
>>> name = ['gumby','smith','jones']
>>> if name.lower() in names:print 'Found it!'
Found it!
replace
查找并替换
可以匹配多个字符 但只能替换一次
>>> 'This is a test'.replace('is','eez')
split
join的逆方法 将字符串分割成序列
>>> '1+2+3+4'.split('+')
['1','2','3','4']
strip
去除字符串两侧指定字符
不加参数,去掉空格
>>> '*** SPAM * for * everyone!!! ***'.strip(' *!')
'SPAM * for * everyone'
lstrip去除左侧
rstrip去除右侧
translate
替换字符串的某些部分 仅仅处理单个字符 可同时替换多个