python学习---------函数
上一篇简单的介绍了函数的定义以及相应的参数。这一篇继续介绍更加高级的函数用法。
关键字参数
在没有特殊处理的情况下,函数的参数都是位置参数,也就意味着传入参数的时候对号入座即可
def add(a, b, c):
"""
计算三个数相加
"""
return a + b + c
print(add(1, 1, 1))
print(add(c=2, a=1, b=3))
写在前面的参数为位置参数,只需要对号入座,写在后面的参数为命名关键字参数,必须写成“参数名=参数值”,不然就会报错
def add(*, a, b, c):
"""
计算三个数相加
"""
return a + b + c
print(add(a=1, b=1, c=1))
print(add(1, 1, 1))
如果要写一个函数,但是函数参数的个数暂时无法确定,有可能没有,有可能有很多个参数,应该怎么办? 我们在设计函数时,如果既不知道调用者会传入的参数个数,也不知道调用者会不会指定参数名, 那么同时使用可变参数和关键字参数。关键字参数会将传入的带参数名的参数组装成一个字典 , 参数名就是字典 中键值对的键 ,而参数值就是字典 中键值对的值
def calc(*args, **kwargs):
result = 0
for arg in args:
result += arg
for value in kwargs.values():
result += value
return result
print(calc())
print(calc(1, 2, 3))
print(calc(a=1, b=2, c=3))
print(calc(1, 2, c=3, d=4))
*args (可以接收零个或多个位置参数 ):将所有位置参数打包成一个元组 **kwargs (可以接收多个关键字参数) :将所有的关键字打包成一个字典 注意 关键字参数一定在位置参数之后
高阶函数的用法
函数的参数和返回值可以是任意类型的对象,这就意味着函数本身也可以作为函数的参数或返回值,这就是所谓的高阶函数
def calc(*args, init_value, fn, **kwargs):
total = init_value
for arg in args:
if type(arg) in (int, float):
total = fn(total, arg)
for value in kwargs.values():
if type(value) in (int, float):
total = fn(total, value)
return total
def add(x, y):
return x + y
def mul(x, y):
return x * y
print(calc(1, 2, 3, init_value=0, fn=add, x=4, y=5))
print(calc(1, 2, x=3, y=4, z=5, init_value=1, fn=mul))
其中其中init_value 代表运算的初始值,fn 代表二元运算函数
上面的代码也可以不用定义add 和mul 函数,因为Python标准库中operator 模块提供了代表加法运算的add 和代表乘法运算的mul 函数 from operator import add, sub, mul fn=operator.add fn=operator.mul
Lambda函数
在使用高阶函数的时候,如果作为参数或者返回值的函数本身非常简单,一行代码就能够完成,那么我们可以使用Lambda函数来表示
def calc(*args, init_value, fn, **kwargs):
total = init_value
for arg in args:
if type(arg) in (int, float):
total = fn(total, arg)
for value in kwargs.values():
if type(value) in (int, float):
total = fn(total, value)
return total
print(calc(11, 22, 33, 44, init_value=0, fn=lambda x, y: x + y))
print(calc(11, 22, 33, 44, init_value=1, fn=lambda x, y: x * y))
递归函数
Python中允许函数嵌套定义,也允许函数之间相互调用,而且一个函数还可以直接或间接的调用自身。函数自己调用自己称为递归调用 。 函数可以调别人也可以调自己,但是一定要收敛 ,尽快结束,不要无限制的调用
递归函数两个要点: 1:递归方式 2:收敛条件(什么时候停止递归调用)
def fuc(num):
"""
求一个数的阶乘
"""
if num == 0:
return 1
return num * fuc(num - 1)
print(fuc(5))
"""
过程分析
num=5 num=4 num=3 num=2 num=1 num=0
5*fuc(4) 4*fuc(3) 3*fuc(2) 2*fuc(1) 1*fuc(0) 1
"""
用递归函数找斐波拉数 1,1,2,3,5,8,…
def fib(n, temp={}):
if n in (1, 2):
return 1
if n not in temp:
temp[n] = fib(n - 1) + fib(n - 2)
return temp[n]
|