news 2026/10/28 2:12:13

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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风格)。
  • 大型项目:优先使用不可变数据结构(tuple、frozendict、pydantic等)或返回新对象。

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. 函数式编程倾向:鼓励map、filter、lambda、functools等,减少副作用。

总结

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

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 21:53:19

fedora桌面安装virt-manager

在 Fedora 上安装和配置 Virt-Manager(配合 KVM 和 QEMU)是一个非常流畅的过程,因为 Fedora 对虚拟化技术的支持通常是最新的。 以下是完整的安装与配置步骤: 1. 检查硬件虚拟化支持在开始安装之前,首先确认你的 CPU 开启了虚拟化支持(Intel …

作者头像 李华
网站建设 2026/10/26 21:53:18

开题卡住了?10个AI论文工具深度测评,本科生毕业论文写作必备

对于高校师生、研究人员等学术人群而言,写作拖延、文献查找耗时长、AIGC内容检测无门等痛点,直接影响科研进度与成果质量。随着AI技术在学术领域的广泛应用,越来越多的论文写作工具涌现,但如何选择真正适合自己需求的产品成为一大…

作者头像 李华
网站建设 2026/10/26 21:53:18

百考通AI:破解程序员“进阶”与“面试”的双重困境

当你为了弄懂一个晦涩的技术概念而反复查阅资料,为了准备一场关键的技术面试而海量刷题却不得要领,为了在项目中应用新技术却卡在环境配置和底层原理时,你需要的可能不是又一次熬夜苦战,而是一个能精准理解你技术上下文并提供针对…

作者头像 李华
网站建设 2026/10/27 18:33:21

对比一圈后!风靡全网的AI论文工具 —— 千笔·专业论文写作工具

你是否曾为论文选题发愁?是否在深夜面对空白文档无从下笔?是否反复修改却仍不满意表达效果?论文写作的每一步都像一场与时间的赛跑,而你却总被卡在某个关键节点。别再让这些困难拖慢你的节奏,现在,是时候尝…

作者头像 李华
网站建设 2026/10/26 17:14:21

摆脱论文困扰! 降AI率平台 千笔·降AI率助手 VS 文途AI,MBA专属首选

在AI技术迅速发展的今天,越来越多的MBA学生开始借助AI工具辅助论文写作,以提升效率和内容质量。然而,随着学术审查标准的不断提高,AI生成内容的痕迹越来越容易被识别,论文中的“AI率”问题也逐渐成为困扰学生的重大难题…

作者头像 李华
网站建设 2026/10/26 9:11:17

Zen Browser v1.18.4b 丨开源跨平台浏览器

Zen Browser v1.18.4b 是基于 Gecko 内核打造的开源跨平台浏览器,该浏览器主打广告与跟踪器智能拦截,同时兼顾极致流畅的网页浏览体验,本次 v1.18.4b 新版本完成了多项功能问题修复与使用体验优化,为用户打造更高效、更稳定的网页…

作者头像 李华