第6章 函数
回文数、数字提取、数列求和 —— 函数就像一个专门负责某项任务的小作坊
6-1 回文数
题目:判断整数是否是回文数(正着读和倒着读一样,如 8778、12321)。是返回 True,否返回 False。
函数接口: def isHuiwen(n):
裁判程序:
n = int(input())
if isHuiwen(n):
print("yes")
else:
print("no")
参考答案:
def isHuiwen(n):
s = str(n)
return s == s[::-1]
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 1 | def isHuiwen(n): | 定义函数,接收整数 n。 |
| 2 | s = str(n) | 把数字转成字符串,因为数字不能"倒着读",字符串可以。 |
| 3 | return s == s[::-1] | s[::-1] 是字符串反转。如果正序倒序一模一样,== 返回 True,否则 False。 |
图解:
12321正序倒序都是12321→True;1232倒序是2321→False。
6-2 函数求整数各位数字和
题目:实现函数 mysum(x),计算一个整数各位数字之和。
函数接口: def mysum(x):
裁判程序:
n = int(input())
print(mysum(n))
| 输入 | 输出 |
|---|---|
65 | 11 |
参考答案(循环版):
def mysum(x):
s = 0
while x != 0:
s = s + x % 10
x = x // 10
return s
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 1 | def mysum(x): | 定义函数,接收整数 x。 |
| 2 | s = 0 | 准备一个累加器 s,初始为 0。 |
| 3 | while x != 0: | 只要 x 还没变成 0,就继续循环。 |
| 4 | s = s + x % 10 | x % 10 取 x 的最后一位,加到 s 里。 |
| 5 | x = x // 10 | // 10 整除 10,相当于砍掉最后一位。 |
| 6 | return s | 所有位都加完了,返回总和。 |
执行图解(x = 65):
- 第 1 轮:
x % 10 = 5,s = 5,x = 6- 第 2 轮:
x % 10 = 6,s = 11,x = 0- 结束,返回
11
进阶写法(一行代码):
def mysum(x):
return sum(int(d) for d in str(abs(x)))
6-3 字符串中提取数字
题目:读入字符串,提取其中所有数字,输出新字符串。没有数字返回空字符串。
函数接口: def trans(s):
裁判程序:
s = input()
t = trans(s)
print(t)
| 输入 | 输出 |
|---|---|
ab32 434 jiohio3lh3 | 3243433 |
参考答案:
def trans(s):
result = ""
for ch in s:
if ch.isdigit():
result = result + ch
return result
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 1 | def trans(s): | 定义函数,接收字符串 s。 |
| 2 | result = "" | 准备一个空篮子,用来装找到的数字。 |
| 3 | for ch in s: | 逐个检查字符串里的每个字符。 |
| 4 | if ch.isdigit(): | 判断当前字符是不是数字。 |
| 5 | result = result + ch | 如果是数字,就把它粘到篮子末尾。 |
| 6 | return result | 全部检查完,把篮子交还。 |
进阶写法(一行代码):
return "".join(filter(str.isdigit, s))
6-4 特殊 a 串和
题目:给定 a 和 n,求 a + aa + aaa + ... + aa...a(n 个 a)之和。
函数接口: def fn(a, n):
裁判程序:
n, a = list(map(int, input().split()))
s = fn(a, n)
print(s)
| 输入 | 输出 | 验算 |
|---|---|---|
3 2 | 246 | 2 + 22 + 222 = 246 |
参考答案:
def fn(a, n):
total = 0
term = 0
for i in range(n):
term = term * 10 + a
total = total + term
return total
| 行号 | 代码 | 白话解释 |
|---|---|---|
| 1 | def fn(a, n): | 定义函数,a 是要重复的数字,n 是最多重复几次。 |
| 2 | total = 0 | 累加器,存最终总和。 |
| 3 | term = 0 | 当前项,每轮变成 a, aa, aaa... |
| 4 | for i in range(n): | 循环 n 次。 |
| 5 | term = term * 10 + a | 构造秘诀:把上一项左移一位(乘 10),末尾补上 a。如 2→22→222。 |
| 6 | total = total + term | 把刚造出来的项加到总和中。 |
| 7 | return total | 返回总和。 |
执行图解(a=2, n=3):
- 第 1 轮:
term = 0*10+2 = 2,total = 2- 第 2 轮:
term = 2*10+2 = 22,total = 24- 第 3 轮:
term = 22*10+2 = 222,total = 246
附录:字符串 & 函数核心口诀
【切片】
切片三参数,起止和步长;
起点 inclusive,终点 exclusive;
步长为正正向走,步长为负倒着取。
【函数提交】
def 起个头,参数放括号;
冒号缩进别忘记,return 把值送回家;
PTA 裁判已写好输入输出,
只需提交 def 块,莫把 print 带进去。