Python自定义函数def详解:语法、参数类型与实战避坑指南

半杯拿铁
半杯拿铁
发布时间:2026-10-14| 3人浏览过
原创

本文深入解析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的应用详解已介绍完毕。如需了解更多相关内容,请搜索本站过往文章或继续浏览后续内容,感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。