主题色

第6章 函数

回文数、数字提取、数列求和 —— 函数就像一个专门负责某项任务的小作坊

6-1 回文数

题目:判断整数是否是回文数(正着读和倒着读一样,如 877812321)。是返回 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]
行号代码白话解释
1def isHuiwen(n):定义函数,接收整数 n
2s = str(n)把数字转成字符串,因为数字不能"倒着读",字符串可以。
3return s == s[::-1]s[::-1] 是字符串反转。如果正序倒序一模一样,== 返回 True,否则 False

图解: 12321 正序倒序都是 12321True1232 倒序是 2321False


6-2 函数求整数各位数字和

题目:实现函数 mysum(x),计算一个整数各位数字之和。

函数接口: def mysum(x):

裁判程序:

n = int(input())
print(mysum(n))
输入输出
6511

参考答案(循环版):

def mysum(x):
    s = 0
    while x != 0:
        s = s + x % 10
        x = x // 10
    return s
行号代码白话解释
1def mysum(x):定义函数,接收整数 x
2s = 0准备一个累加器 s,初始为 0。
3while x != 0:只要 x 还没变成 0,就继续循环。
4s = s + x % 10x % 10x最后一位,加到 s 里。
5x = x // 10// 10 整除 10,相当于砍掉最后一位
6return s所有位都加完了,返回总和。

执行图解(x = 65):

  • 第 1 轮:x % 10 = 5s = 5x = 6
  • 第 2 轮:x % 10 = 6s = 11x = 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 jiohio3lh33243433

参考答案:

def trans(s):
    result = ""
    for ch in s:
        if ch.isdigit():
            result = result + ch
    return result
行号代码白话解释
1def trans(s):定义函数,接收字符串 s
2result = ""准备一个空篮子,用来装找到的数字。
3for ch in s:逐个检查字符串里的每个字符。
4if ch.isdigit():判断当前字符是不是数字。
5result = result + ch如果是数字,就把它粘到篮子末尾。
6return result全部检查完,把篮子交还。

进阶写法(一行代码): return "".join(filter(str.isdigit, s))


6-4 特殊 a 串和

题目:给定 an,求 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 22462 + 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
行号代码白话解释
1def fn(a, n):定义函数,a 是要重复的数字,n 是最多重复几次。
2total = 0累加器,存最终总和。
3term = 0当前项,每轮变成 a, aa, aaa...
4for i in range(n):循环 n 次。
5term = term * 10 + a构造秘诀:把上一项左移一位(乘 10),末尾补上 a。如 222222
6total = total + term把刚造出来的项加到总和中。
7return total返回总和。

执行图解(a=2, n=3):

  • 第 1 轮:term = 0*10+2 = 2total = 2
  • 第 2 轮:term = 2*10+2 = 22total = 24
  • 第 3 轮:term = 22*10+2 = 222total = 246

附录:字符串 & 函数核心口诀

【切片】
切片三参数,起止和步长;
起点 inclusive,终点 exclusive;
步长为正正向走,步长为负倒着取。

【函数提交】
def 起个头,参数放括号;
冒号缩进别忘记,return 把值送回家;
PTA 裁判已写好输入输出,
只需提交 def 块,莫把 print 带进去。