函数
1、创建函数
1.1、定义函数
- 定义函数
def my_abs(x):
- 定义一个什么都不做的空函数,可以使用pass语句:
def nop():
pass
pass可以用来做占位符。
1.2、参数检查
- 若参数个数不对,会跑出TypeError错误。
- 数据类型检查可以使用内置函数isinstance()实现:
def my_abs(x):
if not isinstance(x, (int, float)): # 检测若不是int和float类型,则抛出错误
raise TypeError('Bad operand type')
if x >= 0:
return x
else:
return -x
1.3、返回多个值
- 函数可以返回多个值,如:
import math
def move(x, y, step, angle = 0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
实际上,返回值是一个tuple,语法上tuple可以省略括号
1.4、参数说明
- 函数的默认参数必须为不变对象,不可以为list。
- 可变参数(表示传入的参数个数是可变的),即在参数之前添加*,此时,参数接收到的是一个tuple。迪奥哟偶那个此函数时,可以传入任意个参数,包括0个参数。
- 关键字参数:允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个dict。关键字参数一般在前面添加**,只能传入一个dict,不能传入list、tuple。
- 命名关键字参数:对于关键字参数,可以传入任意不受限制的关键字参数,检查是否含有某参数用:if ‘city’ in kw:。若要限制关键字参数的名字,可以用命名关键字参数,需要一个特殊分隔符*,eg:def person(name, age, *, city, job):。命名关键字必须传入参数名,这和位置参数不同。
- 参数组合:
1.5、递归函数
- 要注意防止栈溢出,每当进入一个函数调用,栈就会加一层栈帧;当函数返回,栈就会减一层栈帧,栈的空间不是无限的,会导致栈溢出。
- 解决溢出的方法是通过尾递归优化。尾递归是指在函数返回的时候,调用自身本身,并且return语句不能包含表达式。这样,不管调用多少次,都只占用一个栈帧,不会出现溢出。