Python自定义函数def详解:语法、参数类型与实战避坑指南
本文深入解析Python中自定义函数的定义与调用。详细讲解def关键字的语法规范、缩进要求及常见错误。重点剖析位置参数、关键字参数、默认参数与必选参数的区别,并通过实例演示可变参数(*args)和可变关键字参数(**kwargs)的高级用法,帮助开发者规范命名、正确传参并避免常见报错。
Python自定义函数基础与定义语法
大家好,今天我们来深入探讨Python中一个核心且实用的概念:自定义函数。
在编程世界中,自定义函数是提升代码复用率和模块化程度的关键要素。
定义函数的核心关键字是def。
要创建自定义函数,必须使用def关键字。
具体的使用方法如下所示。
def 函数名(参数1,参数2,参数…):
函数体(语句块)
return [返回值]
在编写函数时,有几个关键注意事项需要严格遵守。
- 函数名的命名需遵循标识符规则,通常由小写字母、数字和下划线组成。
- def是Python的关键字(define的缩写),不可修改或重命名。
- 函数名后必须紧跟英文状态下的圆括号,括号内是否包含参数视具体需求而定。
- 括号结束后,冒号是必须存在的语法符号,不可遗漏。
- 函数体内部的代码块必须保持缩进,推荐使用4个空格作为标准缩进单位。
接下来我们通过具体案例进行分析。
def hello(): #自定义hello()函数
print('hello world !')
hello() # 调用函数
hello world ! # 输出结果
上述代码定义了一个输出“hello world !”的函数,只需调用hello()即可执行函数体内的逻辑。
让我们通过一个稍复杂的例子来练习,进一步理解函数的工作机制。
def add(x, y): # 新建add()
return x+y
add(3, 7) # 调用add()
运行ing
输出none
运行后出现报错,这究竟是代码逻辑错误,还是调用方式有误?
这就像建房子没留门,如果没有正确的调用方式,函数无法输出结果。
print(add(3, 7))
print(add('hello ', 'world'))
#运行结果
10
hello world
为了深入理解,我们进行一个“作死”挑战。
既然每次调用函数都需要加括号,那么不加括号直接写函数名会返回什么?
这是否意味着我们只是获取了函数的引用,而未真正执行它?
让我们实际运行代码来验证这一猜测。
print(hello) # 调用hello
print(add) # 调用add
结果:
<function hello at 0x0000020213737048>
<function add at 0x0000020213737678>
结果显示,直接打印函数名会返回该函数的内存地址,而非函数的执行结果,说明函数并未被实际调用。
- 这里有一个重要的温馨提示。
- 调用函数时,务必在函数名后加上圆括号,否则无法执行函数体。
函数参数类型详解
函数的参数传递是自定义函数中的核心部分。
自定义函数的参数主要可以分为以下几大类。
- 位置传参是最基础的参数传递方式。
- 关键字传参提供了更灵活的参数指定方式。
- 必选参数是函数调用时必须提供的参数。
- 默认参数允许在函数定义时预设值。
- 可变参数用于处理数量不定的输入。
- ……
理解形参与实参的区别是掌握参数传递的基础。
从通俗角度理解:形参是函数定义中的参数名称,它作为一个未赋值的变量名,主要起占位符作用,不直接参与运算。
实参则是实际传递给函数的值,这些值已被赋值给对应的变量名,并参与函数内部的运算。
以上解释基于个人理解,旨在提供直观认知,如有学术上的不同定义,欢迎指正。
位置参数与关键字参数
接下来详细介绍位置参数。
位置参数是指按照参数定义的顺序进行传递和匹配。

参数在定义时的位置决定了其对应的值,若多个参数时位置传参错误,可能导致函数报错甚至程序崩溃。
关键字参数虽然书写稍显繁琐,但能有效解决因位置错误导致的报错问题。
通过指定参数名称来赋值,可以确保参数与值的正确对应,提高代码稳定性。

利用关键字参数可以明确指定参数值,有效避免歧义。
例如,print()函数中除了输出内容外,还有end参数,该参数默认值为换行符“\n”。
for i in range(10):
print(i)
当使用默认换行符时,输出结果如下: 0 1 2 3 4 5 6 7 8 9
for i in range(10):
print(i,end= ' ')
若通过关键字参数修改end为空格,输出结果变为: 0 1 2 3 4 5 6 7 8 9
默认参数与必选参数
默认参数允许为函数设置预设值。
在许多场景中,并非所有参数都需要用户自定义,因此可以设置默认值。需要时用户可覆盖默认值,无需时则使用预设值。例如print()中的end参数默认值为“\n”。
def add(x=0, y=0):
return x+y
print(add())
结果:
0
必选参数是指调用函数时必须提供的参数。
与默认参数相对,必选参数没有预设值,若调用时未提供必选参数,将引发报错并导致程序中断。
def add(x, y): # 新建add()
return x+y
print(add())
Traceback (most recent call last):
print(add())
TypeError: add() missing 2 required positional arguments: 'x' and 'y'
上述错误正是由于缺少x和y参数所致。因此,在使用函数及定义自定义函数时,必须明确必选参数的设置。
可变参数与可变关键字参数
可变参数允许函数接收任意数量的参数。
虽然“可变参数”听起来复杂,但实际使用非常直观。例如,如何编写一个能处理多个数字相加的函数?直接定义固定数量的参数似乎不够灵活。
def add(x, y): # 新建add()
return x+y
如果传入3个值,固定为2个参数的函数会报错;若改为3个参数,又限制了灵活性。
def add(x, y, z): # 新建add()
return x+y+z
问题在于:如果只传2个值,会报错缺少参数;如果传4个或更多,又会报错参数过多。这是否意味着Python的设计有缺陷?
并非如此,Python提供了优雅的解决方案。
def 函数名(参数1,参数2,参数…,*可变参数):
函数体(语句块)
返回值
这增加了一些实用的编程技巧。
def add(x, *y):
for num in y:
x += num
return x
print(add(2,3,4))
结果
9
注意:*y生成的结果是一个元组(tuple),需要遍历该元组才能获取每个元素的值。
可变关键字参数用于处理字典形式的额外参数。
当需要处理多个关键字参数或字典导入,而单个*参数无法满足时,可以使用双星号**。
def personinfo(name, age, **message):
print(f'name:{name},age:{age},{message}')
personinfo('张三', 23, message = {'city':'北京', 'heigh': 180})
结果:
name:张三,age:23,{'message': {'city': '北京', 'heigh': 180}}
此时获取的结果是一个字典,如示例所示,最终形成一个嵌套的字典结构。
关于参数书写的顺序要求: ① 必选参数必须放在最前面。 ② 默认参数应写在必选参数之后。 ③ 关键字参数(此处指普通关键字传参)紧随其后。 ④ 可变参数(*函数名)位于关键字参数之后。 ⑤ 可变关键字参数(**函数名)放在最后。
注意:按照此顺序排列,若某类参数不存在,可省略不写。
def a(x , y=0, *z, **i):
print(f'x:{x};y:{y};z:{z};i')
以上仅为示例,命名方式不符合规范,请勿直接借鉴。若不按上述顺序书写,可能导致各种异常行为。
至此,关于Python自定义函数def的应用详解已介绍完毕。如需了解更多相关内容,请搜索本站过往文章或继续浏览后续内容,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









