Python知識分享網(wǎng) - 專業(yè)的Python學習網(wǎng)站 學Python,上Python222
python 星號(*) 還能這么用
匿名網(wǎng)友發(fā)布于:2023-06-26 15:12:46
(侵權(quán)舉報)

今天跟大家介紹一下 python 當中星號(*)的一些用法

首先大家最常見的就是在 python 中 * 是乘法運算符,實現(xiàn)乘法

 

sum = 5 * 5 # 25

 

除此之外,還有一種常見的用法就是 * 號操作符在函數(shù)中的用法

  • 單星號(*)在函數(shù)中用法

舉個例子,你有一個函數(shù),用來實現(xiàn)兩個數(shù)求和

 

def add(num1, num2):
    return num1 + num2

print(add(1,2)) # 3

 

上面這個函數(shù)只能接收固定個數(shù)(兩個)的參數(shù),那如果我想要求任意數(shù)量的值的和該怎么辦?

可以在形參部分加一個 * 號

 

def add(*num):
	sum = 0
	for i in num:
        sum += i
   	return sum

 

在函數(shù)定義的時候形參前面加一個 * 號,就可以用任意數(shù)量的參數(shù)來調(diào)用函數(shù),如果檢查數(shù)據(jù)類型,會發(fā)現(xiàn) num 是一個元組(tuple)

即將所有傳入函數(shù)的位置參數(shù)打包成一個元組

 

#使用任意數(shù)量的參數(shù)來調(diào)用函數(shù)
add(1, 2, 3, 4) # 10

 

那如果函數(shù)在定義的時候就已經(jīng)固定了形參的個數(shù)

 

def add(num1, num2, num3):
    return num1 + num2 + num3

 

我們想要傳遞一個列表參數(shù)(假設(shè)這個列表有三個元素),可以這么調(diào)用函數(shù)

 

my_list = [1, 2, 3]
add(my_list[0], my_list[1], my_list[2])

 

這樣子調(diào)用要多敲幾個鍵盤,多麻煩。我們用 * 號來實現(xiàn),前面我們看到 * 可以用在函數(shù)定義的時候的用法

在函數(shù)調(diào)用的時候加一個 * 號可以將一個列表或元組解構(gòu)成多個變量

 

my_list = [1, 2, 3]
add(*my_list)

 

  • 雙星號(**)在函數(shù)中的用法

上面我們介紹了 * 操作符在函數(shù)定義的時候可以用來接收多個參數(shù),并且將參數(shù)打包成一個元組,在函數(shù)調(diào)用的時候可以對列表或者元組中的元素進行解構(gòu)

那如果對象是字典,我們可以使用雙星號操作符(**

舉個例子,假設(shè)有下面的函數(shù)

 

def user_info(username, email, phone, date_of_birth):
    user = get_user(username)
    user.email = email
    user.phone = phone
    ...

 

如果我們用關(guān)鍵字參數(shù)(keyword arguments,kwargs)調(diào)用它,就是下面的效果

 

user_info('kanye', email='blog@example.com', phone='88888', date_of_birth='2000.08.15')

 

那如果我需要增加傳參個數(shù),我就不得不去函數(shù)定義那里添加形參,這么做太麻煩了

我們可以這么做,我們在 kwargs 形參前面加了雙星號,用于接收任意數(shù)量的關(guān)鍵字參數(shù)

 

def user_info(username, **kwargs):
    user = get_user(username)
    user.email = kwargs['email']
    user.phone = kwargs['phone']
    ...

 

在形參中,**kwargs 的關(guān)鍵是雙星號,你完全可以使用其他名字例如 **usr(還是建議用 kwargs)

在函數(shù)定義中,**操作符會把傳進來的參數(shù)打包成字典

當然,我們可以像使用 Python 中的其他字典一樣使用 kwargs 字典,這樣會使代碼更簡潔易懂

 

def user_info(username, **kwargs):
    user = get_user(username)
    for k,v in kwargs.items():
    	....

 

除此之外,** 操作符也可以用在函數(shù)調(diào)用的時候,用于將一個字典解構(gòu)成多個變量

 

dict = {
	'email':"blog@example.com"
	'phone':"88888"
    ...
}

user_info(username,**dict)

 

  • 單星號接收非關(guān)鍵字參數(shù)

在函數(shù)定義的時候,單星號可以獨立使用,不需要變量(參數(shù))名稱,在Python中是一個完全有效的函數(shù)定義

 

def my_function(*, keyword_arg):
    ...

 

在上面的函數(shù)定義中,* 號參數(shù)會接收所有非關(guān)鍵字參數(shù)(位置參數(shù)),然后剩下的關(guān)鍵字參數(shù)傳給 keyword_arg

如果你在調(diào)用的時候只傳了位置參數(shù),就會報錯

 

my_function(1)
"""
TypeError: my_function() takes 0 positional arguments but 1 was given
"""

 

在上面代碼中,函數(shù)my_function定義了一個命名關(guān)鍵字參數(shù)keyword_arg,但在函數(shù)調(diào)用時使用位置參數(shù) 1 來傳遞參數(shù),而不是使用關(guān)鍵字參數(shù)的方式,所以報錯

函數(shù)定義中,使用*來標識位置參數(shù)結(jié)束,之后的參數(shù)都被視為命名關(guān)鍵字參數(shù),這意味著在函數(shù)調(diào)用時必須傳遞關(guān)鍵字參數(shù)

那如果我們想強制只使用位置參數(shù),而不是上面案例中的只使用關(guān)鍵字參數(shù)該怎么辦

我們使用 / 號來實現(xiàn)

 

def only_positional_arguments(arg1, arg2, /):
    ...

 

如果你傳遞關(guān)鍵字參數(shù),會發(fā)生報錯,是不是很有意思

 

only_positional_arguments(arg1=1, arg2=2)

"""
TypeError: only_positional_arguments() got some positional-only arguments passed as keyword arguments: 'arg1, arg2'
"""

 

  • 星號拓展用法

1、單星號構(gòu)建或解構(gòu)列表

比如說有下面兩個列表

 

my_list_1 = [1, 2, 3]
my_list_2 = [10, 20, 30]

 

我們打算合并這兩個列表,可以用 + 操作符

 

merged_list = my_list_1 + my_list_2

 

但是單星號更靈活,比如說我們在合并的時候在中間加一個元素

 

num=42
merged_list = [*my_list_1, some_value, *my_list_2]

 

我們知道,解構(gòu)列表元素的時候可以這么干

 

my_list = [1, 2, 3]
a, b, c = my_list

# a -> 1
# b -> 2
# c -> 3

 

上面每個變量都存儲了列表中的元素,那假設(shè)我打算將列表中的第一個和最后一個元素放在指定變量中,中間的元素還是作為列表,我該怎么辦

可以使用單星號

 

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a, *b, c = my_list

# a -> 1
# b -> [2, 3, 4, 5, 6, 7, 8, 9]
# c -> 10

 

需要注意的是,單星號接收的對象是列表

 

my_list = [1, 2, 3]
a, *b, c = my_list

# a -> 1
# b -> [2]
# c -> 3

 

2、雙星號構(gòu)建字典

同理,雙星號可以用于構(gòu)建字典

 

dict1 = {
    'age': '22'
}

dict2 = {
    'email': 'blog@example.com'
}

user_dict = {'username': 'kanye', **dict1, **dict2}

 

轉(zhuǎn)載自:https://www.cnblogs.com/edisonfish/p/17493391.html