1.1 参数结构
函数是可以传递参数的,当然也可以不传递参数。同样,函数可以有返回值,也可以没有返回值。为了方便介绍,将Python的传参方式归为4类。
1.传统参数传递
(1) 无参数传递
def func():
print("这是无参数传递")
# 调用func(),将打印输出"这是无参数传递"字符串。
(2) 固定参数传递
def func(x):
print(f"传递的参数为:{x}")
# 调用func(hello),将打印输出"传递的参数为:hello"字符串。
对于传递多个参数,例如传递三个参数,可以这样定义:
def func(x, y, z):
pass
2.默认参数传递
Python默认参数传递的机制减少了重复参数的多次输入,函数允许默认参数是大多数程序语言都支持的。通过下面的代码来介绍这种机制。
def func(x, y = 100, z = 'hello'):
print(x, y, z)
func(0) # 0 100 hello
func(0, 1) # 0 1 hello
func(0, 34, 'world') # 0 34 world
func(66, z = 'hello world') # 66 100 hello world
func(44, y = 90, z = 'kkk') # 44 90 kkk
从这里可以知道,y = 100,z = 'hello’都是默认参数,当不输出y和z的参数值时,函数默认给出y = 100,z = 'hello’的值。但值得注意的是,给参数赋值时要注意参数的顺序,除非标明这个数值时赋给哪个参数的,如func(44, y = 90, z = ‘kkk’),或者func(y = 90, z = ‘kkk’, x = 44),若写成func(y = 90, z = ‘kkk’, 44) 就会报错,因为函数不知道这里的44时赋值给哪个参数的,所以不标明就必须按照“出场”的顺序。
3.未知参数个数传递
对于某些函数,我们不知道传进来多少个参数,只知道对这些参数进行怎样的处理。Python允许我们创造这样的函数,即未知参数个数的传递机制,只需要在参数前面加个 * 就可以了。
举个简单的例子:你身份证上姓名叫姚博汶,在家有个小名叫汶汶,在中学阶段同学给你取了个外号“姚狗蛋儿”,在高中阶段同学们又了个雅称“学渣”>>>外号可能还有很多,如大学阶段可能还会有,所以其数量就不能确定。现在要把这些外号作为一个函数中的参数,怎么办呢?只需要在参数前面加个*就解决了。实例代码如下:
def func(name, *args):
print(name + "有以下称呼:")
for i in args:
print(i)
func('姚博汶', '汶汶', '姚狗蛋儿', '学渣')
# 测试及运行结果如下
# 姚博汶有以下称呼:
# 姚博汶
# 汶汶
# 姚狗蛋儿
# 学渣
4.带键参数传递
带键参数传递是指参数通过键值对的方式进行传递。什么叫键值对?下面这个例子将会展示这种结构。带键参数的传递只需要在参数前面加**就可以了。实例代码如下:
def func(**kwargs):
print(type(kwargs))
for i in kwargs:
print(i, kwargs[i])
func(aa = 1, bb = 2, cc = 3)
print("-------------------")
func(x = 1, y = 2, z = 'hello')
# 测试及运行结果
# <class 'dict'>
# aa 1
# bb 2
# cc 3
# -------------------
# <class 'dict'>
# x 1
# y 2
# z hello
可以看到,参数的类型为dict。
1.2 回调函数
回调函数又叫函数回调,指的是将函数作为参数传递到另外的函数中执行。例如将A函数作为参数传递到B函数,然后在B函数中执行A函数。这种做法的好处是函数被定义之前就可以使用函数,或者对于其他程序提供的API进行调用。示例代码如下:
def func(fun, args):
fun(args)
def f1(x):
print(f"这是f1函数:{x}")
def f2(x):
print(f"这是f2函数:{x}")
func(f1, 1)
func(f2, "hello")
# 测试及运行结果如下
# 这是f1函数:1
# 这是f2函数:hello
上面的程序从func函数中分别调用了f1与f2函数。可以看到,在f1或者f2函数被定义之前,我们在func函数中就对其进行了调用,这就是所谓的函数回调。