與其他編程語言相比,Python語言的操作型別更多樣化,
特別是星號(*),在Python中是一個用途廣泛的運算子,而不僅僅用于兩個數字相乘的運算之中,在本文中,我們將討論星號的多種用途,
這里總結了4種星號的應用場景:
- 作為乘法和乘方的運算子
- 表示序列中元素的重復
- 用于收集引數(可以稱之為“打包”)
- 用于容器類物件的解包
下面逐一進行說明,注意:很多人學Python程序中會遇到各種煩惱問題,沒有人解答容易放棄,為此小編建了個Python全堆疊免費答疑.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,不懂的問題有老司機解決里面還有最新Python實戰教程免非下,,一起相互監督共同進步!
乘法或乘方的運算子
對此你一定不陌生,像乘法一樣,Python中也內置了乘方運算子,
>>> 2 * 3
6
>>> 2 ** 3
8
>>> 1.414 * 1.414
1.9993959999999997
>>> 1.414 ** 1.414
1.6320575353248798
復制代碼
重復類串列的容器元素
Python也支持類串列的容器類物件(即序列)與整數相乘,即為按照整數實作重復其中的元素數量,
# Initialize the zero-valued list with 100 length
zeros_list = [0] * 100
# Declare the zero-valued tuple with 100 length
zeros_tuple = (0,) * 100
# Extending the "vector_list" by 3 times
vector_list = [[1, 2, 3]]
for i, vector in enumerate(vector_list * 3):
print("{0} scalar product of vector: {1}".format((i + 1), [(i + 1) * e for e in vector]))
# 1 scalar product of vector: [1, 2, 3]
# 2 scalar product of vector: [2, 4, 6]
# 3 scalar product of vector: [3, 6, 9]
復制代碼
引數收集
很多函式中,都會有不確定個數的引數,例如,如果我們不知道要提供多少個引數,或者因為什么原因必須傳任意個引數等,
在Python中有兩類引數,一類是位置引數,另外一類是關鍵詞引數,前者根據位置確定相應值,后者則是依據引數名稱確定,
在研究任意個位置/關鍵詞引數之前,先討論確定數量的位置引數和關鍵詞引數,
# A function that shows the results of running competitions consisting of 2 to 4 runners.
def save_ranking(first, second, third=None, fourth=None):
rank = {}
rank[1], rank[2] = first, second
rank[3] = third if third is not None else 'Nobody'
rank[4] = fourth if fourth is not None else 'Nobody'
print(rank)
# Pass the 2 positional arguments
save_ranking('ming', 'alice')
# Pass the 2 positional arguments and 1 keyword argument
save_ranking('alice', 'ming', third='mike')
# Pass the 2 positional arguments and 2 keyword arguments (But, one of them was passed as like positional argument)
save_ranking('alice', 'ming', 'mike', fourth='jim')
復制代碼
上述代碼中的函式有2個位置引數:first、second,2個關鍵詞引數:third、fourth,位置引數不能省略,必須給所有的位置引數按照其正確的位置傳值,然而,對于關鍵詞引數,在定義函式的時候你可以設定默認值,如果呼叫函式的時候省略了相應的實參,會以默認值作為實參,即關鍵詞引數可以省略,
如你所見,關鍵詞引數可以省略,所以,它們就不能在未知引數前面進行宣告,如果按照下面的方式宣告引數,就必然拋出例外,
def save_ranking(first, second=None, third, fourth=None):
...
復制代碼
但是,在save_ranking('alice', 'ming', 'mike', fourth='jim')呼叫中,提供了3個位置實參和一個關鍵詞引數,是的,對于關鍵詞引數,你也可以按照位置引數的方式傳值,所對應的關鍵詞能夠接受依據位置所傳的資料,按照此處的呼叫方法,'mike'就自動傳給了third,
以上我們已經討論了引數的基本含義,從上述示例中,我們也能看出來,上面所定義的函式不能接收任意個數的引數,因為該函式的引數是固定數量的,因此,需要對該函式進行改造,讓它能夠接收任意個引數,不論是位置引數還是關鍵詞引數,看下面的示例:
收集位置引數
def save_ranking(*args):
print(args)
save_ranking('ming', 'alice', 'tom', 'wilson', 'roy')
# ('ming', 'alice', 'tom', 'wilson', 'roy')
復制代碼
收集位置引數和關鍵詞引數
def save_ranking(*args, **kwargs):
print(args)
print(kwargs)
save_ranking('ming', 'alice', 'tom', fourth='wilson', fifth='roy')
# ('ming', 'alice', 'tom')
# {'fourth': 'wilson', 'fifth': 'roy'}
復制代碼
在上面的示例中,*args意味著收集任意個數的位置引數,**kwargs意味著收集任意個數的關鍵詞引數,這里的*args和**kwargs可以稱之為打包,
如你所見,在上面我們按照位置或關鍵詞傳了任意個數的引數,按照位置傳的引數被收集到元組中,并用變數args參考;以關鍵詞傳的引數則用變數kwargs參考為字典型別,
前面提到過,關鍵詞引數不能寫在位置引數前面,所以,下面的定義方式是錯誤的:
def save_ranking(**kwargs, *args):
...
復制代碼
任意個數的引數很有價值,在很多開源專案中都能夠看到,一般都是用*args或者**kwargs作為收集任意引數的名稱,當然,你可以用其他名稱,比如*requeired或者**optional等,都可以,只是對于開源專案而言,我們習慣使用*args和**kwargs罷了,
解包
星號還可以用于對容器的解包,這與前面的引數收集類似,比如,有一個包含資料的串列、元組或者字典,還有一個收集任意引數的函式:
from functools import reduce
primes = [2, 3, 5, 7, 11, 13]
def product(*numbers):
p = reduce(lambda x, y: x * y, numbers)
return p
product(*primes)
# 30030
product(primes)
# [2, 3, 5, 7, 11, 13]
復制代碼
因為product()能接收任意引數,我們本來需要將串列中的元素取出來,然后傳給此函式,但在這里,如果以*primes的方式向函式提供primes串列資料,則primes所參考的串列會被解包,其中的每個素數都被傳給函式,并被收集后用變數numbers參考,如果傳該串列primes給函式,就不能解包,numbers所參考的元組中只有一個primes串列,
對于元組也如此,對于字典,需要用**代替*,
headers = {
'Accept': 'text/plain',
'Content-Length': 348,
'Host': 'http://mingrammer.com'
}
def pre_process(**headers):
content_length = headers['Content-Length']
print('content length: ', content_length)
host = headers['Host']
if 'https' not in host:
raise ValueError('You must use SSL for http communication')
pre_process(**headers)
# content length: 348
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# File "<stdin>", line 7, in pre_process
# ValueError: You must use SSL for http communication
復制代碼
還有很多種解包的實作方式,甚至于不針對函式,只是從串列、元組中取出資料,并用動態變數參考,
numbers = [1, 2, 3, 4, 5, 6]
# The left side of unpacking should be list or tuple.
*a, = numbers
# a = [1, 2, 3, 4, 5, 6]
*a, b = numbers
# a = [1, 2, 3, 4, 5]
# b = 6
a, *b, = numbers
# a = 1
# b = [2, 3, 4, 5, 6]
a, *b, c = numbers
# a = 1
# b = [2, 3, 4, 5]
# c = 6
復制代碼
上述操作中說明,可以分別從串列或元組中解包,得到相應值,然后用*a和*b參考解包所得資料,并將其打包為串列,這與前述任意個數的引數是同樣的概念,
結論
以上簡要介紹了Python語言中的星號(*),作為一個運算子,它有很多用途,特別是在“收集引數”中,顯得很重要,但是,初學者容易在此處迷惑,所以,如果你是初學者,上面的內容要認真看一看,
注意:很多人學Python程序中會遇到各種煩惱問題,沒有人解答容易放棄,為此小編建了個Python全堆疊免費答疑.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,不懂的問題有老司機解決里面還有最新Python實戰教程免非下,,一起相互監督共同進步!
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/159129.html
標籤:Python
