Python — **和* 用法基础详细讲解

1.0前言:

你是否每一次在了解一个新的函数,或者在装饰器,时都会发现参数里面有 **。 *之类让人看了摸不清头脑,,当然了C语言中*既可以用于定义一个指针变量,或者在获取指针指向的值,因此不同的语言,用法和意义有所区别,本期重点讲解Python中的*,**

目录

1.0前言:

1.10 解包参数:

1.11解包位置参数:

1.12解包关键字参数:

2.1扩展序列

2.11扩展列表:

2.12扩展字典:

3.1函数位置的**,*:

3.11函数参数中的*:

3.12函数参数中的**:

4.1解包操作

4.11解包元组:

4.12解包字典:

5.1打包参数:

5.11打包位置参数函数:

5.12打包关键字参数:

6.1 **和*混合使用:

6.2装饰器——运行耗时装饰器的应用:

小结:


1.10 解包参数:

首先什么是解包呢?解包就是一种将数据结构中的元素赋值给多个变量的快捷方式,可以提高代码的可读性和简洁性,相应包括字典解包,列表解包,函数参数解包等,以下是一个列表的解包:

name = ['zhang_san','Li_si','wang_wu']
val1 ,val2 , val3 = name
#这样val1就是zhang_san,依次类推,每一个值都依次赋给了val2,val3

 在了解解包的基础上我们开始讲解 *,**的用法,

值得一提的是,你如果能想到解包,那么肯定能想到压包,没错Python中有内置函数zip()可以实现压包,如果你也想学习一下压包,博主也有一篇关于zip的详细用法相信可以帮助到你

Python- zip()内置函数一篇就够了-CSDN博客

1.11解包位置参数:

在函数定义中,* 可以用来解包位置参数。这就让函数可以接受不定数量的位置参数,将他们打包成一个元组。

def SUM(*args):
    tol = 0
    for i in args:
        tol += i
    return tol
print(SUM(1,2,3,4,5,6))
#结果是21

顺便补充一下:

args: args是arguments 的缩写,(当然如果你非要改为 *random也是可以的,只不过约定俗成为args,像self一样你可以用this来表示本身),  表示参数的意思,一般我们默认*args 表示不定参数,即当传入一个函数的参数个数未知时,且不知道参数名称的情况下。

1.12解包关键字参数:

**用于解包关键字参数,将他们打包成一个字典:

def school_inf(**kwargs):
    for key, val in kwargs.items():
        print(f'{key}:{val}')
school_inf(principal = 'Mr.Simith',studeng_num = '10000', outstanding_obj = 'math')
#结果
#(principal , 'Mr.Simith')
#(studeng_num , '10000')
#(outstanding_obj , 'math')

顺便补充一下:

kwargs:kwargs是 key word arguments 的缩写代表关键字参数,**kwargs允许你在函数定义中指定接受不定数量的关键字参数,使得你能够处理多个命名的参数(关键字参数允许函数调用者通过明确指定参数名来传递参数值,而不是依赖于参数的位置,比如print中的end和sep 就是一个关键字参数)

2.1扩展序列

2.11扩展列表:

* 可以用于扩展列表,将一个列表中的元素拆分后传递给另一个列表:

#常规扩展
li = [1,2,3]
li2 = [4,5,6]
li.extend(li2)
#li 为[1,2,3,4,5,6]

#使用*扩展
li = [1,2,3]
li2 = [4,5,6]
li = [*li,*li2]
#li 为[1,2,3,4,5,6]

2.12扩展字典:

**可以用于扩展字典,将一个字典中的键值对拆分后传递给另一个空字典

dict1 = {"name": "Alice", "age": 30}
dict2 = {"country": "UK"}
dict1.update(dict2)
print(dict1)
# 输出:{'name': 'Alice', 'age': 30, 'country': 'USA'}

# 使用 ** 扩展字典
dict1 = {"name": "Alice", "age": 30}
dict2 = {"country": "UK"}
dict1 = {**dict1, **dict2}
print(dict1)
# 输出:{'name': 'Alice', 'age': 30, 'country': 'USA'}

3.1函数位置的**,*:

3.11函数参数中的*:

*可以用来将位置参数和关键字参数分隔开,从而指定只接受关键字参数

def greet(name, * , message = 'Hello'):
    print(f'{message},{name} !')
#f''是一个语法糖
greet('Bob')
#结果是Hello Bob ! 

同时补充: *args

def greet(*args):
    '''functions- body'''

args: args是arguments 的缩写,(当然如果你非要改为 *random也是可以的,只不过约定俗成为args,像self一样你可以用this来表示本身),  表示参数的意思,一般我们默认*args 表示不定参数,即当传入一个函数的参数个数未知时,且不知道参数名称的情况下。

3.12函数参数中的**:

**可以用来接受任意数量的关键字参数,这些参数都将被打包成一个字典

def person_info(name, age, **kwargs):
    print(f"Name: {name}")
    print(f"Age: {age}")
    print("Other Info:")
    for key, value in kwargs.items():
        print(f"{key}: {value}")

person_info(name="Alice", age=30, country="USA", job="Engineer")
# 输出:
# Name: Alice
# Age: 30
# Other Info:
# country: USA
# job: Engineer

kwargs:kwargs是 key word arguments 的缩写代表关键字参数,**kwargs允许你在函数定义中指定接受不定数量的关键字参数,使得你能够处理多个命名的参数(关键字参数允许函数调用者通过明确指定参数名来传递参数值,而不是依赖于参数的位置,比如print中的end和sep 就是一个关键字参数)

4.1解包操作

4.11解包元组:

*用于解包元组或者列表:解包列表的例子是本文开头第一个例子,下面是解包元组:

size = ('big','moderate','small')
size1,size2,size3 = size
print(size1,size2,size3)
#输出big moderate, small

4.12解包字典:

**用来解包键值对,可以将解包后的键值对作为函数关键字参数!划重点,这里很有可能会搞错

下面就是将**字典中的键值对解包为函数的关键字参数

def my_function(name, age):
print(name, age)

person = {'name': 'Alice', 'age': 30}
my_function(**person)

而如果如果逆向把字典中的键值对分别赋值给变量,那么可以采用一下用法:参考字典用法:

Python-字典详细讲解:-CSDN博客

person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
name, age, city = person.keys()
value1,value2,value3 = preson.values()
print(name, age, city)
print(value1,value2,value3)

值得一提的是下列做法是错误的:

person = {'name': 'Alice', 'age': 30}
a,b = **person
#而 a,b = person
#最终结果是a = 'name', b = 'age'

4.13部分解包 :

如果我们只是想解包部分元素,那么我们可以用* 将剩余的元素打包成一个新的列表如下,这种部分解包在输入中十分常见,列如输入四个数,如果你输入了多个数就会报错,那么我们可以用 *将剩下的元素打包避免报错。

color = ['blue','yellow','black','green']
val1 ,val2, *other = color

5.1打包参数:

5.11打包位置参数函数:

*用于打包位置参数,将多个参数打包成一个元组

def multiply(*args):
    result = 1
    for num in args:
        result *= num
    return result

numbers = (2, 3, 4)
print(multiply(*numbers))  # 输出 24

args: args是arguments 的缩写,(当然如果你非要改为 *random也是可以的,只不过约定俗成为args,像self一样你可以用this来表示本身),  表示参数的意思,一般我们默认*args 表示不定参数,即当传入一个函数的参数个数未知时,且不知道参数名称的情况下。

5.12打包关键字参数:

**用于打包关键字参数,将多个关键字参数打包成一个字典。

def print_colors(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

colors = {"color1": "red", "color2": "blue", "color3": "green"}
print_colors(**colors)  # 传递字典作为关键字参数
# 输出:
# color1: red
# color2: blue
# color3: green

kwargs:kwargs是 key word arguments 的缩写代表关键字参数,**kwargs允许你在函数定义中指定接受不定数量的关键字参数,使得你能够处理多个命名的参数(关键字参数允许函数调用者通过明确指定参数名来传递参数值,而不是依赖于参数的位置,比如print中的end和sep 就是一个关键字参数)

6.1 **和*混合使用:

**和*混合使用是为了接受不定数量的参数,包括位置参数和关键字参数

def advanced_example(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

advanced_example(1, 2, 3, name="Alice", age=30)
# 输出:
# 1
# 2
# 3
# name: Alice
# age: 30

**和*的使用用于构建通用函数和接收不定数量的参数的函数非常有用。通过合理使用这些功能,可以轻易实现复杂的功能

6.2装饰器——运行耗时装饰器的应用:

在一个计算运行耗时的装饰器中恰好就运用到了**和*,帮助你更好的理解装饰器:

由于不同的函数对应的位置参数和关键字参数是不同的,为了让装饰器能够装饰任何函数,于是我们这里就用到了*args和**kwargs

def decorator(func):
    def warpper(*args,**kwargs):  
'''
#wapper的作用是让func可以带参数,也可以不带参数保证
# 无论什么情况都可以合法装饰多种函数,如果fun()没有内
# 置参数的话不需要用warpper来修饰,但是如果func(a)
# 必须要传入某个参数时没有warpper却没有传递一定会出
# 异常因此如此做可以装饰许多参数数量不同的函数
'''                                
        start_time = time.time()
        result = func(*args,**kwargs)
        end_time = time.time()
        print(f'{func.__name__} use {end_time-start_time}')
        return result
    return warpper

小结:

**和*在Python中运用十分广泛,熟练的掌握**和*能够使函数更加灵活,代码更加简洁,

他们用于解包,打包参数,扩展等诸多方面

如果对您有帮助,请不要吝啬您手里的赞,谢谢大家的观看!

参考知乎:掌握Python的解包技巧:*和**的最全用法 – 知乎

作者:何等样仁

物联沃分享整理
物联沃-IOTWORD物联网 » Python — **和* 用法基础详细讲解

发表回复