当前位置: 首页 > news >正文

Python 函数专项练习:6 道编程题从入门到精通

配套专栏:Python 全栈修炼之路 第 07 篇《函数 —— 代码复用的基石》

难度分布:⭐ → ⭐⭐ → ⭐⭐ → ⭐⭐⭐ → ⭐⭐⭐ → ⭐⭐⭐⭐

核心覆盖:*args/**kwargs、闭包、装饰器、递归、lru_cache、高阶函数、LEGB 作用域、延迟绑定


题目一:通用函数调用器 ⭐

📌 题目描述

编写函数call_function(func, args=None, kwargs=None),实现一个通用的函数调用器:

defadd(a,b,c=0):returna+b+c# 位置参数调用call_function(add,args=[1,2])# 3call_function(add,args=[1,2,3])# 6# 关键字参数调用call_function(add,kwargs={"a":1,"b":2})# 3# 混合调用call_function(add,args=[1],kwargs={"b":2,"c":10})# 13

💡 编程思路

这道题考察*args**kwargs的解包与转发

  1. 函数需要接收一个可调用对象func,以及可选的位置参数列表args和关键字参数字典kwargs
  2. 使用*解包位置参数列表,**解包关键字参数字典。
  3. 通过func(*args, **kwargs)实现动态调用。

关键点None的默认值处理 —— 当argskwargsNone时,应替换为空列表/空字典。

🖥️ 参考代码

defcall_function(func,args=None,kwargs=None):""" 通用函数调用器 参数: func: 可调用对象 args: 位置参数列表 kwargs: 关键字参数字典 """args=argsor[]kwargs=kwargsor{}returnfunc(*args,**kwargs)defcall_function_safe(func,args=None,kwargs=None):"""安全版本:捕获异常并返回友好错误信息"""args=argsor[]kwargs=kwargsor{}try:returnfunc(*args,**kwargs)exceptTypeErrorase:returnf"调用失败:{e}"# 测试if__name__=="__main__":defadd(a,b,c=0):returna+b+cdefgreet(name,greeting="你好"):returnf"{greeting},{name}!"defvar_args(*args,**kwargs):returnf"args={args}, kwargs={kwargs}"# 位置参数print(call_function(add,args=[1,2]))# 3print(call_function(add,args=[1,2,3]))# 6# 关键字参数print(call_function(add,kwargs={"a":1,"b":2}))# 3print(call_function(greet,kwargs={"name":"张三"}))# 你好, 张三!# 混合调用print(call_function(add,args=[1],kwargs={"b":2,"c":10}))# 13# 可变参数函数print(call_function(var_args,args=[1,2,3],kwargs={"x":99}))# args=(1, 2, 3), kwargs={'x': 99}# 错误处理print(call_function_safe(add,args=[1]))# 缺少参数print(call_function_safe(add,args=[1,2,3,4]))# 参数过多

🔗 关联知识点

知识点说明
*args解包将列表展开为位置参数
**kwargs解包将字典展开为关键字参数
or []惯用法None时替换为空列表
TypeError捕获参数不匹配时的异常

题目二:闭包实现带历史记录的计算器 ⭐⭐

📌 题目描述

使用闭包实现一个带历史记录的计算器工厂make_calculator(),每次调用返回独立的计算器实例:

calc1=make_calculator()calc1.add(5)calc1.add(3)calc1.subtract(1)print(calc1.result())# 7print(calc1.history())# ['+5', '+3', '-1']calc2=make_calculator()calc2.multiply(4)calc2.add(6)print(calc2.result())# 4 (独立的实例)

💡 编程思路

这道题考察闭包的状态保持能力

  1. make_calculator()内部维护totalhistory两个自由变量。
  2. 返回的内部函数通过nonlocal修改这些变量。
  3. 每次调用make_calculator()都会创建独立的闭包实例,互不干扰。

关键点:闭包通过__closure__捕获外部变量,即使外部函数已返回,变量仍存活。

🖥️ 参考代码

defmake_calculator(initial=0):""" 创建带历史记录的计算器闭包 返回: 包含 add/subtract/multiply/divide/result/history/clear 方法的对象 """total=initial history=[]def_update(value,symbol):nonlocaltotal total=value history.append(f"{symbol}{value}")defadd(n):_update(total+n,f"+{n}")returntotaldefsubtract(n):_update(total-n,f"-{n}")returntotaldefmultiply(n):_update(total*n,f"*{n}")returntotaldefdivide(n):ifn==0:raiseZeroDivisionError("除数不能为零")_update(total/n,f"/{n}")returntotaldefresult():returntotaldefget_history():returnhistory.copy()defclear():nonlocaltotal total=initial history.clear()defundo():"""撤销上一步操作(重新计算历史)"""nonlocaltotalifnothistory:returnhistory.pop()total=initial# 重新执行所有历史操作forrecordinhistory:op=record[0]val=float(record[1:])ifop=='+':total+=valelifop=='-':total-=valelifop=='*':total*=val
http://www.rkmt.cn/news/1437861.html

相关文章:

  • 告别模糊:如何用Gram-Schmidt方法将高分七号影像提升至0.65米(附冬季雪地案例效果对比)
  • 告别模糊!用Gram-Schmidt融合提升高分七号影像细节(ENVI掩膜版工具实战)
  • 从‘信号混叠’到‘图像条纹’:一个SAR工程师的日常避坑清单与实战调参经验
  • 告别龟速传输!用FastCopy替代Windows自带复制,实测速度提升3倍(附保姆级配置教程)
  • OSPF综合练习
  • 语言超详细系统学习路线(2025年最新)
  • 2026年q2西安学校灭四害公司专业选型技术推荐:西安灭老鼠公司电话/西安灭蟑螂公司/排行一览 - 优质品牌商家
  • LangGraph工作流引擎深度剖析:状态持久化与循环控制的工程实践
  • 2026年第二季度靠谱的合肥离婚打官司律师哪位靠谱?深度剖析与选择指南 - 2026年企业资讯
  • 推荐系统能耗分析与绿色优化实践
  • 2026湖州工业气体权威机构排行:萧山,湖州,绍兴,绍兴特种气体/黄山丙烷/黄山二氧化碳/合规与实力双维度盘点 - 优质品牌商家
  • Skill 是什么?——AI Agent 的“技能包“
  • Unity Resources文件夹的‘潜规则’:为什么你的图片加载总是报错?
  • 2026苏州资质齐全防水补漏公司TOP4:修缮优选指南 专业防水公司排名推荐(2026年6月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 2026年q2四川水生植物靠谱供货基地技术遴选推荐:水生植物种植施工/沉水植物/浮叶植物/排行一览 - 优质品牌商家
  • ZYNQ7100实战:用AXI DMA搞定PL到PS的ADC数据流(Vivado 2017.4保姆级流程)
  • STM32F103实测可用的步进电机S曲线调速工程包(含多轴扩展与详细调试文档)
  • 用OpenCV和Python给五子棋拍个‘X光’:自动识别棋子并判断输赢(附完整代码)
  • Luban导出的表数据怎么管理?我设计了一个轻量级DataManager(支持热更与多环境)
  • 拆解USB PD协议层消息:从Source到Sink,一次完整的充电握手都说了啥?
  • 告别手动抓包!用CPAL脚本的log函数,实现CANoe自动化测试日志的智能管理
  • MATLAB雨流计数脚本:从结温波动数据直接算IGBT疲劳损伤值
  • 手把手教你为Ubuntu 22.04编译安装蓝牙驱动(解决5.15/5.17/5.18内核蓝牙失灵)
  • 轻量强大的文件收纳管理工具
  • 2026年Q2青海管道疏通品牌评测:本土适配性深度对比 - 优质品牌商家
  • 基于C++实现(控制台)学生选课系统
  • 小米高通手机QCN校准参数快速写入工具(9008模式直刷)
  • 从CPU加法器到智能门锁:拆解身边电子产品里的逻辑运算(附Verilog建模思路)
  • 从生物信息学到金融风控:Lasso回归的跨界实战案例解析(附Python代码)
  • 保姆级教程:在Ubuntu上用Python为K210训练YOLOv2目标检测模型(附完整数据集)