def f(x):
print("A", end="")
if x == 0:
print("B", end="")
print("C", end="")
print("D")
f(1)
AD
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) # 这家伙长得太奇怪了
不要这样写!
验证结果正确性
print("abs1(5) =", abs1(5), "and abs1(-5) =", abs1(-5))
print("abs2(5) =", abs2(5), "and abs2(-5) =", abs2(-5))
print("abs3(5) =", abs3(5), "and abs3(-5) =", abs3(-5))
print("abs4(5) =", abs4(5), "and abs4(-5) =", abs4(-5))
abs1(5) = 5 and abs1(-5) = 5 abs2(5) = 5 and abs2(-5) = 5 abs3(5) = 5 and abs3(-5) = 5 abs4(5) = 5 and abs4(-5) = 5
x = input("x=")
x = float(x)
print("hello")
if x < 10:
print("wahoo!")
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")
from IPython.display import IFrame
IFrame('https://pythontutor.com/visualize.html#code=def%20f%28x%29%3A%0A%20%20%20%20print%28%22A%22,%20end%3D%22%22%29%0A%20%20%20%20if%20x%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20print%28%22B%22,%20end%3D%22%22%29%0A%20%20%20%20%20%20%20%20print%28%22C%22,%20end%3D%22%22%29%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20print%28%22D%22,%20end%3D%22%22%29%0A%20%20%20%20%20%20%20%20if%20x%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28%22E%22,%20end%3D%22%22%29%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28%22F%22,%20end%3D%22%22%29%0A%20%20%20%20print%28%22G%22%29%0A%0Af%280%29%0Af%281%29%0Af%282%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false', width=1300, height=800)
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
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")
from IPython.display import IFrame
IFrame('https://pythontutor.com/visualize.html#code=def%20f%28x%29%3A%0A%20%20%20%20print%28%22A%22,%20end%3D%22%22%29%0A%20%20%20%20if%20x%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20print%28%22B%22,%20end%3D%22%22%29%0A%20%20%20%20%20%20%20%20print%28%22C%22,%20end%3D%22%22%29%0A%20%20%20%20elif%20x%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20print%28%22D%22,%20end%3D%22%22%29%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20print%28%22E%22,%20end%3D%22%22%29%0A%20%20%20%20%20%20%20%20if%20x%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28%22F%22,%20end%3D%22%22%29%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print%28%22G%22,%20end%3D%22%22%29%0A%20%20%20%20print%28%22H%22%29%0A%0Af%280%29%0Af%281%29%0Af%282%29%0Af%283%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false', width=1300, height=800)
任务:实现一个函数,输入一元二次函数的各项系数,返回其解的个数。
提示:一元二次方程 $ax^2+bx+c=0\ (a \neq 0)$ 的根与根的判别式 有如下关系:
$$\Delta = b^2 - 4 ac$$
- 当 $\Delta > 0$ 时,方程有两个不相等的实数根;
- 当 $\Delta = 0$ 时,方程有两个相等的实数根;
- 当 $\Delta < 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
def abs7(n):
return n if (n >= 0) else -n
print("abs7(5) =", abs7(5), "and abs7(-5) =", abs7(-5))
abs7(5) = 5 and abs7(-5) = 5
背景:小 $\epsilon$ 是一名大四学生,他的学校毕业要求是通过大学英语六级考试,你能写个程序看看他能不能毕业嘛?
输入格式:1-2 个整数,以空格分隔,第一个数字代表 CET 4 成绩,第二个数字代表 CET 6 成绩,如果四级未通过则没有六级成绩。
输出格式:1 个字符串,Yes
代表能够毕业,No
代表不能毕业。
输入示例:
500 430
输出示例:
Yes
请注意: 本节讨论的内容主要针对样式而非正确性,这里的所有例子都“正确的”,但有些例子比其他例子更巧妙,我们希望大家形成一个好的代码习惯。
否定条件(带有 else
部分)
# 可能不清晰的:
b = True
if not b:
print('no')
else:
print('yes')
yes
# 清晰的:
b = True
if b:
print('yes')
else:
print('no')
yes
空白的 if
部分
# 不清晰的:
b = False
if b:
pass
else:
print('no')
no
# 清晰的:
b = False
if not b:
print('no')
no
用嵌套的 if
而不是 and
来判断
# 混乱的:
b1 = True
b2 = True
if b1:
if b2:
print('both!')
both!
# 清晰的:
b1 = True
b2 = True
if b1 and b2:
print('both!')
both!
使用 if
而不是 else
来控制
# 可能会引入 bug:
b = True
if b:
print('yes')
if not b:
print('no')
yes
# 更好的做法:
b = True
if b:
print('yes')
else:
print('no')
yes
另外一个例子
# 又混乱又有产生 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
再来一个例子
# 又混乱又有产生 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