字符串
获取长度
1>>> s = 'spam'
2>>> len(s)
34
正向索引
1>>> s
2'spam'
3>>> s[0]
4's'
5>>> s[1]
6'p'
反向索引
Python 字符串支持反向索引:
1>>> s
2'spam'
3>>> s[-1]
4'm'
5>>> s[-4]
6's'
s[-1]
和 s[len(s) - 1]
是等效的。
切片(Slice)
1>>> s
2'spam'
3>>> s[1:3]
4'pa'
5>>> s[1:]
6'pam'
7>>> s[:3]
8'spa'
9>>> s[:-1]
10'spa'
11>>> s[:]
12'spam'
拼接
1>>> s
2'spam'
3>>> s + 'xyz'
4'spamxyz'
5>>> s
6'spam'
7>>> s * 8
8'spamspamspamspamspamspamspamspam'
Note:
- 加号
+
对于不同对象具有不同的操作语义:用于数字表示加法,用于字符串表示拼接。这个特性称为多态,一个操作的语义取决于具体的操作对象。
不可变性
Python的字符串是不可变的,字符串一旦被创建后,则不能被修改,只能新建新的字符串。
1>>> s
2'spam'
3>>> s[0] = 'z'
4Traceback (most recent call last):
5 File "<stdin>", line 1, in <module>
6TypeError: 'str' object does not support item assignment
7>>> s = 'z' + s[1:]
8>>> s
9'zpam'
Note:
- Python 中的每个对象要么是可变的要么是不可变的。
- Python 核心类型中,数值、字符串和元组是不可变的;而列表、字典、集合是可变的。
字符串方法
字符串可以使用 find()
方法查找子字符串:
1>>> s = 'spam'
2>>> s.find('pa')
31
字符串的 replace()
方法可以对字符串进行全局查找和替换(并不会修改原始字符串):
1>>> s
2'spam'
3>>> s.replace('pa', 'XYZ')
4'sXYZm'
5>>> s
6'spam'
split()
方法可以通过分隔符将字符串拆分成子字符串列表:
1>>> line = 'aaa,bbb,ccccc,dd'
2>>> line.split(',')
3['aaa', 'bbb', 'ccccc', 'dd']
转换大小写:
1>>> s = 'Spam'
2>>> s.upper()
3'SPAM'
4>>> s.lower()
5'spam'
去除空白字符:
1>>> line = 'aaa,bbb,ccccc,dd\\n'
2>>> line.rstrip()
3'aaa,bbb,ccccc,dd'
4>>> line
5'aaa,bbb,ccccc,dd\\n'
6>>> line.rstrip().split(',')
7['aaa', 'bbb', 'ccccc', 'dd']
判断字符串是否全为字母或全为数字:
1>>> '123'.isdigit()
2True
3>>> '123'.isnumeric()
4True
5>>> 'abc'.isalpha()
6True
7>>> 'abc123'.isalnum()
8True
9>>> 'abc'.islower()
10True
11>>> 'ABC'.isupper()
12True
格式化
1>>> '%s, eggs, and %s' %('spam', 'SPAM!')
2'spam, eggs, and SPAM!'
3>>> '{0}, eggs, and {1}'.format('spam', 'SPAM!')
4'spam, eggs, and SPAM!'
5>>> '{}, eggs, and {}'.format('spam', 'SPAM!')
6'spam, eggs, and SPAM!'
7>>> name = 'World'
8>>> f'Hello, {name}!'
9'Hello, World!'
10>>> 'Hello, {name}'
11'Hello, {name}!
12>>> '{:,.2f}'.format(296999.2567)
13'296,999.26'
14>>> '%.2f | %+05d' %(3.14159, -42)
15'3.14 | -0042''
其他
1>>> s = 'A\\nB\\tC'
2>>> s
3'A\\nB\\tC'
4>>> s = 'A\\0B\\0C'
5>>> s
6'A\\x00B\\x00C'
-
Python 的字符串可以使用单引号、双引号或三个引号(单引号或双引号)表示,推荐使用单引号。
-
Python 支持原始(raw)字符串字面量,即去掉反斜杠转义机制。
1>>> s = r'A\\nB\\tC' 2>>> s 3'A\\\\nB\\\\tC' 4>>> len(s) 57
模式匹配
1>>> import re
2>>> match = re.match('Hello[ \\t]*(.*)world', 'Hello Python world')
3>>> match.group()
4'Hello Python world'
5>>> match.group(1)
6'Python '
列表
列表(List)是一个可变对象,可以对列表进行索引、切片、拼接等操作。
将列表当作栈使用
1stack = [3, 4, 5]
2stack.append(6) # 入栈
3top = stack.pop() # 出栈
将列表当作队列使用
1from collections import deque
2
3q = deque([1, 2, 3]) # 初始化双边队列
4q.appendleft(0) # 从左边入队
5q.append(4) # 从右边入队
6left = q.popleft() # 从左边出队
7right = q.pop() # 从右边出队
排序
列表的 sort()
方法可以进行原地排序,而 reverse()
方法可以对列表进行翻转。
1>>> words = ['Hello', 'World', 'Python']
2>>> words.sort()
3>>> words
4['Hello', 'Python', 'World']
5>>> words.reverse()
6>>> words
7['World', 'Python', 'Hello']
嵌套列表
1>>> mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
2>>> mat
3[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
列表推导式
列表推导式(List Comprehension Expression)提供了一个处理序列的高级操作。
1>>> vec = [2, 4, 6]
2>>> [3 * x for x in vec]
3[6, 12, 18]
4>>> [3 * x for x in vec if x > 3]
5[12, 18]
6>>> [3 * x for x in vec if x < 3]
7[6]
8>>> vec1 = [2, 4, 6]
9>>> vec2 = [4, 3, -9]
10>>> [x * y for x in vec1 for y in vec2]
11[8, 6, -18, 16, 12, -36, 24, 18, -54]
12>>> [x + y for x in vec1 for y in vec2]
13[6, 5, -7, 8, 7, -5, 10, 9, -3]
14>>> [vec1[i] * vec2[i] for i in range(len(vec1))]
15[8, 12, -54]
16>>> [str(round(355 / 113, i)) for i in range(1, 6)]
17['3.1', '3.14', '3.142', '3.1416', '3.14159']
18>>> fresh_fruit = [' banana', ' loganberry ', 'passion fruit ']
19>>> [weapon.strip() for weapon in fresh_fruit]
20['banana', 'loganberry', 'passion fruit']
元组
元组(Tuple)是一个不可变序列对象,元组提供了一种完整性约束。
集合
- 可以用
{}
创建一个非空集合 - 如果要创建一个空的集合,必须要用
set()
而不能用大括号{}
,因为{}
会创建一个空的字典而非集合 - 集合也支持推导式
字典
1# 使用items()方法遍历字典
2my_dict = {'one': 1, 'two': 2, 'three': 3}
3for k, v in my_dict.items():
4 print(k, v, sep=':')
5
6# 使用enumerate()函数遍历列表
7my_list = ['one', 'two', 'three']
8for i, v in enumerate(my_list, 1):
9 print(v, i, sep=':')
10
11# 多个列表可以使用zip遍历
12questions = ['name', 'age', 'favorite color']
13answers = ['python', '18', 'red']
14for q, a in zip(questions, answers):
15 print("What's your {0}? It's {1}.".format(q, a))