✏️ 习题

第 6 章 · 函数 · 25 道习题 · 分 3 页 · 函数基础与高阶函数

📝 习题

共 25 题 · 分 3 页 · 高阶函数与综合应用

答案默认折叠,点击题目或右侧开关控制显示
展开所有答案
1
reduce() 和 lambda 求 [3,5,7,9,11] 的总和。
▶ 运行结果: 35
参考答案
python
from functools import reduce
result = reduce(lambda a, b: a + b, [3, 5, 7, 9, 11])
print(result)  # 35
2
定义 lambda 函数返回参数的绝对值,并调用。
▶ 运行结果: 5 3
参考答案
python
abs_lambda = lambda x: abs(x)
print(abs_lambda(-5))  # 5
print(abs_lambda(3))   # 3
3
map() 和 lambda 将 [10,20,30,40,50] 每个元素乘以3。
▶ 运行结果: [30, 60, 90, 120, 150]
参考答案
python
result = list(map(lambda x: x * 3, [10, 20, 30, 40, 50]))
print(result)  # [30, 60, 90, 120, 150]
4
filter() 和 lambda 筛选 [1,3,5,7,9,11,13] 中大于5的数。
▶ 运行结果: [7, 9, 11, 13]
参考答案
python
result = list(filter(lambda x: x > 5, [1, 3, 5, 7, 9, 11, 13]))
print(result)  # [7, 9, 11, 13]
5
定义 lambda 函数接收两个参数,返回后一个参数减前一个,计算 10 和 4 的差。
▶ 运行结果: -6
参考答案
python
sub = lambda a, b: b - a
print(sub(10, 4))  # -6(4 - 10)
6
map() 处理两个列表 [1,2,3][4,5,6],返回对应元素乘积。
▶ 运行结果: [4, 10, 18]
参考答案
python
result = list(map(lambda x, y: x * y, [1, 2, 3], [4, 5, 6]))
print(result)  # [4, 10, 18]
7
filter() 筛选 ["apple","banana","cherry","date"] 中长度为5的字符串。
▶ 运行结果: ['apple']
参考答案
python
result = list(filter(lambda s: len(s) == 5, ["apple", "banana", "cherry", "date"]))
print(result)  # ['apple']
8
reduce() 和 lambda 求 [2,4,6,8,10] 的乘积。
▶ 运行结果: 3840
参考答案
python
from functools import reduce
result = reduce(lambda a, b: a * b, [2, 4, 6, 8, 10])
print(result)  # 3840
9
map()filter() 结合:将 [1,2,...,10] 每个元素乘以2,再筛选出大于10的数。
▶ 运行结果: [12, 14, 16, 18, 20]
参考答案
python
nums = list(range(1, 11))
doubled = map(lambda x: x * 2, nums)
result = list(filter(lambda x: x > 10, doubled))
print(result)  # [12, 14, 16, 18, 20]
10
filter()reduce() 结合:筛选 [1,...,10] 中的偶数,再求和。
▶ 运行结果: 30
参考答案
python
from functools import reduce
nums = list(range(1, 11))
evens = filter(lambda x: x % 2 == 0, nums)
result = reduce(lambda a, b: a + b, evens)
print(result)  # 30 (2+4+6+8+10)
11
定义普通函数判断是否为偶数,用 map() 处理 [11,...,20],返回布尔值列表。
▶ 运行结果: [False, True, False, True, False, True, False, True, False, True]
参考答案
python
def is_even(n):
    return n % 2 == 0

result = list(map(is_even, range(11, 21)))
print(result)
# [False, True, False, True, False, True, False, True, False, True]
12
map()reduce() 结合:将 [1,2,3,4,5] 每个元素平方,再求和。
▶ 运行结果: 55
参考答案
python
from functools import reduce
nums = [1, 2, 3, 4, 5]
squares = map(lambda x: x ** 2, nums)
result = reduce(lambda a, b: a + b, squares)
print(result)  # 55 (1+4+9+16+25)
13
filter()reduce() 结合:筛选 [2,3,4,5,6,7] 中的质数,再求乘积。
▶ 运行结果: 210
参考答案
python
from functools import reduce

def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

nums = [2, 3, 4, 5, 6, 7]
primes = filter(is_prime, nums)
result = reduce(lambda a, b: a * b, primes)
print(result)  # 210 (2*3*5*7)
14
map()filter()reduce() 三者结合:筛选 [1,...,15] 中的质数,每个乘以2,再求和。
▶ 运行结果: 82
参考答案
python
from functools import reduce

def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

nums = list(range(1, 16))
primes = filter(is_prime, nums)       # 筛选质数
doubled = map(lambda x: x * 2, primes) # 每个乘2
result = reduce(lambda a, b: a + b, doubled)  # 求和
print(result)  # 48 (2*2 + 3*2 + 5*2 + 7*2 + 11*2 + 13*2)
15
定义 lambda 函数接收三个参数返回最小值,用 map() 处理 [5,3,8][4,9,2][7,1,6],返回对应位置最小值。
▶ 运行结果: [4, 1, 2]
参考答案
python
l1 = [5, 3, 8]
l2 = [4, 9, 2]
l3 = [7, 1, 6]
result = list(map(lambda a, b, c: min(a, b, c), l1, l2, l3))
print(result)  # [4, 1, 2]
16
二分查找:在有序列表中查找目标值,返回索引或"未找到"。
▶ 运行结果: 5 -1
参考答案
python
def binary_search(arr, target):
    low, high = 0, len(arr) - 1
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

arr = [-3, 4, 7, 9, 13, 45, 67, 89, 100, 180]
print(binary_search(arr, 45))   # 5
print(binary_search(arr, 50))   # -1
17
哥德巴赫猜想:验证 2000 以内不小于 4 的偶数都能分解为两个素数之和。
📝 样例输入: 10
▶ 运行结果: 请输入偶数:10 10 = 3 + 7
参考答案
python
def is_prime(n):
    if n < 2: return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0: return False
    return True

def goldbach(n):
    for i in range(2, n // 2 + 1):
        if is_prime(i) and is_prime(n - i):
            return f"{n} = {i} + {n - i}"
    return f"{n} 无法分解"

n = int(input("请输入偶数:"))
print(goldbach(n))
18
牛顿迭代法求方程 ax³+bx²+cx+d=0 在 x=1 附近的一个实根。
📝 样例输入: 1 -3 1 1
▶ 运行结果: 输入系数a b c d:1 -3 1 1 根为:1.000000
参考答案
python
def solve(a, b, c, d):
    x = 1.5
    while True:
        f = a*x**3 + b*x**2 + c*x + d
        fd = 3*a*x**2 + 2*b*x + c
        x_new = x - f / fd
        if abs(x_new - x) < 1e-5:
            return x_new
        x = x_new

a, b, c, d = map(float, input("输入系数a b c d:").split())
print(f"根为:{solve(a, b, c, d):.6f}")
19
计算个人所得税:起征点2000元,超额累进税率(5%~45%共9级)。输入收入,输出应缴税额。
📝 样例输入: 5000
▶ 运行结果: 请输入收入:5000 应缴税额:325.00
参考答案
python
def calc_tax(income):
    table = [(0,500,0.05),(500,2000,0.10),(2000,5000,0.15),
             (5000,20000,0.20),(20000,40000,0.25),(40000,60000,0.30),
             (60000,80000,0.35),(80000,100000,0.40),(100000,1e10,0.45)]
    profit = income - 2000
    tax = 0
    for low, high, rate in table:
        if profit > low:
            tax += (min(profit, high) - low) * rate
            if profit <= high:
                break
    return tax

income = int(input("请输入收入:"))
print(f"应缴税额:{calc_tax(income):.2f}")
20
歌星大奖赛:10个评委打分(1~100),去掉最高分和最低分后取平均。同时找出最公平和最不公平的评委。
▶ 运行结果: 打分:[62, 66, 96, 97, 82, 95, 84, 66, 71, 69] 最后得分:78.6 最公平:第5位评委,最不公平:第4位评委
参考答案
python
def judge(scores):
    mx, mn = max(scores), min(scores)
    avg = (sum(scores) - mx - mn) / 8
    # 最公平:与平均分差距最小
    diffs = [abs(s - avg) for s in scores]
    fairest = diffs.index(min(diffs)) + 1
    # 最不公平:与平均分差距最大
    unfairest = diffs.index(max(diffs)) + 1
    return avg, fairest, unfairest

import random
scores = [random.randint(60, 100) for _ in range(10)]
print(f"打分:{scores}")
avg, fair, unfair = judge(scores)
print(f"最后得分:{avg:.1f}")
print(f"最公平:第{fair}位评委,最不公平:第{unfair}位评委")
21
打鱼还是晒网:某人从1990年1月1日起"三天打鱼两天晒网",输入日期判断当天在打鱼还是晒网。
📝 样例输入: 2024 1 1
▶ 运行结果: 输入日期(年 月 日):2024 1 1 晒网
参考答案
python
def is_leap(year):
    return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0

def count_days(year, month, day):
    months = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30]
    total = 0
    for y in range(1990, year):
        total += 366 if is_leap(y) else 365
    if is_leap(year):
        months[2] = 29
    total += sum(months[:month]) + day
    return total

y, m, d = map(int, input("输入日期(年 月 日):").split())
days = count_days(y, m, d)
result = days % 5
print("打鱼" if 0 < result < 4 else "晒网")
22
分糖果:10个小孩围一圈分糖果,每次将手中糖分一半给右边,奇数可向老师要一块。求几次后大家糖果一样多。
▶ 运行结果: 经过16次后,每人18块糖
参考答案
python
def distribute(sweet):
    count = 0
    while len(set(sweet)) > 1:  # 不全相同就继续
        half = [s // 2 for s in sweet]
        sweet = [(half[i] + half[(i-1) % 10]) for i in range(10)]
        sweet = [s + 1 if s % 2 != 0 else s for s in sweet]  # 奇数补1
        count += 1
    return count, sweet[0]

sweet = [10, 2, 8, 22, 16, 4, 10, 6, 14, 20]
times, candies = distribute(sweet)
print(f"经过{times}次后,每人{candies}块糖")
23
要发就发:不超过1993的素数排成第一行,第二行是相邻素数之差。求第二行中是否存在连续整数和恰为1898。
▶ 运行结果: (1) 3, 1901 (2) 53, 1951 (3) 89, 1987 共3种
参考答案
python
def is_prime(n):
    if n < 2: return False
    for i in range(2, int(n**0.5)+1):
        if n % i == 0: return False
    return True

primes = [i for i in range(2, 1994) if is_prime(i)]
count = 0
for i in range(len(primes)):
    for j in range(i+1, len(primes)):
        if primes[j] - primes[i] == 1898:
            count += 1
            print(f"({count}) {primes[i]}, {primes[j]}")
            break
        elif primes[j] - primes[i] > 1898:
            break
print(f"共{count}种")
24
快乐数:反复求各位数字平方和,最终结果为1则是快乐数,否则陷入循环。判断输入的数是否为快乐数。
📝 样例输入: 19
▶ 运行结果: 请输入数字:19 快乐数
参考答案
python
def is_happy(n):
    seen = set()
    while n != 1 and n not in seen:
        seen.add(n)
        n = sum(int(d) ** 2 for d in str(n))
    return n == 1

n = int(input("请输入数字:"))
print("快乐数" if is_happy(n) else "不是快乐数")
# 19 → 82 → 68 → 100 → 1(快乐数)
25
有效的括号:给定只含 ()[]{} 的字符串,判断括号是否有效(正确闭合与嵌套)。
▶ 运行结果: True False True
参考答案
python
def is_valid(s):
    stack = []
    pairs = {')': '(', ']': '[', '}': '{'}
    for ch in s:
        if ch in '([{':
            stack.append(ch)
        elif ch in ')]}':
            if not stack or stack.pop() != pairs[ch]:
                return False
    return not stack

print(is_valid("()[]{}"))    # True
print(is_valid("([)]"))      # False
print(is_valid("{[()]}"))    # True