菜鸟学飞自学Python(二)函数

(仅个人学习摘录)

函数定义

def f_name(p1,...):

函数体

例:绝对值函数


函数体内部的语句在执行时,一但执行到 return 时,函数就执行完毕,并将结果返回。如果没有 return 语句,函数执行完毕后也会返回结果,只是结果是 None。

return None 可以简写成 return

  如果你已经把 my_abs() 的函数定义保存为 abstest.py 文件,可以在该文件的当前目录下启动 Python 解释器,用 from abstest import my_abs 来导入 my_abs() 函数,注意 abstest 是文件名(不含 .py 扩展名)

 

空函数

如果想定义一个什么事也不做的空函数,可以用 pass 语句:


pass 相当于占位符,使代码可以运行

pass 还可以用在其他语句里:


缺少 pass,代码运行就会有语法错误。

 

参数检查

调用函数,当参数个数不对,Python 解释器会自动检查出来,并抛出 TypeError:

但是如果参数类型不对,Python 解释器就无法帮我们检查。

  当传入了不恰当的参数时,内置函数 abs 会检查出参数错误,而我们定义的 my_abs 没有参数检查,会导致 if 语句出错,所以这个函数定义不够完善。

数据类型检查可以用内置函数 isinstance() 实现:


 

返回多个值


import math 语句表示导入 math 包,并允许后续代码引用 math 包里的 sin、cos 等函数。

我们就可以同时获得返回值:


实际上 Python 函数返回的仍然是单一值:


  函数的返回值是一个 tuple。但是在语法上,返回一个 tuple 可以省略括号,多个变量可以同时接受一个 tuple,按位置赋给对应的值,所以,Python 的函数返回多值其实就是返回一个 tuple,但写起来更方便。

 

函数的参数

  定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。Python 函数定义,除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数。

位置参数

定义函数 power(x),用来计算 x2,功能简单,不能扩展

为了更加灵活具有扩展性:

定义函数 power(x,n),用来计算 xn


函数 power(x,n) 有两个参数:x 和 n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数 x 和 n。

 

默认参数

新的 power(x,n) 函数定义没有问题,但是旧的代码调用失败了,因为新的函数增加了参数,旧的函数缺少参数无法正常调用。

  这时,可以利用默认参数解决问题,如例,把第二个参数 n 的默认值设定为 2:


这时调用 power(5) 时,相当于调用 power(5,2):


默认参数可以简化函数的调用。设置默认参数需要注意:

1、必选参数在前,默认参数在后,否则 Python 的解释器会报错;

2、当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

  有多个默认参数时,可以按顺序提供默认参数。也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。

  默认参数必须指向不变对象!

 

可变参数

  在 Python 函数中,可以定义可变参数。可变参数就是传入的参数个数是可变的。

如下面的例子:计算 a2 + b2 + c2 + ...。

  由于参数个数不确定,我们可以把 a, b, c... 作为一个 list 或 tuple 传进来,这样,函数可以定义如下:


在调用时,需要组装出一个 list 或 tuple:

如果利用可变参数,调用函数的方式可以简化:


把函数的参数改成可变参数:


定义可变参数和定义一个 list 或 tuple 参数相比,仅仅在参数前面加了一个 * 号。在函数内部,参数 numbers 接收到的是一个 tuple。在调用时,可以传入任意个参数,包括 0 个参数:


若想把一个 list 或者 tuple 的元素作为参数传入函数中,只需在 list 或 tuple 前面加一个 * 号即可:


 

关键字参数

  关键字参数允许传入 0 个或者任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个 dict。示例:


函数 person 除了必选参数 name 和 age 外,还接受关键字参数 kw。在调用该函数时,可以只传入必选参数:


还可以传入任意个数的关键字参数:


关键字参数可以扩展函数的功能。

和可变参数类似,可以先组装一个 dict,然后把该 dict 转换为关键字参数传进去:


**extra 表示把 extra 这个 dict 的所有 key-value 用关键字参数传入到函数的 **kw 参数,kw 将获得一个 dict,注意 kw 获得的 dict 是 extra 的一份拷贝,对 kw 的改动不会影响到函数外的 extra。

 

命名关键字参数

  对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过 kw 检查。

  如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接受 city 和 job 作为关键字参数。


和关键字参数 **kw 不同,命名关键字参数需要一个特殊分隔符 * ,* 后面的参数被视为命名关键字参数。

调用方式如下:


  命名关键字参数必须传入参数名,和位置参数不同,如果没有传入参数名,调用将报错。

命名关键字参数可以有缺省值,从而简化调用:


由于命名关键字参数 city 具有默认值,调用时,可以不传入 city 参数:


注意:* 不是参数,二是特殊分隔符。

 

参数组合

  在 Python 中定义函数,可以用必选参数、默认参数、可变参数、关键字参数、命名关键字参数。这 5 种参数都可以组合使用,除了可变参数无法和命名关键字参数混合。参数定义的顺序必须是:必选参数、默认参数、可变参数/命名关键字参数、关键字参数。

 

小结

  默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

  注意定义可变参数和关键字参数的语法:

*args 是可变参数,args 接收的是一个 tuple;

**kw 是关键字参数,kw 接收的是一个 dict。

 

调用函数时如何传入可变参数和关键字参数的语法:

  可变参数既可以直接传入:func(1,2,3),又可以先组装 list 或 tuple,再通过 *args 传入:func(*(1,2,3));

  关键字参数既可以直接传入:func(a=1,b=2),又可以先组装 dict,再通过 **kw 传入:func(**{'a' : 1, 'b' : 2})。

使用 *args 和 **kw 是 Python 的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。

  命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。

  定义命名的关键字参数不要忘了写分隔符 *,否则定义的将是位置参数。

posted @ 2020-07-19 16:48  我脑子不好  阅读(242)  评论(0编辑  收藏  举报