✏️ 习题
第 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) # 352
定义 lambda 函数返回参数的绝对值,并调用。
▶ 运行结果: 5
3
▼
参考答案
python
abs_lambda = lambda x: abs(x)
print(abs_lambda(-5)) # 5
print(abs_lambda(3)) # 33
用
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) # 38409
用
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)) # -117
哥德巴赫猜想:验证 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
第 1 / 3 页