主题色

附录:函数入门逐行讲解

6-1 至 6-6 完整版 · PTA 提交时只复制 def 上面的部分即可

6-1 手机尾号暴露你的年龄

def age(n, y):
    result = (n * 2 + 5) * 50 + 1776 - y
    return result % 100
行号代码白话解释
1def age(n, y):定义一个名叫 age 的函数,它需要两个信息:n(手机尾号)和 y(出生年份)。
2result = ...把题目给的那一长串公式算出来,存到变量 result 里。
3return 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
行号代码白话解释
1from math import sin, sqrt从 Python 的数学工具箱里借来 sin(正弦)和 sqrt(开根号)两个函数。
3def fun(x):定义函数 fun,它接收一个实数 x
4-5if x < 2:
y = 3 * x + 5
如果 x 小于 2,按第一条规则算 y
6-7elif x < 3:
y = 2 * sin(x) - 1
否则,如果 x 小于 3(隐含了 x 已经 ≥2),按第二条规则算。sin 里面默认是弧度。
8-9else:
y = sqrt(1 + x * x)
其他情况(即 x ≥3),按第三条规则算。x * x 就是 x²。
10return 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")
行号代码白话解释
1def giveChange(money):定义函数 giveChange,传入要找的总金额 money
2x = money // 10//整除(去掉小数部分)。看 money 里有几个 10 元,存到 x
3y = (money % 10) // 5money % 10 算出去掉 10 元后剩下的零钱,再整除 5,得到 5 元的张数 y
4z = money % 5再对 5 取余,得到最后剩下的 1 元硬币数 z
5print(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
行号代码白话解释
1def pay(salaryHour, hours):定义工资函数,salaryHour 是正常时薪,hours 是工作总时长。
2-3if hours <= 40:没加班:直接时薪 × 小时数。
4-6elif hours <= 60:加班但在 60 小时以内:
normal 是前 40 小时的正常工资;
extra 是超出 40 小时那部分 × 1.5 倍时薪;
加起来就是 money
7-11else:加班超过 60 小时:
normal 仍是 40 小时正常工资;
extra1 是 40~60 这 20 小时的 1.5 倍工资;
extra2 是超过 60 小时的部分 × 2 倍时薪;
三者相加。
12return money返回算好的总工资。

6-5 求最大公约数

def gcd(m, n):
    while n != 0:
        t = m % n
        m = n
        n = t
    return m
行号代码白话解释
1def gcd(m, n):定义求最大公约数的函数,传入两个整数。
2while n != 0:只要 n 还不是 0,就继续循环
3t = m % n用临时变量 tm 除以 n 的余数。
4m = n把原来的 n 赋给 m
5n = t把刚才算的余数赋给 n
6return mn 终于变成 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) 部分

行号代码白话解释
1def wanshu(x):定义判断完数的函数。
2s = 0s 用来累加所有真因子(除了自己以外的因子)的和。
3for i in range(1, x):i 从 1 数到 x-1,逐个检查是不是 x 的因子。
4if x % i == 0:如果 x 能被 i 整除(余数为 0),说明 i 是因子。
5s = s + i把这个因子 i 加到总和 s 里。
6-9if s == x:
return True
else:
return False
如果因子之和正好等于原数,返回 True(是完数);否则返回 False

findWS(m, n) 部分

行号代码白话解释
11def findWS(m, n):定义查找函数,给定区间 [m, n]
12found = False先假设没找到,设一个标志变量。
13for i in range(m, n + 1):m 遍历到 n(注意 range 右端不包含,所以要写 n + 1)。
14if wanshu(i):调用上面的函数判断 i 是不是完数。
15print(i, end=" ")如果是,就打印出来,end=" " 表示打印后不换行,只空一格。
16found = True标记一下:已经找到至少一个完数了。
17-20if found:
print()
else:
print("Not found")
如果找到过,最后打印一个空行(把光标移到下一行);
如果全程没找到,就输出 Not found

提交

在 PTA 上,裁判程序已经写好了输入输出,只需要把 def 及其缩进内容 粘贴到答题框里。