写点什么

Python 函数:定义、调用、参数、递归和 Lambda 函数详解

作者:小万哥
  • 2023-10-22
    广东
  • 本文字数:2538 字

    阅读完需:约 8 分钟

Python 函数:定义、调用、参数、递归和 Lambda 函数详解

函数是一段代码块,只有在调用时才会运行。您可以将数据(称为参数)传递给函数。


函数可以返回数据作为结果。

创建函数

在 Python 中,使用 def 关键字定义函数:


示例


def my_function():  print("Hello from a function")
复制代码

调用函数

要调用函数,请使用函数名称后跟括号:


示例


def my_function():  print("Hello from a function")
my_function()
复制代码

参数

可以将信息作为参数传递给函数。参数在函数名称后面的括号内指定。您可以添加任意数量的参数,只需用逗号分隔即可。以下示例具有一个参数(fname)的函数。调用函数时,我们传递一个名字,该名字在函数内用于打印全名:


示例


def my_function(fname):  print(fname + " Refsnes")
my_function("Emil")my_function("Tobias")my_function("Linus")
复制代码


参数通常在 Python 文档中缩写为 args。

参数或参数?

术语参数和参数可以用于相同的事物:传递给函数的信息。


从函数的角度来看:


  • 参数是函数定义中括号内列出的变量。

  • 参数是在调用函数时发送到函数的值。

参数数量

默认情况下,必须使用正确数量的参数来调用函数。这意味着,如果函数需要 2 个参数,您必须使用 2 个参数来调用函数,不能多,也不能少。


示例


这个函数需要 2 个参数,得到了 2 个参数:


def my_function(fname, lname):  print(fname + " " + lname)
my_function("Emil", "Refsnes")
复制代码


如果尝试使用 1 个或 3 个参数调用函数,将会导致错误:


示例


这个函数需要 2 个参数,但只得到 1 个:


def my_function(fname, lname):  print(fname + " " + lname)
my_function("Emil")
复制代码


任意数量的参数,args。如果不知道将传递多少个参数到函数中,可以在函数定义中的参数名前添加一个。这样,函数将接收到一个参数元组,并可以相应地访问项目:


示例,如果参数数量未知,请在参数名称前添加*:


def my_function(*kids):  print("The youngest child is " + kids[2])
my_function("Emil", "Tobias", "Linus")
复制代码


在 Python 文档中,任意参数通常被缩写为 args。

关键字参数

还可以使用 key = value 语法发送参数。这样,参数的顺序就不重要了。


示例


def my_function(child3, child2, child1):  print("The youngest child is " + child3)
my_function(child1 = "Emil", child2 = "Tobias", child3 = "Linus")
复制代码


短语关键字参数通常在 Python 文档中缩写为 kwargs。任意关键字参数,kwargs。如果不知道将传递多少个关键字参数到函数中,可以在函数定义中的参数名称前添加两个星号:**。这样,函数将接收到一个参数字典,并可以相应地访问项目:


示例,如果不知道关键字参数的数量,请在参数名称前添加两个星号:


def my_function(**kid):  print("His last name is " + kid["lname"])
my_function(fname = "Tobias", lname = "Refsnes")
复制代码


在 Python 文档中,任意关键字参数通常被缩写为**kwargs。

默认参数值

以下示例显示了如何使用默认参数值。


如果我们在没有参数的情况下调用函数,它将使用默认值:


示例


def my_function(country = "Norway"):  print("I am from " + country)
my_function("Sweden")my_function("India")my_function()my_function("Brazil")
复制代码

将列表作为参数传递

您可以将任何数据类型的参数发送到函数(字符串、数字、列表、字典等),并且在函数内部它将被视为相同的数据类型。例如,如果将列表作为参数发送,那么当它到达函数时,它仍然是一个列表:


示例


def my_function(food):  for x in food:    print(x)
fruits = ["apple", "banana", "cherry"]
my_function(fruits)
复制代码

返回值

要让函数返回一个值,请使用 return 语句:


示例


def my_function(x):  return 5 * x
print(my_function(3))print(my_function(5))print(my_function(9))
复制代码

pass 语句

函数定义不能空着,但是如果由于某种原因,您的函数定义没有内容,可以加入 pass 语句以避免出错。


示例


def myfunction():  pass
复制代码

递归

Python 还接受函数递归,这意味着可以调用自身定义的函数。递归是一个常见的数学和编程概念。它意味着一个函数调用自己。这具有一个好处,即您可以循环遍历数据以达到一个结果。


开发人员在使用递归时应非常小心,因为很容易陷入编写永不终止的函数或使用大量内存或处理器功率的函数。然而,正确编写时,递归可以是一种非常高效和数学优雅的编程方法。


在此示例中,tri_recursion()是我们定义的一个函数,用于调用自己("recurse")。我们使用 k 变量作为数据,每次递归时减小(-1)。当条件不大于 0 时(即为 0)递归结束。


对于新开发人员来说,可能需要一些时间来弄清楚这是如何工作的,最好的方法是通过测试和修改来找出。


示例,递归示例


def tri_recursion(k):  if(k > 0):    result = k + tri_recursion(k - 1)    print(result)  else:    result = 0  return result
print("\n\n递归示例结果")tri_recursion(6)
复制代码

Python Lambda 函数

Lambda 函数是一种小型的匿名函数。Lambda 函数可以接受任意数量的参数,但只能有一个表达式。


语法


lambda 参数 : 表达式
复制代码


该表达式将被执行,并返回结果。


示例


# 将10添加到参数a,并返回结果:x = lambda a : a + 10print(x(5))
复制代码


Lambda 函数可以接受任意数量的参数:


示例


# 将参数a与参数b相乘并返回结果:x = lambda a, b : a * bprint(x(5, 6))
复制代码

为什么使用 Lambda 函数?

Lambda 的强大之处在于,当您将它们用作另一个函数中的匿名函数时,它们表现得更好。假设您有一个函数定义,该函数接受一个参数,该参数将与一个未知的数字相乘:


def myfunc(n):  return lambda a : a * n
复制代码


使用该函数定义创建一个函数,该函数始终将发送的数字加倍:


示例


def myfunc(n):  return lambda a : a * n
mydoubler = myfunc(2)
print(mydoubler(11))
复制代码


或者,使用相同的函数定义创建一个函数,该函数始终将发送的数字乘以 3:


示例


def myfunc(n):  return lambda a : a * n
mytripler = myfunc(3)
print(mytripler(11))
复制代码


或者,在同一程序中使用相同的函数定义创建两个函数:


示例


def myfunc(n):  return lambda a : a * n
mydoubler = myfunc(2)mytripler = myfunc(3)
print(mydoubler(11))print(mytripler(11))
复制代码

最后

为了方便其他设备和平台的小伙伴观看往期文章:公众号搜索Let us Coding,或者扫描下方二维码,关注公众号,即可获取最新文章。


看完如果觉得有帮助,欢迎点赞、收藏关注



发布于: 刚刚阅读数: 5
用户头像

小万哥

关注

代码如人生 2023-02-09 加入

编程爱好者

评论

发布
暂无评论
Python 函数:定义、调用、参数、递归和 Lambda 函数详解_Python_小万哥_InfoQ写作社区