函数是最基本的一种代码抽象方式
python 官方文档 函数库: https://docs.python.org/zh-cn/3/library/index.html
调用函数
调用函数时 , 传参数量不对 , 传参类型不对 , 报TypeError错误 .
定义函数
使用def语句 , 依次写出函数名 , 括号 , 括号中的参数 , 冒号: , 然后在缩进块中写函数体 , 函数返回值用return语句返回
求绝对值函数:
def my_abs(x):
if x >= 0:
return x
else:
return -x
空函数:
如果想定义一个什么都不做的函数 可以使用pass语句
def nop():
pass
也可用于其他语句:
if age >= 18:
pass
pass实际作用为占位符 , 当时还没想好怎么写的代码 , 先放一个pass , 让代码能够运行起来
参数检查
数据类型检查使用内置函数isinstance()
def my_abs(x):
if not isinstance(x , (int , float)):
raise TypeError('错误类型输入')
if x >= 0:
return x
else:
return -x
返回多个值
实际就是返回一个tuple
小结
1 定义函数时 , 需要确定函数名和参数个数
2 如果有必要 , 可以先对参数的数据类型做检查
3 函数体内部可以用return随时返回函数结果
4 函数执行完毕也没有return语句时 , 自动 return None
5 函数可以同时返回多个值 , 但其实就是一个tuple
函数的参数
默认参数
def power (x , n=2):
s = 1
while n > 0 :
n = n-1
s = s*x
return s
当我们调用power(5)时 , 相当于调用power(5 , 2)
当调用时还传入n的值 , 则以n的值为准
** 默认参数必须指向不变对象
可变参数
def calc (*numbers) :
sum = 0
for n in numbers:
sum = sum + n* n
return sum
*nums表示把nums这个list的所有元素作为可变参数传进去 . 在函数调用时自动组装成一个tuple , 一种很常见的方法
关键字参数
允许你传入0个或任意个含参数名的参数 , 这些关键字参数在函数内部自动组装为一个dict ,
def person(name , age , **kw)
print('name' : name , 'age' : age , 'other' : kw)
函数person除了必选参数name和age以外 , 还接受关键字参数kw , 在调用该函数时 , 可以只传入必选函数
person('mark' , 30)
name : mark age : 30 other : {}
传任意关键字参数:
person('Adam' , 45 , 'gender' = 'M' , 'job' = 'teacher')
name : Adam age = 45 other:{'gender':'M' , 'job':'teacher'}
命名关键字参数
用于限制关键字参数的名字 , 例如 , 只接受city和job作为关键字参数
def person (name , age , * , city , job):
print(name , age , city , job)
*后面的参数被视为命名关键字参数 , 调用时必须传入参数名 , 若没有传入 , 则调用报错.
递归函数
def fact(n):
if n == 1:
return 1
return n * fact(n-1)
递归函数的优点是定义简单 , 逻辑清晰 . 理论上 , 所有递归都可以写成循环形式 , 但逻辑不如递归清晰
调用递归函数次数过多会出现栈溢出 , 此时可以使用尾递归优化.