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

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

创建函数

在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 + 10
print(x(5))

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

示例

# 将参数a与参数b相乘并返回结果:
x = lambda a, b : a * b
print(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,或者扫描下方二维码,关注公众号,即可获取最新文章。

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

Python 函数:定义、调用、参数、递归和 Lambda 函数详解的更多相关文章

  1. 【转】 深入main函数中的参数argc,argv的使用详解

    C/C++语言中的main函数,经常带有参数argc,argv,如下: 复制代码 代码如下: int main(int argc, char** argv) 这两个参数的作用是什么呢?argc 是指命 ...

  2. python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程

    python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...

  3. 空函数有参函数调用参数的注意事项Swift 1.1语言

    空函数有参函数调用参数的注意事项Swift 1.1语言 7.2.3  空函数 空函数有参函数调用参数的注意事项Swift 1.1语言空函数是函数中最简单的形式.在空函数中,函数只有一个空壳,里面是没有 ...

  4. Python调用C/C++动态链接库的方法详解

    Python调用C/C++动态链接库的方法详解 投稿:shichen2014 这篇文章主要介绍了Python调用C/C++动态链接库的方法,需要的朋友可以参考下 本文以实例讲解了Python调用C/C ...

  5. Js文件函数中调用另一个Js文件函数的方法

    在项目中Js文件需要完成某一功能,但这一功能的大部分代码在另外一个Js文件已经完成,只需要调用这个文件实现功能.那么如何调用:一个Js文件函数中调用另一个Js文件函数的方法? (直接代码说明) 示例d ...

  6. Java 8 Lambda 表达式详解

    一.Java 8 Lambda 表达式了解 参考:Java 8 Lambda 表达式 | 菜鸟教程 1.1 介绍: Lambda 表达式,也可称为闭包,是推动 Java 8 发布的最重要新特性. La ...

  7. JAVA8之lambda表达式详解

    原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda ...

  8. Java8 Lambda表达式详解手册及实例

    先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...

  9. c++排序二叉树的出现的私有函数讨论,以及二叉树的删除操作详解

    c++排序二叉树的出现的私有函数讨论, 以及二叉树的删除操作详解 标签(空格分隔): c++ 前言 我在c++学习的过程中, 最近打了一个排序二叉树的题目,题目中出现了私有函数成员,当时没有理解清楚这 ...

  10. Python全栈开发之8、装饰器详解

    一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了.转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5486253.html 一.装饰器 装饰器可以使函数执 ...

随机推荐

  1. 【生成对抗网络学习 其二】GAN(keras实现)代码阅读笔记

    想来想去还是记录一下吧,主要是怕以后时间长忘了 好记性不如烂笔头 代码来自eriklindernoren的开源GAN实现:https://github.com/eriklindernoren/Kera ...

  2. 记一次WPF集成SemanticKernel+OneAPI+讯飞星火认知大模型实践

    开启OneAPI服务 OneAPI介绍 OpenAI 接口管理 & 分发系统,支持 Azure.Anthropic Claude.Google PaLM 2 & Gemini.智谱 C ...

  3. 一分钟带你了解mySql执行SQL的内部原理

    1.把MySQL当个黑盒子一样执行SQL语句 我们知道执行了insert语句之后,在表里会多出来一条数据:执行了update语句之后,会对表里的数据进行更改:执行了delete语句之后,会把表里的一条 ...

  4. 基于图数据库 NebulaGraph 实现的欺诈检测方案及代码示例

    本文是一个基于 NebulaGraph 图算法.图数据库.机器学习.GNN 的 Fraud Detection 方法综述.在阅读本文了解欺诈检测的基本实现方法之余,也可以在我给大家准备的 Playgr ...

  5. NebulaGraph v3.3.0 发布:支持子图过滤、和大量性能优化

    NebulaGraph 3.3.0 支持了 GET SUBGRAPH 和 GetNeighbors 的点过滤.引入了大量性能优化,同时,开始对无 tag 顶点的支持默认关闭. 优化 优化了 k-hop ...

  6. [manjaro linux] 安装完成之后的配置工作,以及常用软件的安装

    emmm 很久没有更新了,绝对不是丢掉了博客帐号,有时间还是要好好装饰以下博客的... https://zhuanlan.zhihu.com/p/114296129 看到很多过程 sudo pacma ...

  7. Redis基础_五大数据类型和常用命令

    ## 1. Redis基本介绍 1.1 传统数据存储出现的问题 海量用户 高并发 罪魁祸首--关系型数据库: 性能瓶颈:磁盘IO性能低下 扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群 解决思路 ...

  8. XAF Blazor ListView 布局样式

    前言 XAFBlazor虽然可以适应PC端及移动端,但从它的界面可以看出,它明显是移动优先的(Mobile First).这样的界面在PC端有时会感觉不是很方便(特别对于数据密集的系统来说),即将发布 ...

  9. class cl表示 汇聚 集合 ss表示 阴性 这里表示抽象

    class cl表示 汇聚 集合 ss表示 阴性 这里表示抽象

  10. iBatis查询API

    "一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信 ...