Python 用作计算器:数字运算
启动 Python 解释器后,最直接的用法就是把它当成一台功能强大的计算器。在 >>> 提示符后键入表达式,解释器就会立即计算并给出结果。
常用算术运算符
+、-、*:分别执行加法、减法与乘法;/:经典除法,请特别注意:除法在 Python 中总是返回带小数点的浮点数(float),例如8 / 5结果是1.6,4 / 2结果是2.0;//:向下取整除法(floor division),只保留商的整数部分,丢弃小数:17 // 3结果是5;%:取余运算(modulus),计算相除后的余数:17 % 3结果是2(满足关系式:向下取整的商 除数 余数 被除数);**:乘方运算,计算指数幂:5 ** 2(5 的平方)得到25,2 ** 7(2 的 7 次方)得到128。
在 Python 中,像 2、4、20 这种没有小数部分的数字属于整数(int);而像 5.0、1.6 这种带有小数点的属于浮点数(float)。
变量与赋值操作
单纯做算术往往无法支撑复杂程序,我们需要给计算结果起一个名字保存起来,以便后续继续使用。用于存储和引用数据的名字叫做变量(variable)。
在 Python 中,使用等号 = 进行赋值(assignment):
>>> width = 20
>>> height = 5 * 9
>>> width * height
900
- 等号
=的含义是“将等号右侧表达式的计算结果,关联绑定到左侧的名字上”; - 赋值语句成功执行后,解释器不会在屏幕上打印任何输出;
- 如果你试图访问一个未曾被赋值的变量,Python 会引发
NameError(名字错误),告诉你该名字尚未被定义:
>>> n
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined
在交互模式下,还有一个小技巧:上一次成功打印的表达式结果会自动存放在内置变量 _(单个下划线)中,可以方便地用作后续连续计算。
文本与字符串(str)
计算机不仅处理数字,还大量处理自然语言文本。在 Python 中,文本用**字符串(string,类型为 str)**表示。
界定符与转义字符
字符串可以用成对的单引号 '...' 或双引号 "..." 括起来,效果完全一致:
>>> 'spam eggs'
'spam eggs'
>>> "doesn't" # 外层用双引号,内部就可以直接书写单引号
"doesn't"
如果外部用单引号包围,且内部也包含单引号,就需要使用反斜杠 \ 进行转义(escape):'doesn\'t'。
常见的特殊转义字符还包括:
\n:表示换行符(newline);\t:表示制表符(tab)。
如果不希望前置 \ 的字符被解析为特殊转义字符,可以在字符串前加上字符 r,表示原始字符串(raw strings):
>>> print('C:\some\name')
C:\some
ame
>>> print(r'C:\some\name') # 加上 r 后原样保留反斜杠
C:\some\name
多行字符串
字符串字面值还可以跨越多行,通常使用三重引号 """...""" 或 '''...''' 包裹。
字符串的拼接与重复
- 使用
+号可以将两个字符串**拼接(concatenation)**粘在一起; - 使用
*号可以将字符串**重复(repetition)**指定次数:
>>> 3 * 'un' + 'ium'
'unununium'
两个相邻的字符串字面值(纯引号文本,不含变量)在书写时即使没有写加号,也会被 Python 自动合并连接。
下标索引(Indexing):定位单个字符
字符串属于序列(sequence)类型。序列中的每一个字符都有一个数字编号,称为索引(index)。我们可以用方括号 [...] 获取指定位置上的字符。
核心规则:Python 中的正向索引从 0 开始计数!
>>> word = 'Python'
>>> word[0] # 第 1 个字符(0 号位)
'P'
>>> word[5] # 第 6 个字符(5 号位)
'n'
此外,Python 原生支持负数索引,负数代表从字符串的最末尾倒着向前计数:
>>> word[-1] # 倒数第 1 个字符(最末尾)
'n'
>>> word[-2] # 倒数第 2 个字符
'o'
因为 -0 和 0 相同,所以负数索引从 -1 开始。
范围切片(Slicing):截取子字符串
如果说索引是取单个字符,那么**切片(slicing)**就是截取一段连续的子字符串。语法为:
word[start:stop]
切片的核心规则:包含起始位置(start),但不包含结束位置(stop),即数学上的左闭右开区间!
>>> word = 'Python'
>>> word[0:2] # 取下标 0(含)到 2(不含)的字符
'Py'
>>> word[2:5] # 取下标 2、3、4 的字符
'tho'
如果省略 start,默认从字符串开头截取;如果省略 stop,默认截取到字符串最末尾:
>>> word[:2] # 开头到 2 号位(不含)
'Py'
>>> word[2:] # 2 号位(含)到末尾
'thon'
>>> word[-2:] # 倒数第 2 个(含)到末尾
'on'
这种设计使得 word[:i] + word[i:] 总是精确无缝地还原原字符串 word。
官方教程给出的坐标参考图清晰揭示了切片的几何意义——索引数字指向的是字符之间的分割缝隙:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
字符串是不可变的(immutable)
在 Python 中,字符串是不可变的(immutable)。这意味着你无法对已有字符串的某个具体索引位置强行赋值修改:
>>> word = 'Python'
>>> word[0] = 'J'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
报错 TypeError 明确指出字符串不支持单项赋值。如果你需要得到一个修改后的文本,必须通过切片和拼接组合出一个全新的字符串:
>>> 'J' + word[1:]
'Jython'
内置函数 len() 可以随时返回字符串包含的字符总数:
>>> len(word)
6
掌握了数字与字符串的运算,我们已经具备了处理单个数据的能力。接下来,我们将迈入复合数据容器的大门——列表。