列表list
列表可以执行所有标准序列操作,如索引,切片,拼接和相乘,但列表最大的特点在于它是可变的。
列表的基本操作
#给列表里的元素赋值
>>> x = [1, 1, 1]
>>> x[1] = 2
>>> x
[1, 2, 1]
#从列表中删除元素
>>> names = ['a', 'b', 'c']
>>> del names[1]
>>> names
['a', 'c']
#给切片赋值
>>> name = list('baby')
>>> name
['b', 'a', 'b', 'y']
>>> name[2:] = list('ar')
>>> name
['b', 'a', 'a', 'r']
>>> name[1:1] = [2, 3, 4]
>>>name
['b', 2, 3, 4, 'a', 'a', 'r']
列表方法
- len(a): 返回列表长度
- max(a): 返回列表中最大值,列表中元素类型必须保持一致
- min(a): 返回列表中最小值,列表中元素类型必须保持一致
- a.append(object):用于将一个对象附加到列表末尾,它会直接修改旧列表而不会返回新列表
- a.clear():清空列表的内容,类似于a[:] = []
- b = list.copy():复制列表,会将b关联到a的副本,对b的操作将不会影响到list,类似于使用a[:]或list(a),注意这里的copy函数属于浅拷贝 (深拷贝需要特定工具),即只拷贝一层内容,如
>>>list01 = [1,2,[3,4,5]]
>>>list02 = list01.copy()
>>>list02
[1, 2, [3, 4, 5]]
>>>id(list01), id(list02) #在第一层内容中两者id不同
(1509571938952, 1509571805704)
>>>id(list01[2]), id(list02[2]) #但在第二层内容中id还是相同
(1509571939208, 1509571939208)
>>>list02[2][1] = 88 #这里对于副本的修改依然会影响到原来的列表
>>>list02, list01
([1, 2, [3, 88, 5]], [1, 2, [3, 88, 5]])
- a.count(x):计算指定的元素在列表中出现的次数
- a.extend([1, 2, 4]):能够将多个值附加到列表末尾,换而言之就是用列表来扩展另一个列表
- a.index(x):在列表中查找指定值第一次出现的索引
- a.insert(3, ‘four’):将一个对象插入列表对应的索引中
- a.pop():从列表中删除一个元素(默认为最后一个元素,也可通过索引指定),并返回这一元素
- a.remove(x):删除第一个为指定值的元素,原地修改不返回
- a.reverse():按相反的顺序排列列表中的元素,也不返回任何值
- a.sort():对原列表就地排序,不返回排序后的列表的副本,可以接受key和reverse两个可选参数,key设置为一个用于排序的函数(如len)
- b = sorted(a):可以返回排序后的列表的副本,原来的列表不变
以上多个修改列表的方法执行却不返回任何值,因此容易有以下常见的错误方式:
>>> x = [1, 2, 3, 4, 5]
>>> y = x.append(6) #append方法没有返回任何值,只是原地修改列表x,sort方法也有同样结果
>>> y
None
>>> x
[1, 2, 3, 4, 5, 6]
元组(tuple)
元组的内容是不可修改的,不可修改的,不可修改的,元组中的值用逗号分隔,如果元组中只有一个值也必须在它后面加上逗号。除了不能修改之外,元组拥有与列表相同的特性,包括索引、切片、序列相加、相乘、成员资格操作等
>>> 42,
(42,)
>>> 3 * (40 + 2,)
(42, 42, 42)
>>> tuple([1, 2, 3])
(1, 2, 3)
- 元组变量交换
>>>a, b = 1, 2
>>>a, b
(1, 2)
>>>a, b = b, a
>>>a, b
(2, 1)
字符串
字符串适用于所有标准序列操作(索引、切片、乘法、成员资格检查、长度、最小值、最大值),但字符串是不可变的,因此所有的元素赋值和切片赋值都是非法的。
设置字符串的格式
- 转义字符
- 用一个特殊的方法表示出一系列不方便写出的内容,比如回车键,换行键,退格键
- 借助反斜杠字符,一旦字符串中出现反斜杠,则反斜杠后面一个火几个字符表示已经不是原来的意思了,进行了转义
- 在字符串中,一旦出现反斜杠就要加倍小心,可能由转义字符出现
>>>print('let\'s go') #\' == '
let's go
>>>print('C:\\user') #\\ == \
C:\user
>>>print('hello\r\nworld') #回车换行符
hello
world
- 替换字段名
# 使用未命名字段,并给参数指定名称
>>> "{foo} {} {bar} {}".format(1, 2, bar=4, foo=3)
'3 1 4 2'
# 使用索引来指定要在哪个字段中使用相应的未命名参数
>>> "{foo} {1} {bar} {0}".format(1, 2, bar=4, foo=3)
'3 2 4 1'
- 基本转换
#其中三个标志(s,r,a)指定分别使用str、repr和ascii转换,repr函数给出一个字符串字面量
>>> print("{pi!s} {pi!r} {pi!a}".format(pi='π'))
π 'π' '\u03c0'
#将整数作为小数处理
>>> "the number is {num:f}".format(num=42)
'the number is 42.000000'
#将整数作为二进制数处理
>>> "the number is {num:b}".format(num=42)
'the number is 101010'
字符串格式设置中的类型说明符
- 宽度、精度、千位分隔符
#设置宽度,字符串和数的对齐方式不同
>>> "{num:10}".format(num=3)
' 3'
>>> "{name:10}".format(name="bob")
'bob '
#设置精度,默认在小数点后显示6位小数
>>> "pi is {pi:10.2f}".format(pi=3.1415926)
'pi is 3.14'
#使用逗号指出要添加千位分隔符
>>> 'one billion is {:,}'.format(10**9)
'one billion is 1,000,000,000'
#在同时指定其他格式设置元素时,这个逗号应放在宽度和精度的句点之间
- 符号、对齐和用0填充
#使用0填充
>>> "{:010.2f}".format(3.14)
'0000003.14'
#指定左对齐<、右对齐>、居中^,并使用指定字符填充
>>> print("{0:¥<10.2f}\n{0:¥^10.2f}\n{0:¥>10.2f}".format(3.1415))
3.14¥¥¥¥¥¥
¥¥¥3.14¥¥¥
¥¥¥¥¥¥3.14
#更具体的说明符=,指定将填充字符放在符号和数字之间
>>> print('{0:10.2f}\n{1:=10.2f}'.format(3.1415, -3.1415))
3.14
- 3.14
#井号‘#’选项放在说明符和宽度之间,会触发一种转换方式
>>> "{0:#b}".format(42) #对于二进制转换会加上前缀
'0b101010'
>>> "{0:#g}".format(42) #对于十进制会保留小数点后的0
'42.0000'
字符串方法
- str.center(39, “*”):在两边添加填充字符(默认为空格)让字符串居中
- str.find(‘angela’, 1, 16):在字符串中查找子串,并可以指定查找的起点和终点(不包含)如果找到就返回子串第一个字符的索引,否则返回-1
- sep.join(str):用于合并序列的元素,sep为连接符,str必须都是字符串
- str.upper(): 返回字符串大写版本,但不改变原来的字符串
- str.lower():返回字符串的小写版本,但不改变原来字符串
- max(str): 返回字符串中最大值,根据ASCII码排序
- min(str): 返回字符串中最小值,根据ASCII码排序
- str.title():将字符串首字母大写
- str.replace(‘is’, ‘zee’):指定子串’is’都替换为另一个字符串’zee’,并返回替换后的结果,不改变原来字符串
- str.split(’+’):将字符串按指定分隔符拆分为序列
- str.strip():将字符串开头和结尾的空白删除,并返回删除后的结果,还可以指定要删除哪些字符(但仅限于开头和末尾)
- str.rstrip(): 将字符串右边的空格去除,不改变原来字符串
- str.lstrip(): 将字符串左边空格去除,不改变原来字符串
- str.isdigit(): 判断是否为字符串类型的整数,返回布尔值