附录:函数入门逐行讲解
6-1 至 6-6 完整版 · PTA 提交时只复制 def 上面的部分即可
6-1 手机尾号暴露你的年龄
def age(n, y):
result = (n * 2 + 5) * 50 + 1776 - y
return result % 100
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 1 | def age(n, y): | 定义一个名叫 age 的函数,它需要两个信息:n(手机尾号)和 y(出生年份)。 |
| 2 | result = ... | 把题目给的那一长串公式算出来,存到变量 result 里。 |
| 3 | return result % 100 | % 100 就是"除以 100 取余数",也就是取最后两位数字,把结果还给调用它的地方。 |
6-2 分段函数求解
from math import sin, sqrt
def fun(x):
if x < 2:
y = 3 * x + 5
elif x < 3:
y = 2 * sin(x) - 1
else:
y = sqrt(1 + x * x)
return y
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 1 | from math import sin, sqrt | 从 Python 的数学工具箱里借来 sin(正弦)和 sqrt(开根号)两个函数。 |
| 3 | def fun(x): | 定义函数 fun,它接收一个实数 x。 |
| 4-5 | if x < 2:y = 3 * x + 5 | 如果 x 小于 2,按第一条规则算 y。 |
| 6-7 | elif x < 3:y = 2 * sin(x) - 1 | 否则,如果 x 小于 3(隐含了 x 已经 ≥2),按第二条规则算。sin 里面默认是弧度。 |
| 8-9 | else:y = sqrt(1 + x * x) | 其他情况(即 x ≥3),按第三条规则算。x * x 就是 x²。 |
| 10 | return y | 把算好的 y 返回出去。 |
6-3 买单找钱
def giveChange(money):
x = money // 10
y = (money % 10) // 5
z = money % 5
print(f"{money} = {x}*10 + {y}*5 + {z}*1")
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 1 | def giveChange(money): | 定义函数 giveChange,传入要找的总金额 money。 |
| 2 | x = money // 10 | // 是整除(去掉小数部分)。看 money 里有几个 10 元,存到 x。 |
| 3 | y = (money % 10) // 5 | 先 money % 10 算出去掉 10 元后剩下的零钱,再整除 5,得到 5 元的张数 y。 |
| 4 | z = money % 5 | 再对 5 取余,得到最后剩下的 1 元硬币数 z。 |
| 5 | print(f"...") | 用 f-string 格式化输出,把变量直接填进字符串里,拼成题目要求的等式。 |
6-4 函数计算工资
def pay(salaryHour, hours):
if hours <= 40:
money = salaryHour * hours
elif hours <= 60:
normal = salaryHour * 40
extra = (hours - 40) * salaryHour * 1.5
money = normal + extra
else:
normal = salaryHour * 40
extra1 = 20 * salaryHour * 1.5
extra2 = (hours - 60) * salaryHour * 2
money = normal + extra1 + extra2
return money
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 1 | def pay(salaryHour, hours): | 定义工资函数,salaryHour 是正常时薪,hours 是工作总时长。 |
| 2-3 | if hours <= 40: | 没加班:直接时薪 × 小时数。 |
| 4-6 | elif hours <= 60: | 加班但在 60 小时以内:normal 是前 40 小时的正常工资;extra 是超出 40 小时那部分 × 1.5 倍时薪;加起来就是 money。 |
| 7-11 | else: | 加班超过 60 小时:normal 仍是 40 小时正常工资;extra1 是 40~60 这 20 小时的 1.5 倍工资;extra2 是超过 60 小时的部分 × 2 倍时薪;三者相加。 |
| 12 | return money | 返回算好的总工资。 |
6-5 求最大公约数
def gcd(m, n):
while n != 0:
t = m % n
m = n
n = t
return m
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 1 | def gcd(m, n): | 定义求最大公约数的函数,传入两个整数。 |
| 2 | while n != 0: | 只要 n 还不是 0,就继续循环。 |
| 3 | t = m % n | 用临时变量 t 存 m 除以 n 的余数。 |
| 4 | m = n | 把原来的 n 赋给 m。 |
| 5 | n = t | 把刚才算的余数赋给 n。 |
| 6 | return m | 当 n 终于变成 0 时,m 就是最大公约数,返回它。 |
这就是著名的辗转相除法:两个数一直互相取余,直到余数为 0,剩下的那个数就是答案。
6-6 利用函数找"完数"
def wanshu(x):
s = 0
for i in range(1, x):
if x % i == 0:
s = s + i
if s == x:
return True
else:
return False
def findWS(m, n):
found = False
for i in range(m, n + 1):
if wanshu(i):
print(i, end=" ")
found = True
if found:
print()
else:
print("Not found")
wanshu(x) 部分
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 1 | def wanshu(x): | 定义判断完数的函数。 |
| 2 | s = 0 | s 用来累加所有真因子(除了自己以外的因子)的和。 |
| 3 | for i in range(1, x): | 让 i 从 1 数到 x-1,逐个检查是不是 x 的因子。 |
| 4 | if x % i == 0: | 如果 x 能被 i 整除(余数为 0),说明 i 是因子。 |
| 5 | s = s + i | 把这个因子 i 加到总和 s 里。 |
| 6-9 | if s == x:return Trueelse:return False | 如果因子之和正好等于原数,返回 True(是完数);否则返回 False。 |
findWS(m, n) 部分
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 11 | def findWS(m, n): | 定义查找函数,给定区间 [m, n]。 |
| 12 | found = False | 先假设没找到,设一个标志变量。 |
| 13 | for i in range(m, n + 1): | 从 m 遍历到 n(注意 range 右端不包含,所以要写 n + 1)。 |
| 14 | if wanshu(i): | 调用上面的函数判断 i 是不是完数。 |
| 15 | print(i, end=" ") | 如果是,就打印出来,end=" " 表示打印后不换行,只空一格。 |
| 16 | found = True | 标记一下:已经找到至少一个完数了。 |
| 17-20 | if found:print()else:print("Not found") | 如果找到过,最后打印一个空行(把光标移到下一行); 如果全程没找到,就输出 Not found。 |
提交
在 PTA 上,裁判程序已经写好了输入输出,只需要把 def 及其缩进内容 粘贴到答题框里。
上一章
第7章 列表与元组
下一章
—