尽管我们已经学习了 Python 的许多特性,但到目前为止我们展示的 Python 代码都是单行语句,这掩盖了 Python 和 C 在代码风格上的重大差异:首先,Python 中不用 {}
而是用缩进表示块结构,如果缩进没有对齐会直接报错,如果 tab 和 空格混用也会报错;其次,块结构开始的地方比如 if
和 for
语句的行末要有冒号 :
。这有助于代码的可读性,但你也可能怀念 C 那种自由的体验,毕竟如果复制粘贴时因为丢失缩进而不得不手动对齐是很恼人的。
循环结构
列表推导式能在一行内高效地完成批量操作,但有时为了压行我们已经显得过分刻意,许多场景下还是只能使用循环结构,所以我们再以读入多行数据为例展示 Python 中的循环是如何编写的:
# 请注意从现在开始我们不再使用 REPL,请自行复制多行数据
u, v, w = ([] for i in range(3)) # 多变量赋值
for i in range(4): # 这里假设输入 4 行数据
_u, _v, _w = [int(x) for x in input().split()]
u.append(_u), v.append(_v), w.append(_w)
# 不可进行类似 cin >> u[i] >> v[i] >> w[i] 的操作,因为必定超出列表当前的长度
# 当然你可以选择初始化长度为 MAXN 的全 0 列表,不过需要记住真实长度并删掉多余元素
print(u, v, w)
需要注意,Python 中的 for 循环和 C/C++ 有较大的差别 ,实质是迭代序列中的元素,比如编写循环遍历数组下标需要迭代 range(len(lst))
,而非真正定义起始和终止条件,所以使用起来并没有 C/C++ 灵活。
下面再用 while 循环展示行数不定的情况下如何输入:
u, v, w = [], [], [] # 多变量赋值,其实同上
s = input() # 注意 Python 中赋值语句不能放在条件表达式中
while s: # 不能像 C 那样 while(!scanf())
# 用切片拼接避免了 append(),注意列表推导式中又嵌套了列表
u[len(u):], v[len(v):], w[len(w):] = [[int(x)] for x in s.split()]
s = input()
# Python 3.8 引入了 walrus operator 海象运算符后,你可以节省两行,但考场环境很可能不支持
while s := input():
u[len(u):], v[len(v):], w[len(w):] = [[int(x)] for x in s.split()]
print(u, v, w)
选择结构
和 C/C++ 大同小异,一些形式上的差别都在下面的示例中有所展示,此外还需注意条件表达式中不允许使用赋值运算符(Python 3.8 以上可用 :=),以及 没有 swicth 语句。
# 条件表达式两侧无括号
if 4 >= 3 > 2 and 3 != 5 == 5 != 7:
print("关系运算符可以连续使用")
x = None or [] or -2
print("&& || !", "与 或 非", "and or not", sep='\n')
print("善用 and/or 可节省行数")
if not x:
print("负数也是 True,不执行本句")
elif x & 1:
print("用 elif 而不是 else if\n"
"位运算符与 C 相近,偶数&1 得 0,不执行本句")
else:
print("也有三目运算符") if x else print("注意结构")