*
)与两个星号(**
)的作用大多数情况时,*
表示打包解包list、tuple、str等等,**
表示打包解包dict
*
表示乘法,**
表示幂1 * 2, 1 ** 2
(2, 1)
*
表示打包解包list、tuple、str等等,**
表示打包解包dict2.1、利用*
进行解包
li = [1, 2, 3, 4]
print(*li)
1 2 3 4
2.2、利用*
进行打包
a, b, *c = [1,2,3,4,5,6,7]
print(a, b, c)
# c收集了列表解包之后的多余值,并打包成了一个list
1 2 [3, 4, 5, 6, 7]
*
表示收集参数,**
表示关键字参数1.1、*
表示收集参数
收集参数允许用户传入任意多个参数
def print_any(*arg):
print(arg)
print_any(1,2,3,4,5, 'halo', 'python')
(1, 2, 3, 4, 5, 'halo', 'python')
1.2、**
表示关键字参数
def print_any(**kwargs):
print(kwargs)
print_any(a=1, b=2, c=3)
{'a': 1, 'b': 2, 'c': 3}
其实这里也可以理解为,**
将任意多个关键字参数打包成了一个字典,这就是**
的打包作用
*
和**
都是分配参数用2.1、*
分配位置参数
def print_name(first, last):
print("User's name is:{} {}".format(first.title(), last.title()))
name = ['Shen', 'alice']
print_name(*name)
User's name is:Shen Alice
为了确保是使用的位置参数,我们传入[1,2]包含一个数字的列表测试一下
def print_name(first, last):
print("User's name is:{} {}".format(first.title(), last.title()))
fail_name = [1, 'alice']
print_name(*fail_name)
会报错,是因为我们把数字1当作位置参数传给了first,而数字1是没有title()方法的,所以会报错。
2.2、**
分配关键字参数
def sum_any(a, b, c):
print('a is',a)
print('b is',b)
print('c is',c)
return a + b + c
dic = {'c':1, 'a':2, 'b':3}
sum_any(**dic)
a is 2
b is 3
c is 1
6
这里其实就是**
将一个字典解包成类似于 a=2, b=3, c=1的形式,然后将其传入函数,这就是**
的解包作用。
在Python中函数参数的工作方式其实很简单,当你编写
func(a, b, c, d=some, e=value)
时,位置和关键字参数其实分别是被打包成元组和字典的,函数实际接受到的是一个元组,args和一个字典kargs,并在内部完成如下的转换:
a, b, c = args
d = kwargs.get('d', d_default_value)
e = kwargs.get('e', e_default_value)
通过一个示例来查看此过程
def say_hello_then_call(f, *args, **kwargs):
print('args is', args)
print('kwargs is', kwargs)
print("Now I'm going to call %s"%f)
return f(*args, **kwargs)
def g(x, y, z=1):
return (x + y) / z
say_hello_then_call(g, 1, 2, z=5)
args is (1, 2)
kwargs is {'z': 5}
Now I'm going to call <function g at 0x000001F27AD8E5E0>
0.6
/,
的作用,*,
的作用和命名关键字参数在python的函数定义中/,
主要用于分隔前后参数的调用方式,位置参数和关键字参数的分布,在/,
前面的参数只能是位置参数,在/,
后面的参数只能是关键字参数。举个例子
def add_func(key1, key2, /, key3=3):
return key1 + key2 + key3
add_func(1, 2, key3=4)
7
由*,
单独分隔的参数,在*,
后面的参数被称为命名关键字参数,和关键字参数的区别在于:关键字参数可以将任意多的关键字参数打包成一个dict,而命名关键字参数可以限制关键字的名字,只接受被定义的关键字,也将其打包成dict
这里没有按照要求调用命名关键字参数,会出现错误
def add_func(key1, key2, *, key3=0):
return key1 + key2 + key3
add_func(1, 2, 3)
def add_func(key1, key2, *, key3=0):
return key1 + key2 + key3
add_func(1, 2, key3=3)
6
https://blog.csdn.net/zkk9527/article/details/88675129?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=1
https://blog.csdn.net/xinjieyuan/article/details/108178701
https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888