IF语句及代码风格
Chap 4 条件
IF 语句
IF语句的流程
eg:
def f(x) :
print("A",end="")
if x == 0 :
print("B",end="")
print("C",end="")
#x不等于0时,这两行代码不会执行
print("D")
f(1)
AD
f(0)
ABCD
实现一个函数,返回输入数字的绝对值
python内置了一个函数交abs()用于绝对值计算,所以我们将我们的函数命名为abs1、abs2
def abs1(n) :
if n < 0 ;
n = -n
return n
如果只有一条语句我们也可以把这些内容写在一行里:
def abs2 :
if n < 0 : n = -n
return n
不建议!!!
多个返回语句
def abs3(n) :
if n < 0 :
return -n
return n #如果n>0,直接执行此代码
使用布尔表达式
def abs4(n) :
return (n < 0)*(-n) + (n>=0)8(n)
实现机制 :False == 0; True == 1
不建议!!!
if-else 语句
x = input("x=")
x = float(x)
print("hello")
if x < 10 :
print("wahool!")
else :
print("ruh roh")
print("goodbye")
x = 9
hello
wahoo!
goodbye
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:
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 = 4x**2 + 5x + 1 has 2 root(s).
y = 4x**2 + 4x + 1 has 1 root(s).
y = 4x**2 + 3x + 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))
if-else 推导式 if-else expression
推导式本质是python语法糖。语法糖就是让代码更具有简洁性、可读性、易用性。
def abs7(n):
return n if (n >= 0) else -n
'''
等价于:
def abs7(n):
if n >=0:
return n
else:
return -n
'''
print("abs7(5) =", abs7(5), "and abs7(-5) =", abs7(-5))
abs7(5) = 5 and abs7(-5) = 5
如果推导式很简洁可以使用。千万不要使用非常复杂的推导式,不然三个月后只有上帝才能看懂啦!
match-case 语句
match 后的对象会依次与 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
清晰的代码风格
谨慎使用否定条件 not
# 可能不清晰的:
b = True
if not b:
print('no')
else:
print('yes')
Yes
# 清晰的:
b = True
if b:
print('yes')
else:
print('no')
Yes
宁愿不要else,也不要if 空白
# 不清晰的:
b = False
if b:
pass
else:
print('no')
no
# 清晰的:
b = False
if not b:
print('no')
# 这时使用not比较好
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')
yes
善用 elif
# 又混乱又有产生 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
# 更好的做法:
x = 10
if x < 5:
print('small')
elif x < 10:
print('medium')
elif x < 15:
print('large')
else:
print('extra large')
large
在Python语法中,下面两段代码是等价的。
但由于下面一段有很多缩进,管理起来很麻烦,所以我们通常选择上面这样的写法,避免缩进带来的麻烦。
if a:
pass
elif b:
pass
else:
pass
if a:
pass
else:
if b:
pass
else:
pass
不要使用一些离谱的trick(如用算数逻辑来代替布尔逻辑)
# 不清晰的:
x = 42
y = ((x > 0) and 99)
# 这里99会被当成布尔值进行运算
# python中任何大于0的数都是True
# 清晰的:
x = 42
if x > 0:
y = 99
上面的trick是啥玩意儿?(Python的一个特性)
x = 42
x > 0 and 99
# x > 0在pyhton中实际上是1
# 当加上and 99时,会输出99
99
x = 42
x > 0 or 99
# 如果是or 99,会输出布尔值True
True
x = 42
x < 0 or 99
# 如果改成x < 0, 又会输出99
99
总结
- Conditionals Make Decisions.
- if-else 结构构成了 Python 分支控制,if 还能嵌套使用。
- 合理的编写风格会让代码更易读,还能尽可能避免引入 bug。
优雅代码的编写
代码风格
- "修饰"的前提一定是"跑通"代码,也就是说你得先确保你的code没有任何的bug
- 这种"修饰"并不是对每一个人都强制学习内容,他并不影响你快乐学习接下来的所有课程
缩进
- 如果有开始定界符,其余行的缩进需与开始定界符对齐
- 需要额外的4个空格(长度等于一个Tab键),以区分开传入参数,和其他内容
- 空格一般用于添加以上这种缩进,Tab键一般用于保持行与行之间的一致性
- 多行if语句衔接,需要一个额外的缩进,以区分其他内容
换行
- 将所有限制为最多79个字符
- 一般语句接受”隐式“延续,但是with语句等不支持,需要用反斜杠\来衔接
- 另一个这样的例子是assert语句
- 多行if语句的缩进详见上节
- 通常不鼓励使用复合语句(同一行上的多个语句)
导入规范
- import 本地模块\包
- 当我们需要导入本地自己封装好的一些模块时,需要通过import来导入
- 如果我们需要在m1.py文件中导入同目录下的m2.py文件,直接导入即可
关于空格
- 紧接在圆括号、方括号或大括号内,不需要多余空格
- 在逗号、分号或冒号之前,尾随逗号之后均不需要多余空格
- 在切片中,两个冒号必须应用相同的间距
- 紧接在开始函数调用的参数列表的左括号之前,不需要多余空格
- 赋值(或其他)运算符周围需要多个空格以使其与另一个运算符对齐
代码注释(单行注释、多行注释)
- 注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码
- 注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性
- 在有处理逻辑的代码中,源程序有效注释必须在20%以上
命名规则
- 变量名只能包含字母、数字和下划线。变量名可以字母或下划线大头,但不能以数字打头,例如:可将变量命名为message_1,但不能将其命名为1_message
- 变量名不能包含空格,但可使用下划线来分隔其中的单词。例如:变量名greeting_message可行,但变量名greetingmessage会引发错误
命名规范
- 不要将python关键字和函数名用作变量名,即不要使用python保留用于特殊用途的单词,如print。
- 变量名与函数名应既简短又具有描述性。例如:name比n好
代码规范的网站:PEP8