楠木軒

小小星號創奇蹟:一個字符就能改變你編寫Python代碼的方式

由 都超英 發佈於 經典

全文共1490字,預計學習時長7分鐘

圖源:unsplash

Python以句法簡單、簡潔而聞名,只需掌握簡單的英語就能理解其代碼。對初學者來説極具吸引力,它沒有聲明,沒有花哨的字符或者奇怪的句法。正因如此,Python才得以風靡全球。

除此之外,Python還具備一些很酷的特點,比如裝飾器和列表解析。這些特點確實能創造奇蹟,但*也值得這一美名,小小字符能帶來翻天覆地的變化。

先從一個小技巧開始:

In [1]:
first_dict= {'key1': 'hello', 'key2': 'world'}
second_dict= {'key3': 'whats', 'key4': 'up'}
In [2]:
#joins the dicts
combined_dict= {**first_dict, **second_dict}
combined_dict
Out[2]:
{'key1': 'hello', 'key2': 'world', 'key3':'whats', 'key4': 'up'}
In [ ]:

這是合併字典的超簡單方法!你能明顯看出,我僅用了幾個星號就將字典結合了起來,我接下來會一一解釋。

星號在哪些地方發揮作用?

除了眾所周知的乘法作用,星號還能讓你輕鬆完成一些重要任務,例如解包。一般來説,你可以使用星號來解包可迭代對象,也能對雙向可迭代對象(就像字典一樣)進行雙重解包。

In [7]:
# unpackingan iterable
[xfor x inrange(100)] == [*range(100)]
Out[7]:
True
In [8]:
#unpkacing dict keys
d = {'key1': 'A'}
list(d.keys()) == [*d]
Out[8]:
True
In [9]:
#unpacking whole dict
d == {**d}
Out[9]:
True

解包的力量

不要破壞別人的代碼

大家也越來越理解這一點,但仍然有人沒有遵守。開發者寫出的每一個函數都有其特徵。如果函數被改變,那麼所有基於你的代碼而撰寫的代碼都會被破壞。

圖源:unsplash

我將介紹一種簡單的方法,你可以為自己的函數增添更多功能性,同時也不會破壞其向後兼容性,最後你會得到更多的模塊化代碼。

在你的代碼中輸入*args和**kwrags,它們會將所有輸入都解包進函數。單星號針對標準的可迭代對象,雙星號針對字典類的雙向可迭代對象,舉例説明:

In [1]:
defversion1(a, b):
print(a)
print(b)
In [2]:
version1(4,5)
4
5
In [3]:
#code breaks
version1(4,5,6)
---------------------------------------------------------------------------
TypeError Traceback(most recent call last)
in
1# code breaks
----> 2 version1(4,5,6)
TypeError: version1() takes 2 positionalarguments but 3 were given
In [4]:
defversion2(a, b, *args):
print(a)
print(b)
# new function.
if args:
for c in args:
print(c)
In [5]:
version2(1,2,3,4,5)
1
2
3
4
5
In [6]:
#code breaks
version2(1,2,3,4,5, Extra=10)
---------------------------------------------------------------------------
TypeError Traceback(most recent call last)
in
1 # code breaks
----> 2 version2(1,2,3,4,5, Extra=10)
TypeError: version2() got an unexpectedkeyword argument 'Extra'
In [7]:
defversion3(a, b , *args, **kwrags):
print(a)
print(b)
# new function.
if args:
for c in args:
print(c)
if kwrags:
for key, value inzip(kwrags.keys(), kwrags.values()):
print(key,':', value)
In [8]:
version3(1,2,3,4,5, Extra=10)
1
2
3
4
5
Extra : 10
In [ ]:

工作代碼和破解代碼

這個例子展示瞭如何使用args和kwargs來接收之後的參數,並留到將來使用,同時也不會破壞你函數中原有的call函數。

星號是Python中很重要的一部分,但卻常常被我們忽略。事實上,我們平常沒有注意到的關鍵點還有很多,值得我們去一點點探索。