1. 数据结构与序列
数据结构是,以某种方式(比如符号)组合起来的数据元素,比如数、字符乃至其他数据结构的集合。
在 Python 中,最基本的数据结构为序列。序列中的每个元素都有编号,即位置或索引,其中第一个元素的索引为 0,第二个为 1,类推。。。
Python 中比较常用的序列有三种,列表、元祖、还有就是字符串。我们必须知道,列表是可以修改的,元祖不可以(用于保存一些不能够修改的初始变量个人感觉不错,有些场景可能作为字典键。),还有啊,再说一遍,序列还可以包含其他序列!
Python 还支持一种数据结构的基本概念,叫做容器,容器基本上可以包含任何对象。两种主要的容器是序列(列表、元祖)和映射(字典),序列中每个元素都有编号,映射中每个元素都有键。另外一种比较特殊的容器就是集合(set)(既不是序列也不是映射)。
2. 对序列的通用操作
Python 中序列有一些通用操作方式,比如索引、切片、相加、相乘和成员资格检查。另外的,还有一些 Python 的内置函数,用于确定序列的长度以及找出序列中最大和最小的元素。
索引:
序列中的每一个元素都有编号 —— 用 0 开始递增,称为索引,当使用负数索引时,Python 将从最右边开始往左数,-1 是最后一个元素的位置。
Python 不同于 Java ,Python 的字符串就是由字符组成的序列,Python 没有专门用于表示字符的类型,一个字符就是只包含一个元素的字符串。
# 对序列进行索引操作。
string = 'Hello World !!!'
string[0]
Out[4]: 'H'
string[-1]
Out[5]: '!'
切片:
通过对序列进行切片,可以访问指定索引范围内的元素。值得注意的是,切片通过指定的索引来进行,如有两个索引,则其中第一个索引指定的元素包含在切片内,第二个索引指定元素不包含在切片内。
# 对序列进行切片操作。
string = 'Hello World !!!'
string[0 : 12]
Out[7]: 'Hello World '
string[-3 : -1]
Out[11]: '!!'
string[-3 : ]
Out[21]: '!!!'
string[:]
Out[22]: 'Hello World !!!'
string[:-3]
Out[23]: 'Hello World '
# 对步长进行设置。
string[::2]
Out[24]: 'HloWrd!!'
序列相加:
a = [1, 2, 3]
b = [1, 2, 3]
a + b
Out[29]: [1, 2, 3, 1, 2, 3]
乘法操作:
a = [1]
b = a * 5
b
Out[32]: [1, 1, 1, 1, 1]
成员资格检查:(使用运算符 in)
s = 'String ...'
's' in s
Out[36]: False
'S' in s
Out[37]: True
3. 列表(list)
Python 中的列表是可变的,下面来看下对列表的基本操作。
# 使用 list 类将字符串转换成列表。
string = list('Hello world !!!')
# 将列表转换成字符串。
''.join(string)
Out[41]: 'Hello world !!!'
string[-1] = '?'
列表中的一些常用方法:
append :将一个对象附加到列表的末尾。
clear :就地清空列表的内容。
copy :对列表内容进行复制。
count :用于计算指定元素在列表中出现的次数。
extend :方法可以将多个值附加到列表的末尾。
index :用于在列表中查找指定值第一次出现的索引。
insert :用于将一个对象插入到列表中的指定位置。
pop :方法从列表末尾删除一个元素并返回。
remove :用于在列表中删除第一个为指定值的元素。
reverse :按照相反的顺序排列列表中的元素。
sort :对列表进行就地排序,而不是返回列表副本。
4. 元祖(tuple)
跟列表不同,元祖属于不能够修改的序列。只要将值进行逗号分隔,就能自动创建一个元祖。由于元祖也属于序列,因此也能够对元祖进行一系列的序列操作。
tuple('Hello World !!!')
Out[48]: ('H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', ' ', '!', '!', '!')
5. 字符串(str)
我们知道,字符串也是属于序列的一种,所有标准的序列操作都适用于字符串,但由于字符串是不可变的,因此所有的元素赋值跟切片赋值都是非法的。
# 经典的对字符串进行格式设置。
'My name is %s , i am %d years old .' % ('GYS', 12)
Out[62]: 'My name is GYS , i am 12 years old .'
# 对浮点数进行三位小数的保留。
'My name is %s , i am %.3f years old .' % ('GYS', 12.123123)
Out[65]: 'My name is GYS , i am 12.123 years old .'
下面来看下 Python3 中对字符串进行格式设置的方法 format() 。
'My name is {}, i am {} years old.'.format('gys', 18)
Out[66]: 'My name is gys, i am 18 years old.'
'My name is {1}, i am {0} years old.'.format('gys', 18)
Out[67]: 'My name is 18, i am gys years old.'
'My name is {}, i am {:.2f} years old.'.format('gys', 18.123)
Out[68]: 'My name is gys, i am 18.12 years old.'
设置字符串格式详解:
对于要进行格式设置的字符串,简单来说就是对字符串调用 format 方法,并提供要设置其格式的值(花括号括起来的为替换字段,若果要在最终结果中包含花括号,可在字符串中使用两个花括号,即 {{}} 来进行指定)。
在格式字符串中,替换字段由字段名、转换标志、格式说明符三部分组成,其中的每个部分都是可选的。
字段名:索引或标识符,指出要设置哪个值的格式并使用结果来替换该字段。除了指定特定值外,还可以指定值的特定部分,比如列表元素。
转换标志:跟在感叹号后面的单个字符。当前支持的转换形式有 r(表示 repr)、s(表示 str)跟 a(表示 ascii )。
格式说明符:跟在冒号后面的表达式,格式说明符能够详细的指定最终的格式,比如(字符串、浮点数),当然也可以设置字段宽度跟数的精度。
字符串格式设置中的类型符说明:
b :将整数表示为二进制数。
c :将整数解读为 Unicode 码点。
d :将整数视为十进制数进行处理(默认)。
e :使用科学表示法来表示。
f :将数值型数据表示为浮点数。
F :与 f 相同,但对于特殊值(nan 和 inf),使用大写表示。
o :将整数表示为八进制数。
s :保持字符串的格式不变(默认)。
x :将整数表示为十六进制数并使用小写字母。
X :与 x 相同,但使用大写字母。
% :将数表示为百分比值。
# 感受一下字符串方法,format 的使用。
'{{ This is test String ... }}'.format()
Out[69]: '{ This is test String ... }'
'{} {s1} {s2} {}'.format(1, 2, s1 = 5, s2 = 6)
Out[72]: '1 5 6 2'
'{1} {s1} {s2} {0}'.format(1, 2, s1 = 5, s2 = 6)
Out[73]: '2 5 6 1'
'{} {li[1]}'.format(1, li = [1, 2])
Out[74]: '1 2'
'{s!r} {s!s} {s!a}'.format(s = '我')
Out[77]: "'我' 我 '\\u6211'"
'Number is {num:f}'.format(num = 10.123)
Out[80]: 'Number is 10.123000'
'Number is {num:b}'.format(num = 10)
Out[82]: 'Number is 1010'
看一下宽度、精度跟千分位分隔符的使用:
# 数跟字符串的对其方式不同。
'Num: {num:6}'.format(num = 3)
Out[83]: 'Num: 3'
'Str: {str:6}'.format(str = 'GYS')
Out[84]: 'Str: GYS '
# 对精度进行指定。
'Π is : {:.6f}'.format(3.1415926535)
Out[85]: 'Π is : 3.141593'
'{:.5}'.format('My name is gys...')
Out[86]: 'My na'
# 千分位分隔符。
'Number is : {:,}'.format(1000000000)
Out[87]: 'Number is : 1,000,000,000'
符号、对齐跟填充:
之前尝试过,字符串跟数的默认对齐方式不同。如果需要指定左对齐、右对齐或居中,可以分别使用 <、> 跟 ^ ,同时在更改对齐方式的时候,只需要在指定宽度跟精度的数面前添加一个标志(如$、0),就可以进行字符串的填充。
如果要给数加上符号,那么可以使用说明符+(默认为 - )。如果要给指定类型的数(如八进制、十六进制)加上前缀,那么可以通过 # 号进行指定。
# 居中并通过 $ 进行填充。
'{:$^15.3f}'.format(0.001235)
Out[101]: '$$$$$0.001$$$$$'
# 对不同的进制加上前缀。
'{:#b}'.format(123)
Out[102]: '0b1111011'
'{:#o}'.format(123)
Out[103]: '0o173'
'{:+} {:+}'.format(1.23, -1.2)
Out[105]: '+1.23 -1.2'
一些常用的字符串方法:
center :方法默认通过在两边添加填充字符让字符串居中(填充字符默认为空格)。
find :用于在字符串中查找子串,如果找到,就返回子串的第一个字符的索引。否则返回 -1 。
join :用于合并序列中的元素。
lower :返回字符串的小写版本。
title :将字符串转换成单词首个字母大写。
replace :将指定子串都替换为另一个字符串。
split :用于将字符串拆分为序列。
strip :用于将字符串开头和末尾的空白删除,并返回删除后的结果。
translate :方法只能够进行单字符的替换,但是能够同时替换多个单字符。