函数是带名字的代码块,用于完成具体的工作。要执行函数定义的特定任务,可调用 该函数。需要在程序中多次执行同一项任务时,无须反复编写完成该任务的代码,只需要调用执行该任务的函数,让Python运行其中的代码即可。通过使用函数,程序编写、阅读、测试和修复起来都更加容易。
定义函数
def function(parameter):
"""docstring""" # 文档字符串
function_body # 函数体
文档字符串
DocStrings 文档字符串是一个重要工具,用于解释文档程序,使程序文档更加简单易懂。
我们可以在函数体的第一行使用一对三个单引号 ”’ 或者一对三个双引号 “”” 来定义文档字符串。
你可以使用 __doc__(注意双下划线)调用函数中的文档字符串属性。
DocStrings 文档字符串使用惯例:它的首行简述函数功能,第二行空行,第三行为函数的具体描述。
函数调用- – – 传递实参
函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多:可使用位置实参 ,这要求实参的顺序与形参的顺序相同;也可使用关键字实参 ,其中每个实参都由变量名和值组成;函数的参数可以是任何数据类型的数据。
位置实参
定义:基于形参的位置,向函数传递参数,实参顺序与形参顺序必须完全相同
关键字实参
定义:关键字实参 是传递给函数的名称值对。因为直接在实参中将名称和值关联起来,所以向函数传递实参时不会混淆。关键字实参让你无须考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。
默认值
编写函数时,可以给每个形参指定默认值。
在调用函数中给形参提供了实参时,Python将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参。使用默认值可简化函数调用,还可清楚地指出函数的典型用法。
使用默认值时,必须先在形参列表中列出没有默认值的形参,再列出有默认值的实参。这让Python依然能够正确地解读位置实参。
传递任意数量的实参
有时候,预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参,如下:
def function(*args):
"""docstring"""
function_body
形参名*args中的星号让Python创建一个名为args的空元组,并将收到的所有值都封装到这个元组中。
如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
此外,Python可将函数编写成能够接受任意数量的键值对
def function(**args)
"""docstring"""
function_body
# 函数调用
function(key_1=value_1, key_2=value_2,...)
形参名**args中的双星号让Python创建一个名为args的空字典,并将收到的所有键值对都封装到这个字典中。
“传递值&传递引用”
不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响,可以通过重新创建一个引用对象,来避免修改函数内部列表的同时影响到外部的对象。
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
Lambda函数
Lambda函数是一种匿名函数(指一类无需定义标识符(函数名)的函数或子程序),也就是没有名字的函数。它通常被用来作为参数传递给其他函数,或者在需要一个简短的函数时使用。Lambda函数通常只有一行代码,并且可以使用简洁的语法来定义。
我们可以将Lambda函数看作是一个可执行的表达式,它接受一些输入参数并返回一个结果。Lambda函数可以接受任意数量的参数,但是只能返回一个结果。
基本语法
Lambda函数的基本语法如下:
lambda parameters: expression
- lambda:关键字
- parameters:形式参数,可以有多个,使用”,”分隔
- expression:表达式,描述了函数的返回值,可以使用控制流语句、条件语句等
- lambda返回值是一个函数的地址,也就是函数对象
下面给出一个简单示例:
# 定义lambda函数,计算两个数的和,并将其赋值给一个变量
sumTest = lambda a,b:a+b
# 函数调用
print(sumTest(2,3)) # 输出值:5