python中一个星号(*)与两个星号(**)的作用

python中一个星号(*)与两个星号(**)的作用

目录

  • python中一个星号(`*`)与两个星号(`**`)的作用
    • 一、一般用法
        • 概述:
        • 1、`*`表示乘法,`**`表示幂
        • 2、`*`表示打包解包list、tuple、str等等,`**`表示打包解包dict
    • 二、使用函数时
        • 1、在定义函数时,`*`表示收集参数,`**`表示关键字参数
        • 2、在调用函数时,`*`和`**`都是分配参数用
    • 三、扩展调用语法和*args、**kargs
    • 四、函数定义中`/,`的作用,`*,`的作用和命名关键字参数
    • 五、Reference

一、一般用法

概述:

大多数情况时,*表示打包解包list、tuple、str等等,**表示打包解包dict

1、*表示乘法,**表示幂
1 * 2, 1 ** 2
(2, 1)
2、*表示打包解包list、tuple、str等等,**表示打包解包dict

2.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.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、在调用函数时,***都是分配参数用

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)

python中一个星号(*)与两个星号(**)的作用_第1张图片
会报错,是因为我们把数字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的形式,然后将其传入函数,这就是**的解包作用。

三、扩展调用语法和*args、**kargs

在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)

python中一个星号(*)与两个星号(**)的作用_第2张图片
使用关键字的方式调用后 ,没有出现错误

def add_func(key1, key2, *, key3=0):
    return key1 + key2 + key3
add_func(1, 2, key3=3)
6

五、Reference

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

你可能感兴趣的:(Python,python,开发语言,后端)