哈嘍大家好,我是咸魚
今天跟大家介紹一下 python 當中星號(*)的一些用法
首先大家最常見的就是在 python 中 * 是乘法運算子,實作乘法
sum = 5 * 5 # 25
除此之外,還有一種常見的用法就是 * 號運算子在函式中的用法
- 單星號(
*)在函式中用法
舉個例子,你有一個函式,用來實作兩個數求和
def add(num1, num2):
return num1 + num2
print(add(1,2)) # 3
上面這個函式只能接收固定個數(兩個)的引數,那如果我想要求任意數量的值的和該怎么辦?
可以在形參部分加一個 * 號
def add(*num):
sum = 0
for i in num:
sum += i
return sum
在函式定義的時候形參前面加一個 * 號,就可以用任意數量的引數來呼叫函式,如果檢查資料型別,會發現 num 是一個元組(tuple)
即將所有傳入函式的位置引數打包成一個元組
#使用任意數量的引數來呼叫函式
add(1, 2, 3, 4) # 10
那如果函式在定義的時候就已經固定了形參的個數
def add(num1, num2, num3):
return num1 + num2 + num3
我們想要傳遞一個串列引數(假設這個串列有三個元素),可以這么呼叫函式
my_list = [1, 2, 3]
add(my_list[0], my_list[1], my_list[2])
這樣子呼叫要多敲幾個鍵盤,多麻煩,我們用 * 號來實作,前面我們看到 * 可以用在函式定義的時候的用法
在函式呼叫的時候加一個 * 號可以將一個串列或元組解構成多個變數
my_list = [1, 2, 3]
add(*my_list)
- 雙星號(
**)在函式中的用法
上面我們介紹了 * 運算子在函式定義的時候可以用來接收多個引數,并且將引數打包成一個元組,在函式呼叫的時候可以對串列或者元組中的元素進行解構
那如果物件是字典,我們可以使用雙星號運算子(**)
舉個例子,假設有下面的函式
def user_info(username, email, phone, date_of_birth):
user = get_user(username)
user.email = email
user.phone = phone
...
如果我們用關鍵字引數(keyword arguments,kwargs)呼叫它,就是下面的效果
user_info('kanye', email='[email protected]', phone='88888', date_of_birth='2000.08.15')
那如果我需要增加傳參個數,我就不得不去函式定義那里添加形參,這么做太麻煩了
我們可以這么做,我們在 kwargs 形參前面加了雙星號,用于接收任意數量的關鍵字引數
def user_info(username, **kwargs):
user = get_user(username)
user.email = kwargs['email']
user.phone = kwargs['phone']
...
在形參中,**kwargs 的關鍵是雙星號,你完全可以使用其他名字例如 **usr(還是建議用 kwargs)
在函式定義中,** 運算子會把傳進來的引數打包成字典
當然,我們可以像使用 Python 中的其他字典一樣使用 kwargs 字典,這樣會使代碼更簡潔易懂
def user_info(username, **kwargs):
user = get_user(username)
for k,v in kwargs.items():
....
除此之外,** 運算子也可以用在函式呼叫的時候,用于將一個字典解構成多個變數
dict = {
'email':"[email protected]"
'phone':"88888"
...
}
user_info(username,**dict)
- 單星號接收非關鍵字引數
在函式定義的時候,單星號可以獨立使用,不需要變數(引數)名稱,在Python中是一個完全有效的函式定義
def my_function(*, keyword_arg):
...
在上面的函式定義中,* 號引數會接收所有非關鍵字引數(位置引數),然后剩下的關鍵字引數傳給 keyword_arg
如果你在呼叫的時候只傳了位置引數,就會報錯
my_function(1)
"""
TypeError: my_function() takes 0 positional arguments but 1 was given
"""
在上面代碼中,函式my_function定義了一個命名關鍵字引數keyword_arg,但在函式呼叫時使用位置引數 1 來傳遞引數,而不是使用關鍵字引數的方式,所以報錯
函式定義中,使用*來標識位置引數結束,之后的引數都被視為命名關鍵字引數,這意味著在函式呼叫時必須傳遞關鍵字引數
那如果我們想強制只使用位置引數,而不是上面案例中的只使用關鍵字引數該怎么辦
我們使用 / 號來實作
def only_positional_arguments(arg1, arg2, /):
...
如果你傳遞關鍵字引數,會發生報錯,是不是很有意思
only_positional_arguments(arg1=1, arg2=2)
"""
TypeError: only_positional_arguments() got some positional-only arguments passed as keyword arguments: 'arg1, arg2'
"""
- 星號拓展用法
1、單星號構建或解構串列
比如說有下面兩個串列
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]
我們知道,解構串列元素的時候可以這么干
my_list = [1, 2, 3]
a, b, c = my_list
# a -> 1
# b -> 2
# c -> 3
上面每個變數都存盤了串列中的元素,那假設我打算將串列中的第一個和最后一個元素放在指定變數中,中間的元素還是作為串列,我該怎么辦
可以使用單星號
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、雙星號構建字典
同理,雙星號可以用于構建字典
dict1 = {
'age': '22'
}
dict2 = {
'email': '[email protected]'
}
user_dict = {'username': 'kanye', **dict1, **dict2}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555661.html
標籤:其他
下一篇:返回列表
