一些好的东西,总是可以被加以提炼,再重复利用,以提高工作效率。函数就是这样一个工具。
python函数的定义与调用
python中,通过def关键字可以定义一个函数。如下:
函数定义
上面的demo展示了一个函数的常规定义方法。通过def引导,给一个标识符,后面加括号,括号里是若干个参数,也可以没有。在函数体中,就可以直接使用参数。
函数定义好后,可以直接通过标识符对函数进行调用,调用时,可以传入适当的参数。如下:
函数定义
python函数的参数
函数,可以有0或若干个参数。参数的本质就是变量。只不过,这个变量的赋值是在函数调用时,由函数的调用方完成的。
有参函数的写法有若干种,不同的写法,以满足调用方在调用时的多样性。我们用一个稍微复杂的函数来说明这个问题。如下:
求和1
上面的demo里,get_sum函数包含两个参数a,b,在调用时,按照顺序传入a和b。
有没有方式可以先写b后写a呢?有。如下:
求和2
上面这种函数调用时,传参的方式称之为关键字参数。
有时候,我们可能希望限定调用方在调用时传参的方式,比如说某些参数必须按照位置传参,某些必须按照关键字传参。可使用 / 或 * 来帮助。/前面的都必须按位置传,*后面的都必须按照关键字传。如下:
限定传参方式
有些同学可能会有疑惑:如果参数前面是*号,后面是/,该如何传参呢?如下:
前面是 * 后面是 /
事实上,这种形式,在python中是不允许的。会报SyntaxError,语法错误。有使用 * 或 / 来限定调用方的传参方式时,有以下几条规则:
1. 最多出现一个 * 和 一个 /。
2. * 号不能出现在最后一个位置,/ 不能出现在最开始的位置。
3. 如同时有 / 和 * 时,/ 必须位于 * 的前面。
但是下面几形式都是错误的。如重复传参,少参,多参等。
错误的调用传参
函数如果在调用时,给出了参数的默认值,则可不传,称之为默认参数。如下:
默认参数
有时候,我们可以还想要计算n个数的和,n是无法确定的,由调用方才能决定。称之为变长参数或不定长参数。如下:
变长参数
上面的demo展示了,可以用星号加上标识符的形式,定义一个变长参数。参数传入函数后,会形成一个元组的形式。可以通过for遍历的方式来处理他们。
变长参数的标识也可以用两个星号来作为前缀。这种形式下,参数传入函数后,会就会形成一个字典。如下:
双星号变长参数
python匿名函数
当函数体很短小,一条语句就可以描述时,可以lambda的形式来创建一个匿名函数,如下:
lambda匿名函数
匿名函数的优势在于,在调用式,不需要占用栈内存空间,效率较高。但是,它仅仅适用于逻辑简单的短小的函数。