一、函数的定义、传递参数和使用
*args和**kwargs分别将参数打包为元组tuple和字典dict两种类型
键值对类型的自动会被保存到dict中
PS.如果没有在参数中加入**kwargs,但是在输入的参数中出现了键值对,就会报错
需要注意两者的顺序,是先args后kwargs
二者的名字是公用的,也可以随便起,比如*a和**b
# 函数参数传递
# 在abc函数中包含x,y两个参数
# *args将传入参数打包为元组tuple
# **kwargs将传入键值对打包为字典dict
def abc(x, y, *args, **kwargs):
print(x, y)
print(args)
print(kwargs)
abc(1, 2, "hellow", 22, 22.2, True, amd=12, inter=13)
# 1 2
# ('hellow', 22, 22.2, True)
# {'amd': 12, 'inter': 13}
二、将函数作为参数传递
定义一个函数
对函数进行求导
对于不知道具体函数的可以利用微分的定义来粗略求导
在一个函数中调用调用另一个函数的时候,直接在参数位置写函数名,即可将函数作为参数调用
diff(2,f)
# 定义函数
def f(x):
return 3 * x ** 2 + 2 * x - 5
# 根据微分的定义来构造求导公式
# 其中x趋近于0用1e-6替代
def diff(x, func):
delta = 1e-6
return (func(x + delta) - func(x)) / delta
# 调用diff函数,其中func参数用f来替代
# 实现了函数f(x)作为参数的传递
print(diff(2, f))
# 14.000003002223593
三、函数可以加入到集合中
函数可以加入列表list,成为一个集合
这样可以方便遍历集合,挨个使用多个函数
def f1(x):
return x**2
def f2(x):
return x**3
def f3(x):
return x**4
funcs = [f1,f2,f3]
for f in funcs:
print(f(5))
# 25
# 125
# 625
三、函数作为返回值,用于函数的嵌套
# 定义函数funct1,内部嵌套一个func2
def func1(x):
def func2(y):
return x + y
return func2
# 调用函数func1,函数执行后返回的是func2
# func1(3),3的参数给到x
# 返回值依然是一个函数
a = func1(3)
print(type(a))
# <class 'function'>
# 既然返回值依然是一个函数,那么返回值后面就可以继续跟参数
# a(5)其实就是func2(5),5的参数给到y
print(a(5))
# 8
# 简易的写法可以写作,对嵌套的函数连续传入参数
print(func1(3)(5))
# 8
四、创建临时的匿名函数
对于一些简单的、单次使用的函数,不需要再单独定义
使用lambda方法定义一个临时的函数
lambda 参数,参数,...,参数: 函数
这归功于函数也是对象,可以利用引用的规则来引用函数。
# 还是原来的微分公式
def diff(x, func):
delta = 1e-6
return (func(x + delta) - func(x)) / delta
# 用lambda定义一个临时的函数,放在func的位置
# 这个函数没有名字,且只能使用一次,也无法被调用,放在f的位置让f去引用它
# lambda的创建方式是
# lambda 参数,参数,...,参数:函数
dy = diff(2, lambda x:2*x**2+3)
print(dy)