函数定义、调用、参数分类(位置/关键字/默认参数)避坑详解
2026/6/14 22:52:55 网站建设 项目流程

博客导语

函数是代码复用的核心,90%新手入门都会踩默认参数、参数混用顺序的坑。本篇从零讲解函数底层执行逻辑,区分四类基础参数的传参规则、混用顺序、生产报错案例,解决日常开发80%参数传参异常。


一、函数基础:定义与调用底层逻辑

1.1 标准语法

# 函数定义 def 函数名(参数列表): """函数文档注释""" 函数体代码 # 函数调用 函数名(传入参数)

1.2 底层执行流程

Python解释器读取def语句时,不会执行内部代码,只会在内存中创建函数对象、分配内存地址;只有调用函数时,才会开辟独立函数栈帧,执行内部代码,调用结束后销毁栈帧。这也是为什么函数必须先定义、后调用,颠倒顺序直接抛出NameError。


二、三大基础参数全解析+易错点

2.1 位置参数(必选参数)

按照参数定义顺序一一对应传参,数量、顺序必须完全匹配,多传少传都会直接报错。是开发最常用的参数类型。

def user_info(name,age): print(f"姓名:{name},年龄:{age}") # 正确:位置一一对应 user_info("张三",20) # 错误:参数数量不匹配 user_info("李四")

2.2 关键字参数

通过形参名=实参传参,无需遵循定义顺序,适合参数数量多、容易记混顺序的场景。硬性规则:关键字参数必须放在位置参数之后,不能颠倒

user_info(age=22,name="王五") # 纯关键字,顺序随意 user_info("赵六",age=25) # 位置+关键字混用,合法 # user_info(age=25,"赵六") 报错:位置参数不能放关键字参数后

2.3 默认参数

定义时直接给形参赋值,调用时不传参自动使用默认值。硬核避坑:默认参数必须放在非默认参数后方

def user_info(name,age=18): print(f"姓名:{name},年龄:{age}") user_info("小明") # 不传age,默认18 user_info("小红",20) # 手动覆盖默认值

三、高频致命坑:可变类型默认参数

全网最高频面试坑:默认参数为列表、字典等可变对象时,只会在函数定义时创建一次,后续调用会复用同一块内存,导致数据累加。

# 错误写法 def add_num(num_list=[]): num_list.append(1) print(num_list) add_num() # [1] add_num() # [1,1] 不符合预期 # 正确写法:默认值用None,内部初始化可变对象 def add_num(num_list=None): if num_list is None: num_list = [] num_list.append(1) print(num_list)

四、参数混用强制顺序(死记)

位置参数 > 默认参数 > 关键字参数,违反顺序百分百语法报错

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询