【python小技巧3】else的用法
小倪同学0v0
编辑于 2023年01月03日 20:24
收录于文集
共6篇

说到 else,新手可能会说不就是 if - else 结构吗?你能想到几个用法呢?

目录

  1. if - else 结构

  2. ... if ... else ... 结构(条件表达式、三目运算符、三元运算符)

  3. for / while - else  结构

  4. try - except - else  结构

cut-off

一、if - else 结构

这个没啥好说的,入门难度。

硬要说啥的话,就是 else 后面的冒号别漏了。

常见的分支结构有:

  • 单分支:if

  • 双分支:if - else

  • 多分支(无else):if - elif - ...

  • 多分支(有else):if - elif - ... - else

cut-off

二、... if ... else ... 结构(条件表达式、三元/目运算符)

类似于C语言中的 cond ? a : b

如果仅仅是根据条件确定值的话,使用

代码块
Python
自动换行
复制代码
if cond:
  m = a
else:
  m = b
复制成功

不如

代码块
Python
自动换行
复制代码
m = a if cond else b
复制成功

来的简洁,而且可读性更高,虽然它俩是完全等价的。

注意:条件表达式的运算符优先级较低,仅次于 lambda 匿名函数表达式,所以如果作为表达式的一部分出现时,应考虑要不要加括号 e.g.

代码块
Python
自动换行
复制代码
# 若 cond 为 True

a = 3 if cond else 5 + 1  # 先计算加法
# 此时 a 的值是 3,而不是 4

a = (3 if cond else 5) + 1  # 先计算条件表达式
# 此时 a 的值是 4
复制成功
cut-off

三、for / while - else 结构

It is executed when the loop terminates through exhaustion of the iterable (with for) or when the condition becomes false (with while), but not when the loop is terminated by a break statement. ——4. More Control Flow Tools — Python 3.8.14 documentation

说人话就是循环自然结束时会执行 else 里的代码,被 break 终止循环时不会执行

代码块
Python
自动换行
复制代码
for item in a_iterable:
  ...
else:
  ...


while cond:
  ...
else:
  ...
复制成功

以后会专门讲 for 循环(挖坑*1)

cut-off

四、try - except - else 结构

最完整的处理异常结构是

代码块
Python
自动换行
复制代码
try:
  ...
except 某些异常 as e:
  ...
...
else:
  ...
finally:
  ...
复制成功

else 会在 try 语句块内没有遇到异常时执行

现在常见的一些组合包括:

  1. try - except - ...

  2. try - except - ... - finally

  3. try - finally

  4. try - except - ... - else

  5. try - except - ... - else - finally

也就是说:else 和 finally 是可选的,try 和 except 是必须的,在有 finally 的时候 except 是可选的,但它们出现的顺序必须是 try - except - else - finally

执行顺序:

  1. 先执行 try 内的代码

  2. 如果遇到了异常,从上往下依次找符合哪个异常,考虑继承关系(比如 TypeError 继承自 Exception),只会执行一个 except 的代码

  3. 如果没遇到异常,则执行 else 代码块

  4. 无论如何,都会执行 finally 代码块,哪怕前面含有 return, break, continue 等

顺带提一句,永远不要写:

代码块
Python
自动换行
复制代码
try:
  ...
except:
  ...
复制成功

这种代码,最起码写个

代码块
Python
自动换行
复制代码
try:
  ...
except Exception:
  ...
复制成功

至于为什么,以后有机会谈(挖坑*2)

cut-off

总结:

  1. 分支语句中的 else 用于处理其余的情况

  2. 循环结构中的 else 会在循环没被 break 的时候执行

  3. try 语句中的 else 会在没遇到异常时执行

END

cut-off

参考资料:

https://docs.python.org/3.8/tutorial/controlflow.html

https://docs.python.org/3.8/reference/compound_stmts.html

以上内容如有错误,欢迎指出!