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

Python函数详解:从语法到参数传递的思考

Python 函数详解:从语法到参数传递的思考

函数是 Python 中最核心、最常用的特性之一。掌握函数,不仅能写出可复用的代码,更能深刻理解 Python 的“一切皆对象”和参数传递机制。本文从基础语法开始,逐步深入到参数传递的本质,最后给出实际思考和最佳实践。

1. 函数的基本语法

定义函数
def函数名(参数列表):"""文档字符串(可选,但强烈推荐)"""# 函数体语句...return返回值# 可选,不写则返回 None

示例

defgreet(name:str)->str:"""问候函数"""returnf"你好,{name}!"print(greet("小明"))# 你好,小明!
  • 类型提示name: str,-> str):Python 3.5+ 引入,属于注解,不强制执行,但 IDE 和类型检查工具(如 mypy)会使用。
  • 文档字符串:用三引号,help(greet)或 IDE 会显示。
调用函数
result=greet("小明")

2. 参数的种类(从简单到高级)

Python 函数参数非常灵活,支持多种传递方式。参数顺序规则(Python 3.8+):

位置参数(Positional-only) / 普通参数 / * 可变位置参数 / 仅关键字参数 / ** 可变关键字参数

(1) 位置参数与关键字参数
defadd(a,b):returna+b add(3,5)# 位置参数add(a=3,b=5)# 关键字参数add(b=5,a=3)# 关键字参数顺序可变
(2) 默认参数

默认参数必须放在非默认参数之后。

defpower(base,exp=2):returnbase**exp power(3)# 9power(3,4)# 81
(3) 可变参数:*args 和 **kwargs
defprint_info(title,*args,**kwargs):print("标题:",title)print("位置参数:",args)# tupleprint("关键字参数:",kwargs)# dictprint_info("测试",1,2,3,name="张三",age=18)

输出:

标题: 测试 位置参数: (1, 2, 3) 关键字参数: {'name': '张三', 'age': 18}
(4) Python 3.8+ 新特性:位置仅参数(/)和仅关键字参数(*)
defmodern_func(a,b,/,c,*,d=10):# a, b 必须用位置方式传入# c 可以位置或关键字# d 必须用关键字passmodern_func(1,2,3,d=20)# 正确# modern_func(1, 2, c=3) # 正确# modern_func(a=1, b=2, c=3) # 错误!a,b 不能用关键字

这个特性在库设计中非常有用(如divmod()range()),能强制调用者使用更清晰的方式。

3. 参数传递机制:核心思考点

Python 的参数传递本质是“按对象引用传递”(Pass by Object Reference),或者更准确地说是“按赋值传递”(Pass by Assignment)

Python 中一切都是对象。函数调用时,参数名只是对传入对象的引用(指针),类似赋值操作param = argument

关键区别:可变对象 vs 不可变对象
类型示例修改行为对外部影响
不可变int, float, str, tuple, frozenset创建新对象无影响
可变list, dict, set, 自定义类实例原地修改(in-place)有影响

实验验证

defmodify_list(lst):lst.append(4)# 原地修改可变对象l=[1,2,3]modify_list(l)print(l)# [1, 2, 3, 4] ← 外部被修改!
defmodify_int(x):x=10# 重新绑定局部变量n=5modify_int(n)print(n)# 5 ← 外部不变!

为什么会这样?

  • lst.append(4):操作的是列表对象本身,lst和外部l指向同一个对象。
  • x = 10:重新让局部变量x指向一个新的整数对象 10,外部n仍然指向 5。

这不是传统的“传值”也不是“传引用”,而是传引用但赋值时重新绑定

思考

  • 优点:高效!大对象(几 GB 的 DataFrame)不需要拷贝,直接传递引用。
  • 缺点:容易产生副作用(side effects),尤其在多线程或大型项目中。
  • 设计哲学:Python 相信程序员的责任感(“We are all consenting adults here”),不强制拷贝,但要求你了解对象可变性。

4. 常见陷阱与最佳实践

陷阱1:可变默认参数(最经典的坑!)
defbad_func(a=[]):a.append(1)returnaprint(bad_func())# [1]print(bad_func())# [1, 1]print(bad_func())# [1, 1, 1]

原因:默认参数在函数定义时只计算一次,可变对象会被所有调用共享。

正确写法

defgood_func(a=None):ifaisNone:a=[]# 每次调用新建列表a.append(1)returna
陷阱2:不必要的拷贝
# 坏:大列表每次都拷贝defprocess(data):data=data[:]# 浅拷贝# 好:明确告诉调用者会修改defprocess_inplace(data):data.append("new")# 或返回新对象return[x*2forxindata]

最佳实践建议

  • 修改可变对象时:要么原地修改并返回None,要么返回新对象(函数式风格)。
  • 团队协作:函数名或文档明确说明是否会修改参数(inplace=True风格)。
  • 大型项目:优先使用不可变数据结构(tuplefrozendictpydantic等)或返回新对象。

5. 进阶思考:函数设计的哲学

  1. Python 函数是一等公民:可以赋值、作为参数、作为返回值、放在容器里。
  2. 闭包与作用域(LEGB 规则):函数可以捕获外部变量,形成闭包。
  3. 装饰器:本质是函数包裹函数。
    deftimer(func):defwrapper(*args,**kwargs):importtime start=time.time()result=func(*args,**kwargs)print(f"耗时:{time.time()-start:.4f}s")returnresultreturnwrapper@timerdefslow_func():time.sleep(1)
  4. 函数式编程倾向:鼓励mapfilterlambdafunctools等,减少副作用。

总结

  • 语法:灵活 + 类型提示 + 文档字符串 = 现代 Python 函数。
  • 参数传递按对象引用传递→ 可变对象有副作用,不可变对象安全。
  • 核心思考:Python 把控制权交给程序员,同时要求程序员理解对象模型。

掌握了参数传递机制,你就真正理解了“Pythonic”的精髓:简洁、高效、但需要对对象有敬畏之心

想深入哪个部分(装饰器、生成器、异步函数、类型提示进阶等)?随时告诉我,我可以继续展开!

http://www.jsqmd.com/news/360362/

相关文章:

  • 别再傻傻原价点!COTX茶月山“薅羊毛”攻略,美团狂省指南 - Top品牌推荐
  • 人工智能应用- 语言处理:06.打破语言边界
  • 【高精度气象】气象数据SLA签完总扯皮?2026年签服标准出炉:四个指标锁定百万风险
  • 红包“斤”斤计较,美团“惠”省到底! - Top品牌推荐
  • 【风电光伏功率预测】模型越复杂,储能收益越差?2026年拐点已至:“区间预测+智能触发”正重塑游戏规则
  • HoRain云--详解Native Memory Tracking之追踪区域分析
  • 省钱秘籍大公开!JPG外卖如何让你每单都省下配送费 - Top品牌推荐
  • 零信任架构:为什么现代网络安全不再相信“内部安全”?
  • 回收分期乐购物卡的最佳平台,永辉超市卡快速变现指南 - 团团收购物卡回收
  • 永辉超市购物卡哪里可以回收?分期乐用户必看平台推荐! - 团团收购物卡回收
  • 告别论文焦虑!百考通AI:你身边的本科毕业论文智能搭档
  • 2026年值得关注的阁楼货架制造商推荐 - 2026年企业推荐榜
  • 【java日记】07:日志和git
  • HoRain云--5分钟搞定SpringBoot连接MySQL
  • 京唐港潮汐表查询2026-02-10
  • 【2026-02-06】自己打扫
  • DOS批处理工具:快速提取指定文件到目标位置
  • 开题卡住了?10个AI论文工具深度测评,本科生毕业论文写作必备
  • 【读书笔记】《我战胜了抑郁》
  • Simulink 中飞轮储能 PMSM 永磁同步机与同步机一次调频的探索
  • 智能体是什么,工作流是什么,大模型是什么
  • CH572ADC采集供电电压
  • 浮点数float32
  • 可持久化 Trie
  • SHP数据修复
  • 清华解聘50岁副教授,“非升即走”引热议!
  • 吐血推荐!降AI率软件 千笔 VS speedai,自考党必备神器!
  • 结合这段代码“对象属性变化自动同步到CSV(本地文件)”的核心特性,除了WinForm .NET 4.8界面开发,以下这些场景也非常适配,且能最大化发挥其价值:
  • 必应壁纸图片缓存路径
  • 摆脱论文困扰! 降AI率平台 千笔·降AI率助手 VS 文途AI,MBA专属首选