task04
if 语句 if statement
Conditionals Make Decisions
if 语句流程
判断成立不成立
一个例子:
def f(x):
print("A", end="")
if x == 0:
print("B", end="")
print("C", end="")
print("D")
f(1)
# 不是0,跳过了if语句块
AD
一个更有意思的例子:
任务:实现一个函数,返回输入数字的绝对值
Python 内置了一个函数叫
abs()
用于绝对值计算,所以我们将函数命名成abs1
、abs2
……
def abs1(n):
if n < 0:
n = -n
return n
写在一行
def abs2(n):
if n < 0: n = -n
return n
除非有特殊原因,否则强烈建议不要这样写
多个返回语句
def abs3(n):
if n < 0:
return -n
return n
使用布尔表达式
def abs4(n):
return (n < 0)*(-n) + (n>=0)*(n) # 这家伙长得太奇怪了
# 因为判断结果为False时在python里面等价位0,True等价于1
不要这样写!↑
if-else 语句 if-else statement
x = input("x=")
x = float(x) # 强制类型转换
print("hello")
if x < 10:
print("wahoo!")
print("goodbye")
x=9
hello
wahoo!
goodbye
原理:
嵌套if-else
def f(x):
print("A", end="")
if x == 0:
print("B", end="")
print("C", end="")
else:
print("D", end="")
if x == 1:
print("E", end="")
else:
print("F", end="")
print("G")
重新设计 abs()
def abs5(n):
if n >= 0:
return n
else:
return -n
def abs6(n): # 改变符号形式
if n >= 0:
sign = +1
else:
sign = -1
return sign * n
print("abs5(5) =", abs5(5), "and abs5(-5) =", abs5(-5))
print("abs6(5) =", abs6(5), "and abs6(-5) =", abs6(-5))
abs5(5) = 5 and abs5(-5) = 5
abs6(5) = 5 and abs6(-5) = 5
if-elif-else 语句
原理:
例:
def f(x):
print("A", end="")
if x == 0: # 多个条件判断也可以用and和or
print("B", end="")
print("C", end="")
elif x == 1:
print("D", end="")
else:
print("E", end="")
if x == 2:
print("F", end="")
else:
print("G", end="")
print("H")
其实可以写很多个elif(但只有一个if对应一个else)
另一个更有意思的例子:
任务:实现一个函数,输入一元二次函数的各项系数,返回其解的个数。
提示:一元二次方程 ax²+bx+c=0 (a≠0) 的根与根的判别式 有如下关系:
Δ=b²−4ac
- 当 Δ>0 时,方程有两个不相等的实数根;
- 当 Δ=0 时,方程有两个相等的实数根;
- 当 Δ<0 时,方程无实数根。
def numberOfRoots(a, b, c):
# 返回 y 的实数根(零点)数量: y = a*x**2 + b*x + c
d = b**2 - 4*a*c
if d > 0:
return 2
elif d == 0:
return 1
else:
return 0
print("y = 4*x**2 + 5*x + 1 has", numberOfRoots(4,5,1), "root(s).")
print("y = 4*x**2 + 4*x + 1 has", numberOfRoots(4,4,1), "root(s).")
print("y = 4*x**2 + 3*x + 1 has", numberOfRoots(4,3,1), "root(s).")
y = 4*x**2 + 5*x + 1 has 2 root(s).
y = 4*x**2 + 4*x + 1 has 1 root(s).
y = 4*x**2 + 3*x + 1 has 0 root(s).
再来一个例子:
实现传说中的“学生分数登记管理系统”
def getGrade(score):
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else:
grade = "F"
return grade
print("103 -->", getGrade(103))
print(" 88 -->", getGrade(88))
print(" 70 -->", getGrade(70))
print(" 61 -->", getGrade(61))
print(" 22 -->", getGrade(22))
103 --> A
88 --> B
70 --> C
61 --> D
22 --> F
if-else 推导式 if-else expression
def abs7(n): # 括号去了也行↓
return n if (n >= 0) else -n # 推导式
# 先判断括号内的条件语句,再判断是否执行else后的语句,真:返回if前,假,返回else后语句
print("abs7(5) =", abs7(5), "and abs7(-5) =", abs7(-5))
abs7(5) = 5 and abs7(-5) = 5
上面代码本质上等价于:
def abs7(n): if n >= 0: return n else: return -n
之前作业中矩阵乘法一部分:
Matrix2 = [list(map(int, input().split(" "))) for _ in range(p)]
就类似于列表推导式
match-case 语句
3.10版本以后引入
增加了 match...case 的条件判断,不需要再使用一连串的 if-else 来判断了。
match 后的对象会依次与 case 后的内容进行匹配,如果匹配成功,则执行匹配到的表达式,否则直接跳过,_
可以匹配一切。
格式:
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _: # 可以不写
<action_wildcard>
case _:
类似于 C 和 Java 中的 default:
,当其他 case 都无法匹配时,匹配这条,保证永远会匹配成功。
例子:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
mystatus=400
print(http_error(400))
Bad request
一个 case 也可以设置多个匹配条件,条件使用 | 隔开,例如:
...
case 401|403|404:
return "Not allowed"
这里如果
return
改为case 400
条件语句判断后会继续往下执行(如果case _
语句下面还有内容的话),直到退出
清晰的代码风格 Clarity and style
请注意: 此部分讨论的内容主要针对样式而非正确性,这里的所有例子都“正确的”,但有些例子比其他例子更巧妙,我们希望大家形成一个好的代码习惯。
增强代码的可读性(毕竟代码也要给别的程序员看)
否定条件(带有 else
部分)
# 可能不清晰的:
b = True
if not b:
print('no')
else:
print('yes')
yes
修改后(代码更清晰,一目了然):
# 清晰的:
b = True
if b:
print('yes')
else:
print('no')
yes
不要用空白的 if
部分
if
后面尽量跟条件判断为True的部分
# 不清晰的:
b = False
if b:
pass
else:
print('no')
no
# 清晰的:
b = False
if not b:
print('no')
no
采用 and
而不是采用嵌套的 if
来判断
增强可读性和减少条件判断次数
# 混乱的:
b1 = True
b2 = True
if b1:
if b2:
print('both!')
both!
# 清晰的:
b1 = True
b2 = True
if b1 and b2:
print('both!')
both!
使用 else
而不是if
来控制
# (命题不成立的时候)可能会引入 bug:
b = True
if b:
print('yes')
if not b:
print('no')
yes
# 更好的做法:
b = True
if b:
print('yes')
else:
print('no')
另外一个例子
# 又混乱又有产生 bug 的风险:
x = 10
if x < 5:
print('small')
if (x >= 5) and (x < 10):
print('medium')
if (x >= 10) and (x < 15):
print('large')
if x >= 15:
print('extra large')
large
# 更好的做法: (善用else)
x = 10
if x < 5:
print('small')
elif x < 10:
print('medium')
elif x < 15:
print('large')
else:
print('extra large')
large
再来一个例子
# 又混乱又有产生 bug 的风险:
c = 'a'
if (c >= 'A') and (c <= 'Z'):
print('Uppercase!')
if (c >= 'a') and (c <= 'z'):
print('lowercase!')
if (c < 'A') or ((c > 'Z') and (c < 'a')) or (c > 'z'):
print ('not a letter!')
lowercase!
# 更好的做法:
c = 'a'
if (c >= 'A') and (c <= 'Z'):
print('Uppercase!')
elif (c >= 'a') and (c <= 'z'):
print('lowercase!')
else:
print('not a letter!')
不必要使用一些 trick(如用算数逻辑来代替布尔逻辑[非常不推荐])
# 不清晰的:
x = 42
y = ((x > 0) and 99)
# 清晰的:
x = 42
if x > 0:
y = 99
task04总结
- Conditionals Make Decisions.
- if-else 结构构成了 Python 分支控制,if 还能嵌套使用。
- 合理的编写风格会让代码更易读,还能尽可能避免引入 bug(主要还是增强可读性)
拓展01
1.代码风格介绍
右边代码明显更优雅一点,可读性较强,注释主要是给别的程序员看懂这行代码的用处
2.缩进与换行
定界符就是
()
,[]
这种如果到下一行得和参数进行对齐
例:
不优雅的代码:
优化过的代码:
参数要与定界符平齐,参数得与函数内语句有缩进区分(一般为一个Tab
键)
代码布局-换行
最好还是加上反斜杠
\
来衔接代码例:
尽量去省略每个语句之间的分号;
运算符尽量放参数前面(便于修改和读取)
如上方第二个图
3.导入规范
导入下一级目录的模块文件需声明目录名(用import)
4.关于空格
加入空格建议规范:
5.代码注释
6.命名规则
得遵守,下面的规范尽量执行
不遵守即会报错