每个python程序员都应该早点知道的 6 个 Python 函数

1) 默认参数

def hello(name, greeting="Hi"):
	print(greeting, name)

hello("韩梅梅")
# Hi 韩梅梅

hello("韩梅梅", greeting = "你好")
# 你好 韩梅梅

在 hello(“韩梅梅”)中,我们没有在greeting中传递任何信息。这意味着它默认为 “hi

在hello(“韩梅梅”, greeting = “你好”)中,我们将 “hello “传入了 greeting。也就是说,我们覆盖了默认参数,并指定 greeting = ‘你好’

如果函数中有大量参数,而我们又不希望每次调用函数时都要输入每个参数,那么这种方法就非常有用。

2)形参和实参

在我学习 Python 的最初一年,我以为它们的意思是一样的。

但也不尽然。有一点区别。

比方说,我们有一个简单的函数,它接收 (a, b) 并返回它们的平均值。

def add(a, b):
	return a+b

形参是我们定义函数时写在括号内的变量。这里,a 和 b 就是形参。

def add(a, b):
	return a+b
x = add(3,4)
print(x)  # 7

实参是我们在调用函数时实际传递给函数的值。在这里,当我们调用 add(a, b) 函数时,3 和 4就是参数。

3) 位置参数和关键字参数

举一个简单的函数为例。

def test(a,b):
	print(f'{a=} {b=}')

让我们通过传递一些位置参数来调用这个函数。

def test(a,b):
	print(f'{a=} {b=}')

test(4,3) # a=4,b=3

这里,4 和 7 是位置参数。位置参数需要按顺序排列 ,将4 传递到 a,而 7 传递到 b。

接下来,让我们通过传递一些关键字参数来调用我们的函数。

def test(a,b):
	print(f'{a=} {b=}')

test(b=10,a=20) # a=20,b=10

这里,b=5 和 a=8 是关键字参数。关键字参数不需要按顺序排列,但我们必须使用 key=value 格式传递它们。

4) 任意位置参数 (*args)

函数中的任意位置参数(也称为 *args)允许函数接受任意数量的位置参数。

def test(*args):
	print(args)
test()       # ()
test(1)      # (1,)
test(1,10)   # (1,10)

args是约定俗成的写法,其实你也可以写成 *a 或 *aa

在这里,test 函数接收 *args , 这使得 test 可以接收任意数量的位置参数,所有这些参数都将包含在一个名为 args 的元组中。

我们也可以将其与普通参数相结合(*参数必须在后面)

def test(a,b, *args):
	print([a,b],args)
test()       # 错误
test(1)      # 错误
test(1,10)   # [1,10] ()

test(1,10,20)   # [1,10] (20)
test(1,10,20,30)   # [1,10] (20,30)

再次补充说明:我们不必将其命名为 *args。只要在前面加上 “*”,我们可以给它起任何名字(甚至是中文)。

5)任意关键字参数(**kwargs)

任意关键字参数(也称为 **kwargs)允许我们的函数接收任意数量的关键字参数。

def test(**kargs):
	print(kargs)
test()       # {}
test(a = 1)      # {"a":1}
test(b = 1,a = 10)   # {'b': 1, 'a': 10}

在这里,test 函数使用了 **kwargs, 它允许 test 使用任意数量的关键字参数,这些参数将被记录在名为 kwargs 的字典中。

我们还可以将其与普通参数相结合(**kwargs 也必须在后面)

def test(a,b,**kargs):
	print(kargs)
test()                     # 错误
test(a = 1)                # 错误
test(b = 1,a = 10)         # {}
test(b = 1,a = 10, c=20)   # {"c":20}

6) 使用 和 * 将 列表或字典传递给函数

下面是一个简单的函数,它只需打印出参数。

def test(a,b):
	print(f'{a=} {b=}')

我们可以不按常规方法调用这个函数,即 test(1,2):

使用 * 传递包含位置参数的列表

def test(a,b):
	print(f'{a=} {b=}')
nums= [10,20]
test(*nums)  # a = 10, b =20

在这里,nums 前面的 * 将其内容作为位置参数解包到函数调用中。这与 test(100, 200) 相同。

使用 ** 传递包含关键字参数的字典

def test(a,b):
	print(f'{a=} {b=}')
nums= {"a":10,"b":20}
test(**nums)  # a = 10, b =20

在这里,nums前面的 ** 将其键值对作为关键字参数解包到函数调用中。这与 hi(a=10, b=20) 相同

image-20240909212610935

通过上述示例,我们了解到默认参数、位置参数与关键字参数的区别及其应用场景,同时掌握了如何利用 args 和 **kwargs 处理可变数量的参数,这无疑让函数设计变得更加灵活且强大。更进一步,学会使用 和 ** 对列表和字典进行解包,可以使代码更加简洁明了,减少冗余,提高开发效率。无论是对于初学者还是有经验的开发者来说,这些都是日常编码中不可或缺的技能,能够帮助我们写出更加优雅且高效的代码。