python 星號(*) 還能這麼用

来源:https://www.cnblogs.com/edisonfish/archive/2023/06/20/17493391.html
-Advertisement-
Play Games

哈嘍大家好,我是鹹魚 今天跟大家介紹一下 python 當中星號(`*`)的一些用法 首先大家最常見的就是在 python 中 `*` 是乘法運算符,實現乘法 ```python sum = 5 * 5 # 25 ``` 除此之外,還有一種常見的用法就是 `*` 號操作符在函數中的用法 - 單星號( ...


哈嘍大家好,我是鹹魚

今天跟大家介紹一下 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}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Docker提供了基於鏡像的運行環境,可以將操作系統、應用程式以及相關依賴打包,為使用者提供完整的使用體驗,因此一經推出大獲好評,迅速成為主流的軟體開發技術之一。 ...
  • 基於java的高校就業管理系統設計與實現,可適用於高校就業招聘,大學招聘管理系統,校園招聘系統,就業信息管理系統,畢業招聘系統,畢業就業系統,大學生就業招聘平臺,校園就業信息平臺,校園畢業信息管理平臺,大學生就業招聘,大學生畢業招聘管理平臺等等 ...
  • `numpy`作為一個強大的數值計算庫,提供了對多維數組的很多便捷操作。 承接上一篇數組的創建,本篇主要介紹一些數組的基本操作。 # 1. 子數組 首先介紹獲取子數組的方法,提取已有數據的一部分來參與計算是比較常用的功能。 對於一維數組,提取子數組:`arr[start:stop:step]` 1. ...
  • ## 前言 指針和數組之間存在著緊密的關係。在本文中,我們將探討指針和數組的關係、指針算術和數組遍歷、多維數組與指針以及指針數組和數組指針。 ## 一、人物簡介 - 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。 ![img](https://img2023.cnblogs.com/ ...
  • # 1.面向對象思想 在認識類之前,我們需要理解面向對象思想和麵向過程思想。 面向過程思想:要擁有一間房屋,面向過程像是自己來修蓋房屋,如果需要經過選址、購買材料、砌牆、裝修等步驟,面向過程編程,就相當於自己個人來負責這些事情,需要考慮屋子選在什麼地方修建,要哪些材料,怎麼砌牆,怎麼裝修等。每一步都 ...
  • # Inno Setup 結合exe4j打包 Java 程式為 EXE 文件 ## 安裝 鏈接:https://pan.baidu.com/s/1l6qYRi6unjLL_4VVYpsShg 提取碼:bzd6 文件內容: ![1687224367776](https://img2023.cnblog ...
  • ## 1、安裝ES和Kibana ### kibana和ES的關係 ![image](https://img2023.cnblogs.com/blog/3216427/202306/3216427-20230620110520834-246432673.png) ### ES安裝 > 可以自己使用d ...
  • 二進位補碼(Binary Two's Complement)是一種表示有符號整數的方法,在電腦中廣泛使用。它是通過對正數取反加一得到負數的表示方式。 在二進位補碼表示中,一個固定位數的整數由固定數量的二進位位表示,其中最高位被用作符號位。對於N位的二進位補碼表示,最高位(最左側的位)為符號位,0表 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...