Python中的星號(hào)*還能這么用你知道嗎
哈嘍大家好,我是咸魚
今天跟大家介紹一下 python 當(dāng)中星號(hào)(*
)的一些用法
首先大家最常見的就是在 python 中 *
是乘法運(yùn)算符,實(shí)現(xiàn)乘法
sum = 5 * 5 # 25
除此之外,還有一種常見的用法就是 *
號(hào)操作符在函數(shù)中的用法
1.單星號(hào)(*)在函數(shù)中用法
舉個(gè)例子,你有一個(gè)函數(shù),用來實(shí)現(xiàn)兩個(gè)數(shù)求和
def add(num1, num2): return num1 + num2 print(add(1,2)) # 3
上面這個(gè)函數(shù)只能接收固定個(gè)數(shù)(兩個(gè))的參數(shù),那如果我想要求任意數(shù)量的值的和該怎么辦?
可以在形參部分加一個(gè) *
號(hào)
def add(*num): sum = 0 for i in num: sum += num return sum
在函數(shù)定義的時(shí)候形參前面加一個(gè) *
號(hào),就可以用任意數(shù)量的參數(shù)來調(diào)用函數(shù),如果檢查數(shù)據(jù)類型,會(huì)發(fā)現(xiàn) num 是一個(gè)元組(tuple)
即將所有傳入函數(shù)的位置參數(shù)打包成一個(gè)元組
#使用任意數(shù)量的參數(shù)來調(diào)用函數(shù) add(1, 2, 3, 4) # 10
那如果函數(shù)在定義的時(shí)候就已經(jīng)固定了形參的個(gè)數(shù)
def add(num1, num2, num3): return num1 + num2 + num3
我們想要傳遞一個(gè)列表參數(shù)(假設(shè)這個(gè)列表有三個(gè)元素),可以這么調(diào)用函數(shù)
my_list = [1, 2, 3] add(my_list[0], my_list[1], my_list[2])
這樣子調(diào)用要多敲幾個(gè)鍵盤,多麻煩。我們用 *
號(hào)來實(shí)現(xiàn),前面我們看到 *
可以用在函數(shù)定義的時(shí)候的用法
在函數(shù)調(diào)用的時(shí)候加一個(gè) *
號(hào)可以將一個(gè)列表或元組解構(gòu)成多個(gè)變量
my_list = [1, 2, 3] add(*my_list)
2.雙星號(hào)(**)在函數(shù)中的用法
上面我們介紹了 *
操作符在函數(shù)定義的時(shí)候可以用來接收多個(gè)參數(shù),并且將參數(shù)打包成一個(gè)元組,在函數(shù)調(diào)用的時(shí)候可以對(duì)列表或者元組中的元素進(jìn)行解構(gòu)
那如果對(duì)象是字典,我們可以使用雙星號(hào)操作符(**
)
舉個(gè)例子,假設(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')
那如果我需要增加傳參個(gè)數(shù),我就不得不去函數(shù)定義那里添加形參,這么做太麻煩了
我們可以這么做,我們?cè)?nbsp;kwargs
形參前面加了雙星號(hào),用于接收任意數(shù)量的關(guān)鍵字參數(shù)
def user_info(username, **kwargs): user = get_user(username) user.email = kwargs['email'] user.phone = kwargs['phone'] ...
在形參中,**kwargs
的關(guān)鍵是雙星號(hào),你完全可以使用其他名字例如 **usr
(還是建議用 kwargs)
在函數(shù)定義中,**
操作符會(huì)把傳進(jìn)來的參數(shù)打包成字典
當(dāng)然,我們可以像使用 Python 中的其他字典一樣使用 kwargs
字典,這樣會(huì)使代碼更簡(jiǎn)潔易懂
def user_info(username, **kwargs): user = get_user(username) for k,v in kwargs.items(): ....
除此之外,**
操作符也可以用在函數(shù)調(diào)用的時(shí)候,用于將一個(gè)字典解構(gòu)成多個(gè)變量
dict = { 'email':"blog@example.com" 'phone':"88888" ... } user_info(username,**dict)
3.單星號(hào)接收非關(guān)鍵字參數(shù)
在函數(shù)定義的時(shí)候,單星號(hào)可以獨(dú)立使用,不需要變量(參數(shù))名稱,在Python中是一個(gè)完全有效的函數(shù)定義
def my_function(*, keyword_arg): ...
在上面的函數(shù)定義中,*
號(hào)參數(shù)會(huì)接收所有非關(guān)鍵字參數(shù)(位置參數(shù)),然后剩下的關(guān)鍵字參數(shù)傳給 keyword_arg
如果你在調(diào)用的時(shí)候只傳了位置參數(shù),就會(huì)報(bào)錯(cuò)
my_function(1) """ TypeError: my_function() takes 0 positional arguments but 1 was given """
在上面代碼中,函數(shù)my_function
定義了一個(gè)命名關(guān)鍵字參數(shù)keyword_arg
,但在函數(shù)調(diào)用時(shí)使用位置參數(shù) 1 來傳遞參數(shù),而不是使用關(guān)鍵字參數(shù)的方式,所以報(bào)錯(cuò)
函數(shù)定義中,使用*
來標(biāo)識(shí)位置參數(shù)結(jié)束,之后的參數(shù)都被視為命名關(guān)鍵字參數(shù),這意味著在函數(shù)調(diào)用時(shí)必須傳遞關(guān)鍵字參數(shù)
那如果我們想強(qiáng)制只使用位置參數(shù),而不是上面案例中的只使用關(guān)鍵字參數(shù)該怎么辦
我們使用 /
號(hào)來實(shí)現(xiàn)
def only_positional_arguments(arg1, arg2, /): ...
如果你傳遞關(guān)鍵字參數(shù),會(huì)發(fā)生報(bào)錯(cuò),是不是很有意思
only_positional_arguments(arg1=1, arg2=2) """ TypeError: only_positional_arguments() got some positional-only arguments passed as keyword arguments: 'arg1, arg2' """
4.星號(hào)拓展用法
1、單星號(hào)構(gòu)建或解構(gòu)列表
比如說有下面兩個(gè)列表
my_list_1 = [1, 2, 3] my_list_2 = [10, 20, 30]
我們打算合并這兩個(gè)列表,可以用 +
操作符
merged_list = my_list_1 + my_list_2
但是單星號(hào)更靈活,比如說我們?cè)诤喜⒌臅r(shí)候在中間加一個(gè)元素
num=42 merged_list = [*my_list_1, some_value, *my_list_2]
我們知道,解構(gòu)列表元素的時(shí)候可以這么干
my_list = [1, 2, 3] a, b, c = my_list # a -> 1 # b -> 2 # c -> 3
上面每個(gè)變量都存儲(chǔ)了列表中的元素,那假設(shè)我打算將列表中的第一個(gè)和最后一個(gè)元素放在指定變量中,中間的元素還是作為列表,我該怎么辦
可以使用單星號(hào)
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
需要注意的是,單星號(hào)接收的對(duì)象是列表
my_list = [1, 2, 3] a, *b, c = my_list # a -> 1 # b -> [2] # c -> 3
2、雙星號(hào)構(gòu)建字典
同理,雙星號(hào)可以用于構(gòu)建字典
dict1 = { 'age': '22' } dict2 = { 'email': 'blog@example.com' } user_dict = {'username': 'kanye', **dict1, **dict2}
到此這篇關(guān)于Python中的星號(hào)*還能這么用你知道嗎的文章就介紹到這了,更多相關(guān)Python星號(hào)*內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python傳參時(shí)一個(gè)星號(hào)和兩個(gè)星號(hào)的區(qū)別小結(jié)
- 一文帶你掌握python中*星號(hào)的用法
- Python 中星號(hào)(*)的用法小結(jié)
- python星號(hào)(*)和雙星號(hào)(**)?函數(shù)動(dòng)態(tài)參數(shù)匹配及解包操作方法
- Python中星號(hào)的五種用法小結(jié)
- Python中你所不知道的星號(hào)?*?用法
- Python 帶星號(hào)(* 或 **)的函數(shù)參數(shù)詳解
- python 星號(hào)(*)的多種用途
- Python星號(hào)*與**用法分析
- Python參數(shù)傳遞中雙星號(hào)(**)和單星號(hào)(*)是作用
相關(guān)文章
Python?web實(shí)戰(zhàn)教程之Django文件上傳和處理詳解
Django和Flask都是Python的Web框架,用于開發(fā)Web應(yīng)用程序,這篇文章主要給大家介紹了關(guān)于Python?web實(shí)戰(zhàn)教程之Django文件上傳和處理的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12python+selenium爬取微博熱搜存入Mysql的實(shí)現(xiàn)方法
這篇文章主要介紹了python+selenium爬取微博熱搜存入Mysql的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01python中的線程threading.Thread()使用詳解
這篇文章主要介紹了python中的線程threading.Thread()使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12詳解Python如何查看一個(gè)函數(shù)的參數(shù)
inspect模塊提供了許多用于檢查對(duì)象的工具函數(shù),其中包括用于獲取函數(shù)參數(shù)信息的函數(shù),所以在Python中,大家可以使用inspect模塊來查看一個(gè)函數(shù)的參數(shù)信息,本文就來和大家講講具體操作吧2023-05-05tensorflow 只恢復(fù)部分模型參數(shù)的實(shí)例
今天小編就為大家分享一篇tensorflow 只恢復(fù)部分模型參數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01Python+PyQt5實(shí)現(xiàn)網(wǎng)口功能測(cè)試詳解
這篇文章主要為大家詳細(xì)介紹了Python+PyQt5實(shí)現(xiàn)網(wǎng)口功能測(cè)試的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02python爬蟲爬取某圖書網(wǎng)頁實(shí)例講解
這篇文章主要介紹了python爬蟲爬取某圖書網(wǎng)頁實(shí)例,下面是通過requests庫來對(duì)ajax頁面進(jìn)行爬取的案例,與正常頁面不同,這里我們獲取url的方式也會(huì)不同,這里我們通過爬取一個(gè)簡(jiǎn)單的ajax小說頁面來為大家講解,需要的朋友可以參考下2024-08-08