網站首頁 編程語言 正文
1. 引言
星號* 往往被稱為乘法運算符,是所有程序中最為常用的運算符號之一,在Python 中,星號還有很多隱藏的強大功能。
本文將用最容易理解的例子來解釋星號*的 五個使用場景,從初級用法到高階用法。
閑話少說,我們直接開始吧!
2. 乘法和冪運算符
最簡單的用法是利用星號作為基本的運算符:
- 單個 * 用于乘法運算
- 兩個 ** 表示冪運算
相關樣例用例代碼如下:
>>> 2*3
>>> 6
>>> 2**3
>>> 8
3. 函數接收數量不固定的入參
一般來說,函數往往接收固定數量的參數;但是如果我們需要更大的靈活性,比如當不確定將傳遞多少個參數時,此時將是星號* 發揮作用的時候。
def print_genius(*names):
? ? print(type(names))
? ? for n in names:
? ? ? ? print(n)
print_genius('Elon Mask', 'Du Fu ', 'Li Bai')
# <class 'tuple'>
# Elon Mask
# Du Fu?
# Li Bai
def top_genius(**names):
? ? print(type(names))
? ? for k, v in names.items():
? ? ? ? print(k, v)
top_genius(Top1="Elon Mask", Top2="Du Fu", Top3="Li Bai")
# <class 'dict'>
# Top1 Elon Mask
# Top2 Du Fu
# Top3 Li Bai
如上例所示,在定義函數時,我們可以定義一個以一個或兩個星號為前綴的參數,以捕獲不限制數量的參數輸入。總結如下:
- 以 一個 * 為前綴的參數可以將任意數量的參數以元組形式傳入
- 以兩個 ** 為前綴的參數可以將任意數量的參數以字典形式傳入
按照慣例,當我們定義的函數接收不定數量的參數時,我們一般采用以下函數定義形式:
def func(*args, **kwargs):
pass
4. 限制函數入參僅以關鍵字形式輸入
星號* 的一個非常酷的用法是使函數只能接收關鍵字參數。
很難理解,我們舉例來說明:
def genius(*, first_name, last_name):
? ? print(first_name, last_name)
# genius('Li','Bai')
# TypeError: genius() takes 0 positional arguments but 2 were given
genius(first_name='Li', last_name='Bai')
# Li Bai
上述代碼采用了星號* 限制了星號之后的參數必須采用關鍵字形式來調用上述函數。
實際上,如果我們只是想將一些參數限制為僅以關鍵字形式輸入同時另一部分參數依舊按照位置形式輸入,此時我們可以將位置參數放置在星號之前。
樣例代碼如下:
def genius(age, *, first_name, last_name):
print(first_name, last_name, 'is', age)
genius(28, first_name='Li', last_name='Bai')
# Li Bai is 28
5. 可迭代對象解包操作
我們可以使用星號* 來解包可迭代對象,這將使我們的程序更加清晰且優雅。
例如,如果我們要將不同的可迭代對象(例如一個列表,一個元組和一個集合)組合成一個新列表,哪種方法最好?
顯然,我們可以使用 for 循環來迭代所有元素并將它們逐一添加到新列表中,樣例代碼如下:
A = [1, 2, 3]
B = (4, 5, 6)
C = {7, 8, 9}
L = []
for a in A:
L.append(a)
for b in B:
L.append(b)
for c in C:
L.append(c)
print(L)
# [1, 2, 3, 4, 5, 6, 8, 9, 7]
上述實現方式雖然可以完成我們的目的,但是代碼看起來太冗長了,而且不是很Pythonic 。
推薦的改進方式是使用列表生成式,如下所示:
A = [1, 2, 3]
B = (4, 5, 6)
C = {7, 8, 9}
L = [a for a in A] + [b for b in B] + [c for c in C]
print(L)
# [1, 2, 3, 4, 5, 6, 8, 9, 7]
上述代碼中,我們將三個 for 循環減少為一行列表生成式。它已經是Pythonic了,但不一定是最簡單的!
是時候看看星號的強大之處啦。
A = [1, 2, 3]
B = (4, 5, 6)
C = {7, 8, 9}
L = [*A, *B, *C]
print(L)
# [1, 2, 3, 4, 5, 6, 8, 9, 7]
如上所述,我們可以使用星號作為可迭代項的前綴來解包它們的元素。
順便說一句,如果我們利用一個*作為dict 的前綴,它的key 將被解包;如果我們使用雙星號** 作為前綴,其value 將被解包;此時我們必須顯示使用key 來接收解包后的value 。
樣例如下:
D = {'first': 1, 'second': 2, 'third': 3}
print(*D)
# first second third
# print(**D)
# TypeError: 'first' is an invalid keyword argument for print()
print('{first},{second},{third}'.format(**D))
# 1,2,3
6. 擴展可迭代對象解包
解包的語法可以讓我們的代碼更加簡潔,樣例如下:
L = [1, 2, 3, 4, 5, 6, 7, 8]
a, *b = L
print(a)
# 1
print(b)
# [2, 3, 4, 5, 6, 7, 8]
7. 結論
星號* 是程序中最常用的運算符之一。除了用作乘法運算符之外,它在Python中還有一些優雅而強大的用法,這將幫助我們的代碼變得更加Pythonic 。
本文重點講解了星號的五種用法,并給出了相應的代碼示例,您學廢了嘛?
原文鏈接:https://blog.csdn.net/sgzqc/article/details/128261430
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-08-11 C#實現快速查詢文件的方法_C#教程
- 2022-02-22 使用Flex布局實現頭部固定,內容區域滾動
- 2022-02-27 Error in render: “TypeError: Cannot read propertie
- 2022-04-11 python實現簡易聊天對話框_python
- 2022-02-25 .gitignore 中增加了 .idea/ workspace.xml失效解決方案
- 2022-09-13 Python運算符的應用超全面詳細教程_python
- 2022-03-05 Flutter基本組件Basics?Widget學習_Android
- 2022-09-10 Go語言中使用urfave/cli命令行框架_Golang
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支