课程章节

04.Python语言中的运算符

Python语言中的运算符

Python 语言支持很多种运算符,下面的表格按照运算符的优先级从高到低,对 Python 中的运算符进行了罗列。有了变量和运算符,我们就可以构造各种各样的表达式来解决实际问题。在计算机科学中,表达式是计算机程序中的句法实体,它由一个或多个常量、变量、函数和运算符组合而成,编程语言可以对其进行解释和计算以得到另一个值。不理解这句话没有关系,但是一定要知道,不管使用什么样的编程语言,构造表达式都是非常重要的。

运算符 描述
[]、[:] 索引、切片
** 幂
~、+、- 按位取反、正号、负号
*、/、%、// 乘、除、模、整除
+、- 加、减
>>、<< 右移、左移
& 按位与
^、` `
<=、<、>、>= 小于等于、小于、大于、大于等于
==、!= 等于、不等于
is、is not 身份运算符
in、not in 成员运算符
not、or、and 逻辑运算符
=、+=、-=、*=、/=、%=、//=、**=、&=、|=、^=、>>=、<<= 赋值运算符

说明: 所谓优先级就是在一个运算的表达式中,如果出现了多个运算符,应该先执行什么再执行什么的顺序。编写代码的时候,如果搞不清楚一个表达式中运算符的优先级,可以使用圆括号(小括号)来确保运算的执行顺序。

算术运算符

Python 中的算术运算符非常丰富,除了大家最为熟悉的加、减、乘、除之外,还有整除运算符、求模(求余数)运算符和求幂运算符。下面的例子为大家展示了算术运算符的使用。

"""
算术运算符
"""
print(321 + 12)     # 加法运算,输出333
print(321 - 12)     # 减法运算,输出309
print(321 * 12)     # 乘法运算,输出3852
print(321 / 12)     # 除法运算,输出26.75
print(321 // 12)    # 整除运算,输出26
print(321 % 12)     # 求模运算,输出9
print(321 ** 12)    # 求幂运算,输出1196906950228928915420617322241

算术运算需要先乘除后加减,这一点跟数学课本中讲的知识没有区别,也就是说乘除法的运算优先级是高于加减法的。如果还有求幂运算,求幂运算的优先级是高于乘除法的。如果想改变算术运算的执行顺序,可以使用英文输入法状态下的圆括号(小括号),写在圆括号中的表达式会被优先执行,如下面的例子所示。

"""
算术运算的优先级
"""
print(2 + 3 * 5)           # 17
print((2 + 3) * 5)         # 25
print((2 + 3) * 5 ** 2)    # 125
print(((2 + 3) * 5) ** 2)  # 625

字符串的拼接

前面介绍了+运算符在数字运算中的用法。+运算符还可以用于字符串,表示把两个或多个字符串连接起来,这种操作叫作字符串拼接。

name = '小明'
message = '你好,' + name
print(message)

first_name = 'Python'
last_name = '基础课程'
title = first_name + last_name
print(title)

运行结果如下:

你好,小明
Python基础课程

字符串拼接时,+两边必须都是字符串。如果一边是整数或浮点数,直接使用+进行拼接会产生TypeError错误。这时可以先使用str()函数把数字转换成字符串。

age = 18
score = 95.5
print('年龄:' + str(age))
print('成绩:' + str(score))

说明:+运算符用于数字时表示加法,用于字符串时表示拼接。字符串拼接适合连接较短的文本;如果需要在输出中同时处理多个变量和数值,使用print函数的多个参数,或者本课后面介绍的格式化输出方法更加方便。

位运算符

位运算符主要用于整数的二进制位。初学阶段先掌握下面几种运算符的基本含义即可:&表示按位与,|表示按位或,^表示按位异或,~表示按位取反,<<表示左移,>>表示右移。

a = 6       # 二进制为 110
b = 3       # 二进制为 011
print(a & b)   # 2,二进制 010
print(a | b)   # 7,二进制 111
print(a ^ b)   # 5,二进制 101
print(a << 1)  # 12,相当于左移一位
print(a >> 1)  # 3,相当于右移一位

位运算通常要求操作数是整数。<<和>>可以先理解为对二进制位进行移动:正整数左移一位通常相当于乘以2,右移一位通常相当于整除2。~涉及整数的补码表示,初学阶段只需记住它是按位取反,不必马上深入底层存储细节。

赋值运算符

赋值运算符应该是最为常见的运算符,它的作用是将右边的值赋给左边的变量。赋值运算符还可以跟上面的算术运算符放在一起,组合成复合赋值运算符,例如:a += b相当于a = a + b,a *= a + 2相当于a = a * (a + 2)。下面的例子演示了赋值运算符和复合赋值运算符的使用。

"""
赋值运算符和复合赋值运算符
"""
a = 10
b = 3
a += b        # 相当于:a = a + b
a *= a + 2    # 相当于:a = a * (a + 2)
print(a)      # 大家算一下这里会输出什么

例子:使用第三个变量交换两个变量的值

在编程中,我们经常会遇到需要交换两个变量值的情况。例如,变量a中保存10,变量b中保存20,要求交换它们的值。交换时不能直接写成a = b、b = a,因为执行第一条语句后,变量a原来的值已经丢失了,第二条语句只能把同一个值再次赋给b。

这时可以增加一个临时变量temp,先把a原来的值保存起来,再依次完成赋值:

"""
使用第三个变量交换两个变量的值
"""
a = 10
b = 20
print(f'交换前:a = {a}, b = {b}')

temp = a  # 先保存a原来的值
a = b     # 把b的值赋给a
b = temp  # 把保存的a原来的值赋给b

print(f'交换后:a = {a}, b = {b}')

运行结果如下:

交换前:a = 10, b = 20
交换后:a = 20, b = 10

上面的temp就是临时变量,它的作用是暂时保存数据,避免原来的值在交换过程中丢失。变量交换的关键是先保存、再覆盖、最后恢复,三条赋值语句的执行顺序不能随意改变。

赋值运算构成的表达式本身不产生任何值,也就是说,如果你把一个赋值表达式放到print函数中试图输出表达式的值,将会产生语法错误。为了解决这个问题,Python 3.8 中引入了一个新的赋值运算符:=,我们称之为海象运算符,大家可以猜一猜它为什么叫这个名字。海象运算符也是将运算符右侧的值赋值给左边的变量,与赋值运算符不同的是,运算符右侧的值也是整个表达式的值,看看下面的代码大家就明白了。

"""
海象运算符
"""
# SyntaxError: invalid syntax
# print((a = 10))
# 海象运算符
print((a := 10))  # 10
print(a)          # 10

提示:上面第 8 行代码如果不注释掉,运行代码会看到SyntaxError: invalid syntax错误信息,注意,这行代码中我们给a = 10加上了圆括号,如果不小心写成了print(a = 10),会看到TypeError: 'a' is an invalid keyword argument for print()错误信息,后面讲到函数的时候,大家就会明白这个错误提示是什么意思了。

比较运算符和逻辑运算符

比较运算符也称为关系运算符,包括==、!=、<、>、<=、>=,我相信大家一看就能懂。需要提醒的是比较相等用的是==,请注意这里是两个等号,因为=是赋值运算符,我们在上面刚刚讲到过。比较不相等用的是!=,跟数学课本中使用的$\small{\neq}$并不相同,Python 2 中曾经使用过<>来表示不等于,在 Python 3 中使用<>会引发SyntaxError(语法错误)。比较运算符会产生布尔值,要么是True,要么是False。

逻辑运算符有三个,分别是and、or和not。and字面意思是“而且”,所以and运算符会连接两个布尔值或者产生布尔值的表达式,如果两边的布尔值都是True,那么运算的结果就是True;左右两边的布尔值有一个是False,最终的运算结果就是False。当然,如果and运算符左边的布尔值是False,不管右边的布尔值是什么,最终的结果都是False,这时运算符右边的布尔值会被跳过(专业的说法叫短路处理,如果and右边是一个表达式,那么这个表达式不会执行)。or字面意思是“或者”,所以or运算符也会连接两个布尔值或产生布尔值的表达式,如果两边的布尔值有任意一个是True,那么最终的结果就是True。当然,or运算符也是有短路功能的,当它左边的布尔值为True的情况下,右边的布尔值会被短路(如果or右边是一个表达式,那么这个表达式不会执行)。not运算符的后面可以跟一个布尔值,如果not后面的布尔值或表达式是True,那么运算的结果就是False;如果not后面的布尔值或表达式是False,那么运算的结果就是True。

"""
比较运算符和逻辑运算符的使用
"""
flag0 = 1 == 1
flag1 = 3 > 2
flag2 = 2 < 1
flag3 = flag1 and flag2
flag4 = flag1 or flag2
flag5 = not flag0
print('flag0 =', flag0)     # flag0 = True
print('flag1 =', flag1)     # flag1 = True
print('flag2 =', flag2)     # flag2 = False
print('flag3 =', flag3)     # flag3 = False
print('flag4 =', flag4)     # flag4 = True
print('flag5 =', flag5)     # flag5 = False
print(flag1 and not flag2)  # True
print(1 > 2 or 2 == 3)      # False

说明:比较运算符的优先级高于赋值运算符,所以上面的flag0 = 1 == 1先做1 == 1产生布尔值True,再将这个值赋值给变量flag0。print函数可以输出多个值,多个值之间可以用,进行分隔,输出的内容默认以空格分开。

成员运算符

in和not in是成员运算符,用来判断一个元素或字符串是否包含在目标对象中。对于字符串,in判断的是子字符串;对于字典,in默认判断的是键是否存在。列表、元组等数据结构的详细操作放到后面的章节中讲解,这里只了解成员判断的基本写法。

print('Py' in 'Python')             # True
print(3 in [1, 2, 3])               # True
print('name' in {'name': '小明'})    # True
print('age' not in {'name': '小明'}) # True

对象身份、`id()`与常量池

==比较两个对象的值是否相等,is比较两个变量是否指向同一个对象。通常使用is None判断一个变量是否为None,不要使用is代替普通的值比较。

a = [1, 2]
b = a
c = [1, 2]

print(a == c)  # True,列表中的值相同
print(a is b)  # True,a和b指向同一个列表对象
print(a is c)  # False,c是另一个列表对象
print(id(a) == id(b))  # True

id()返回对象在当前生命周期内唯一且保持不变的身份编号。对于 CPython 实现,官方文档说明这个编号就是对象在内存中的地址;但从 Python 语言本身来看,程序应把它当作对象身份编号使用,不要依赖具体地址数值,也不要用它判断两个值是否相等。

在讨论对象身份时,经常会听到“常量池”这个说法。更准确地说,当前 CPython 会把函数编译成代码对象,代码对象的co_consts属性保存该段字节码使用到的字面量常量,例如数字、字符串和None。编译器还可能提前计算简单的常量表达式,因此下面代码中的1 + 2可能在运行前就被处理成常量3。

def show_constants():
    number = 1 + 2
    text = 'hello'
    return number, text

print(show_constants.__code__.co_consts)

不同版本、不同实现和不同编译场景可能会得到不同的常量排列;小整数或字符串是否复用对象,也属于实现细节。不要根据某次运行中a is b为True,就推断所有相同字面量都会共用同一个对象。需要比较值时使用==,需要判断对象身份时使用is。

运算符和表达式应用

例子1:华氏温度转摄氏温度

要求:输入华氏温度将其转换为摄氏温度,华氏温度到摄氏温度的转换公式为: $\small{C = (F - 32) / 1.8}$ 。

"""
将华氏温度转换为摄氏温度
"""
f = float(input('请输入华氏温度: '))
c = (f - 32) / 1.8
print('%.1f华氏度 = %.1f摄氏度' % (f, c))

说明:上面代码中的input函数用于从键盘接收用户输入,由于输入的都是字符串,如果想处理成浮点小数来做后续的运算,可以用我们上一课讲解的类型转换的方法,用float函数将str类型处理成float类型。

上面的代码中,我们对print函数输出的内容进行了格式化处理。百分号格式化的一般写法是:

'格式字符串' % (变量1, 变量2, ...)

格式字符串中的%s、%d和%f叫作占位符,运行时会按照从左到右的顺序,依次使用%右侧括号中的变量值进行替换。

  • %s:表示字符串,占位符对应的值会按照字符串形式输出。
  • %d:表示整数,通常用来输出int类型的值。
  • %f:表示浮点数,默认会显示小数点后6位。
  • %.1f:表示浮点数,并且只保留小数点后1位;其中.1表示保留1位小数,f表示浮点数。
  • %.2f:表示浮点数,并且只保留小数点后2位。

本例中的'%.1f华氏度 = %.1f摄氏度'包含两个%.1f占位符,% (f, c)中也正好有两个变量,因此第一个占位符使用f的值,第二个占位符使用c的值。如果占位符数量和后面的变量数量不一致,运行时可能会出现格式化错误。

例如,下面的代码使用不同类型的占位符输出姓名、年龄和成绩:

name = '小明'
age = 18
score = 95.5
print('姓名:%s,年龄:%d,成绩:%.1f' % (name, age, score))

运行结果如下:

姓名:小明,年龄:18,成绩:95.5

除了上面格式化输出的方式外,Python 中还可以用下面的办法来格式化输出,我们给出一个带占位符的字符串,字符串前面的f表示这个字符串是需要格式化处理的,其中的{f:.1f}和{c:.1f}可以先看成是{f}和{c},表示输出时会用变量f和变量c的值替换掉这两个占位符,后面的:.1f是格式说明,f表示按浮点数输出,.1表示保留小数点后1位。

"""
将华氏温度转换为摄氏温度
"""
f = float(input('请输入华氏温度: '))
c = (f - 32) / 1.8
print(f'{f:.1f}华氏度 = {c:.1f}摄氏度')

例子2:计算圆的周长和面积

要求:输入一个圆的半径($\small{r}$),计算出它的周长( $\small{2 \pi r}$ )和面积( $\small{\pi r^{2}}$ )。

"""
输入半径计算圆的周长和面积
"""
radius = float(input('请输入圆的半径: '))
perimeter = 2 * 3.1416 * radius
area = 3.1416 * radius * radius
print('周长: %.2f' % perimeter)
print('面积: %.2f' % area)

Python 中有一个名为math 的内置模块,该模块中定义了名为pi的变量,它的值就是圆周率。如果要使用 Python 内置的这个pi,我们可以对上面的代码稍作修改。

"""
输入半径计算圆的周长和面积
"""
import math

radius = float(input('请输入圆的半径: '))
perimeter = 2 * math.pi * radius
area = math.pi * radius ** 2
print(f'周长: {perimeter:.2f}')
print(f'面积: {area:.2f}')

说明:上面代码中的import math表示导入math模块,导入该模块以后,才能用math.pi得到圆周率的值。

这里其实还有一种格式化输出的方式,是 Python 3.8 中增加的新特性,大家直接看下面的代码就明白了。

"""
输入半径计算圆的周长和面积
"""
import math

radius = float(input('请输入圆的半径: '))  # 输入: 5.5
perimeter = 2 * math.pi * radius
area = math.pi * radius ** 2
print(f'{perimeter = :.2f}')  # 输出:perimeter = 34.56
print(f'{area = :.2f}')       # 输出:area = 95.03

说明:假如变量a的值是9.87,那么字符串f'{a = }'的值是a = 9.87;而字符串f'{a = :.1f}'的值是a = 9.9。这种格式化输出的方式会同时输出变量名和变量值。

例子3:判断闰年

要求:输入一个 1582 年以后的年份,判断该年份是不是闰年。

"""
输入年份,闰年输出True,平年输出False
"""
year = int(input('请输入年份: '))
is_leap = year % 4 == 0 and year % 100 != 0 or year % 400 == 0
print(f'{is_leap = }')

说明:对于格里历(Gregorian calendar),即今天我们使用的公历,判断闰年的规则是:1. 公元年份非 4 的倍数是平年;2. 公元年份为 4 的倍数但非 100 的倍数是闰年;3. 公元年份为 400 的倍数是闰年。格里历是由教皇格里高利十三世在 1582 年 10 月引入的,作为对儒略历(Julian calendar)的修改和替代,我们在输入年份时要注意这一点。上面的代码通过%来判断year是不是4的倍数、100的倍数、400的倍数,然后用and和or运算符将三个条件组装在一起,前两个条件要同时满足,第三个条件跟前两个条件的组合只需满足其中之一。

字符串的格式化输出

在前面的例子中,我们已经接触过格式化输出:例子1使用百分号占位符把变量的值嵌入了字符串,例子2还见到了f'{perimeter = :.2f}'这种同时输出变量名和变量值的写法。按照指定的格式把数据转换成字符串再输出,就是格式化输出。Python 中常用的格式化输出有三种方式,这一节我们把它们放在一起系统地梳理一遍。大家重点掌握第三种 f-string 的用法,前两种在阅读别人的代码时经常遇到,要能做到看得懂、会修改。

方式一:百分号格式化

百分号格式化借鉴自 C 语言的printf函数,是 Python 中最“古老”的一种格式化写法,它的一般写法在例子1中已经介绍过:

'格式字符串' % (值1, 值2, ...)

除了%s、%d、%.2f这些占位符,再补充三个常用的细节。其一,占位符中可以加上宽度,例如%10.2f表示输出的内容总共占 10 个字符的宽度,默认右侧对齐;在宽度数字前面加一个负号(如%-10s)则表示左侧对齐。其二,占位符和数据的类型要大致匹配,例如%d对应整数,如果把字符串交给%d处理,程序会直接报错。其三,想在输出中显示一个百分号,要写成%%,因为单独的%会被当成占位符的开头。

"""
百分号格式化的补充用法
"""
print('圆周率约为%10.2f' % 3.14159)  # 圆周率约为      3.14
print('进度:%d%%' % 85)             # 进度:85%
print('|%-10s|' % 'Python')          # |Python    |

方式二:format方法

字符串类型自带一个format方法,用{}作为占位符,它的一般写法是:

'格式字符串'.format(值1, 值2, ...)

{}中什么都不写,就按从左到右的顺序对应format方法中的值;也可以在{}中写编号(如{0}、{1},编号从0开始)来指定使用第几个值,同一个值还可以通过编号重复使用;如果需要控制输出格式,格式说明要写在{}中冒号的后面,例如{:.2f}。

"""
format方法的使用
"""
name = '小明'
age = 18
score = 95.5
print('姓名:{},年龄:{}'.format(name, age))
print('{0}的{1}成绩是{2}分'.format(name, 'Python', score))
print('圆周率约为{:.2f}'.format(3.14159))

运行结果如下:

姓名:小明,年龄:18
小明的Python成绩是95.5分
圆周率约为3.14

方式三:f-string

f-string 是 Python 3.6 中引入的格式化方式,也是目前最推荐的方式:在字符串前面加上f,把变量或者表达式直接写进{}。前面的例子中我们已经多次使用它,这里再补充三个重要用法。

其一,{}中可以写任何表达式,并不限于变量名:

"""
f-string的更多用法
"""
a = 10
b = 3
print(f'{a} + {b} = {a + b}')       # 10 + 3 = 13
print(f'{a} 比 {b} 大吗?{a > b}')   # 10 比 3 大吗?True

其二,{}中写“变量名 =”,可以同时输出变量名和变量值,例子2中已经用过,调试程序时非常好用:

x = 3.14159
print(f'{x = }')      # x = 3.14159
print(f'{x = :.2f}')  # x = 3.14

其三,如果{}中还需要用到引号,内外层要使用不同的引号:

print(f'|{"Python":^10}|')  # |  Python  |

说明:在 Python 3.12 之前,f-string 的{}中不允许使用跟外层相同的引号。为了让代码在更多环境中都能正常运行,建议大家养成内外层使用不同引号的习惯,例如外层单引号、内层双引号。

格式说明的通用写法

format方法和 f-string 使用的是同一套格式说明,都写在占位符中冒号的后面。先完整地拆解一下我们用了很多次的{price:.2f}:price是要输出的变量,冒号负责引出格式说明,.2表示保留小数点后两位,f表示按定点小数输出。也就是说,冒号后面的内容可以由多个部分拼装而成,按需组合,用不到的部分不写即可:

  • 对齐:<左对齐、>右对齐、^居中;
  • 宽度:一个整数,表示输出总共占多少个字符的宽度,不够时默认用空格补齐;也可以在宽度前面指定填充字符,例如{:*^10}表示居中、总宽度为10、用*填充;
  • 千位分隔符:,,给数字的整数部分加上千位分隔符;
  • 精度:.N,对浮点数表示保留小数点后N位;对字符串表示最多显示N个字符;
  • 类型:f定点小数、d整数、e科学计数法、%百分比、x十六进制。

下面的例子演示了常用的几种组合:

"""
格式说明的组合使用
"""
price = 12345.678
print(f'{price:.2f}')      # 12345.68,保留两位小数
print(f'{price:,.2f}')     # 12,345.68,千位分隔
print(f'{price:>12.2f}')   #     12345.68,右对齐、宽度12
print(f'{price:0>12.2f}')  # 000012345.68,用0填充
print(f'{0.856:.1%}')      # 85.6%,百分比
print(f'{255:x}')          # ff,十六进制
print(f'{"Python":*^12}')  # ***Python***,居中、用*填充

说明:精度.N也可以单独使用(例如{price:.2}),此时浮点数会按照通用格式保留N位有效数字,结果可能跟{:.2f}差别很大。初学阶段建议精度和类型搭配使用(如.2f),含义最明确。

三种方式怎么选

最后把三种方式放在一起对比一下,下面的三行代码输出的内容完全相同:

"""
三种格式化方式的对比
"""
name = '小明'
score = 95.5
print('我叫%s,考了%.1f分' % (name, score))
print('我叫{},考了{:.1f}分'.format(name, score))
print(f'我叫{name},考了{score:.1f}分')
  • 百分号格式化:历史最悠久,新代码中已经很少使用,但要能看得懂;
  • format方法:功能全面,是 f-string 出现之前的主流写法,很多教程和资料中还能见到;
  • f-string:写法最简洁、可读性最好,新写的代码强烈推荐使用 f-string。

说明:格式化输出只影响“显示的样子”,不会改变变量本身的值。f'{price:.2f}'的结果是一个新的字符串,变量price中保存的仍然是原来的12345.678。

知识点总结

一、表达式与运算符优先级

  • 表达式由常量、变量、函数和运算符组合而成,Python 会计算表达式并得到结果。
  • 常见优先级从高到低包括:索引与切片、幂运算、一元运算、乘除模整除、加减、位运算、比较运算、身份运算、成员运算、逻辑运算和赋值运算。
  • 不确定执行顺序时使用圆括号明确分组,代码更安全,也更容易阅读。

二、算术运算符

  • +、-、*、/分别表示加、减、乘、除;/的结果通常是浮点数。
  • //表示整除,%表示求余,**表示幂运算;要注意负数参与整除和求余时的结果。
  • 算术表达式遵循先乘除后加减的规则,圆括号可以改变默认顺序。

三、赋值与复合赋值

  • =把右侧的值赋给左侧变量,不能把赋值运算当作普通表达式直接放进print中。
  • +=、-=、*=、/=、%=、//=、**=等复合赋值运算符可以简化变量更新。
  • :=是海象运算符,既完成赋值,又把右侧的值作为表达式结果;初学阶段应在确实能提高可读性时使用。

四、比较、逻辑、身份与成员运算

  • 比较运算符包括==、!=、<、>、<=和>=,结果一定是True或False;=是赋值,不能混用。
  • and表示同时满足,or表示至少满足一个,not表示取反;多个逻辑条件要留意优先级。
  • is和is not用于判断对象身份,通常用is None判断是否为None,不要用is替代普通值比较。
  • in和not in用于判断元素是否属于字符串、列表、元组、集合或字典等容器。
  • ==比较值,is比较对象身份;id()可以查看对象在当前生命周期内的身份编号,通常使用is None判断空值。
  • in和not in在字符串、序列、集合和字典上都有不同的使用场景;对字典使用in时默认判断键。

五、位运算

  • &、|、^、~、<<、>>用于整数的二进制位运算;左移和右移可以先按二进制位移动来理解。

六、对象身份与 CPython 常量池

  • id()返回对象身份编号;CPython中通常对应对象的内存地址,但代码不应依赖这个实现细节。
  • CPython代码对象通过co_consts保存字面量常量;编译器可能对简单常量表达式进行预计算。
  • “常量池”不是可以依赖的 Python 语言规则,小整数和字符串的对象复用也不是通用保证;比较值使用==,比较身份使用is。

七、格式化输出与公式应用

  • input得到字符串,参与数值计算前需要用int或float转换。
  • Python 有三种常用的格式化输出:百分号占位符(%s、%d、%.2f,还要会用%%输出百分号)、字符串的format方法({}占位符,支持{0}编号重复取值)和 f-string(f'{变量:格式}',最推荐)。
  • format方法和 f-string 使用同一套格式说明,写在冒号后面、按需组合:对齐(<、>、^)、宽度、填充字符、千位分隔(,)、精度(.N)、类型(f、d、e、%、x)。
  • f-string 的{}中可以写任意表达式;写“变量名 =”可以同时输出变量名和值,适合调试;{}中需要引号时内外层使用不同的引号。
  • 格式化只改变显示效果,不改变变量本身的值;占位符数量与格式说明都要和数据匹配。
  • 华氏温度转摄氏温度使用C = (F - 32) / 1.8;圆的周长和面积可使用math.pi以及2 * math.pi * r、math.pi * r ** 2计算。
  • 闰年判断需要组合求余和逻辑运算:能被4整除且不能被100整除,或者能被400整除。

八、命名规则与易错点

  • 变量名应使用有意义的英文单词或下划线组合,不能以数字开头,也不能使用Python关键字。
  • 运算符、括号、冒号和引号建议使用英文输入法输入。
  • 复杂表达式要通过拆分变量、增加括号和格式化输出提高可读性;运行结果要重点检查除法、整除、求余和运算优先级。