优秀的编程知识分享平台

网站首页 > 技术文章 正文

Python中定义函数

nanyue 2025-03-12 19:01:17 技术文章 1 ℃

函数的定义与基本使用

在 Python 编程语言中,若要定义一个函数,需借助 def 语句来完成。其语法格式遵循特定的规则,要依次写明函数名、紧跟其后的括号、括号内放置的参数(参数可为空,也可以有多个,多个参数之间用逗号隔开),最后加上冒号 : 。完成上述格式书写后,便要在后续的缩进块中编写函数体,也就是该函数具体要执行的代码逻辑。而函数的返回值,则是通过 return 语句来进行返回操作的。

下面以自定义一个用于求绝对值的函数 my_abs 为例,来详细展示函数定义及使用的过程:

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x

print(my_abs(-99))

99

这里需要特别注意的是,在函数体内部的语句执行过程中,一旦执行到 return 语句,整个函数就会立即执行完毕,并将相应的结果返回给调用者。


此外,还有一种特殊情况值得留意,如果一个函数中没有编写 return 语句,那么在该函数执行完毕后,同样也会返回一个结果,只不过这个结果为 None 。而且,在代码书写习惯上,return None 通常可以简写为 return 。

空函数

有时候,我们可能需要定义一个暂时什么实际操作都不执行的空函数,在 Python 中可以使用 pass 语句来实现。例如:

def nop():
    pass

那这个看起来什么都不做的 pass 语句究竟有什么作用呢?实际上,它常被当作一种占位符来使用。比如在实际编写代码的过程中,当我们还没有想好具体要怎么写某个函数的内部代码时,就可以先放置一个 pass 语句,这样能保证代码整体的语法结构完整,使其可以正常运行起来,避免出现语法错误提示。

而且,pass 语句不仅可以用在函数定义中,还可以应用在其他语句里,比如在条件语句中:

if age >= 18:
    pass

如果上述代码中缺少了 pass 语句,代码在运行时就会出现语法错误,导致程序无法正常执行。

参数检查

在 Python 中调用函数时,如果传入的参数个数不符合函数定义时所要求的个数,Python 解释器会自动帮我们检查出来,并抛出 TypeError 异常。例如:

>>> my_abs(1, 2)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: my_abs() takes 1 positional argument but 2 were given

然而,要是传入的参数类型不正确,Python 解释器就没办法自动帮我们进行检查了。我们可以通过对比自定义的 my_abs 函数和 Python 内置的 abs 函数来看其中的差别:

>>> my_abs('A')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 2, in my_abs
TypeError: unorderable types: str() >= int()
>>> abs('A')
Traceback (most recent call last):
  File "", line 1, in 
TypeError: bad operand type for abs(): 'str'

从上述示例可以看出,当传入了不恰当的参数时,内置函数 abs 能够检查出参数类型错误,而我们自定义的 my_abs 函数由于没有对参数类型进行检查,会导致函数内部的 if 语句执行出错,并且出错信息和 abs 函数的也不一样。由此可见,之前定义的 my_abs 函数在这方面还不够完善。

为了让函数更加健壮,我们可以对 my_abs 的定义进行修改,添加对参数类型的检查功能,使其只允许整数和浮点数类型的参数传入。在 Python 中,数据类型检查可以借助内置函数 isinstance() 来轻松实现,修改后的函数定义如下:

def my_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    if x >= 0:
        return x
    else:
        return -x

经过这样的修改后,如果再传入错误的参数类型,函数就会主动抛出一个相应的错误信息,示例如下:

>>> my_abs('A')
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 3, in my_abs
TypeError: bad operand type

返回多个值

那么,Python 中的函数可以返回多个值吗?答案是肯定的。例如在游戏开发等场景中,常常会遇到根据给定的坐标、位移以及角度等信息,来计算出新坐标的需求。以下是一个简单的示例函数,用于实现这样的功能:

import math
def move(x, y, step, angle=0):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny

在上述代码中,import math 语句的作用是导入 math 包,从而允许后续代码引用 math 包里诸如 sin、cos 等函数。

定义好这个函数后,我们就可以获取它的返回值了,并且获取的方式看起来好像是同时得到了多个值,示例如下:

>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print(x, y)
151.96152422706632 70.0

但实际上,这只是一种语法上带来的便捷 “假象”。在 Python 中,函数返回的本质上仍然是单一值。我们可以通过下面的方式来验证:

>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)

原来,函数返回的是一个元组(tuple)类型的值呀!只不过,在 Python 的语法规则里,当返回一个元组时,可以省略括号,而且多个变量能够同时接收一个元组,并按照位置依次赋给对应的值,所以从代码书写和使用的角度来看,就好像函数可以返回多个值一样,这样写起来更加方便、简洁,也符合很多实际应用场景的逻辑需求。

最近发表
标签列表