parameter 是函數(shù)定義的參數(shù)形式
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設,紅寺堡企業(yè)網(wǎng)站建設,紅寺堡品牌網(wǎng)站建設,網(wǎng)站定制,紅寺堡網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,紅寺堡網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
argument 是函數(shù)調(diào)用時傳入的參數(shù)實體。
對于函數(shù)調(diào)用的傳參模式,一般有兩種:
此外,
也是關鍵字傳參
python的函數(shù)參數(shù)定義一般來說有五種: 位置和關鍵字參數(shù)混合 , 僅位置參數(shù) , 僅關鍵字參數(shù) , 可變位置參數(shù) , 可變關鍵字參數(shù) 。其中僅位置參數(shù)的方式僅僅是一個概念,python語法中暫時沒有這樣的設計。
通常我們見到的函數(shù)是位置和關鍵字混合的方式。
既可以用關鍵字又可以用位置調(diào)用
或
這種方式的定義只能使用關鍵字傳參的模式
f(*some_list) 與 f(arg1, arg2, ...) (其中some_list = [arg1, arg2, ...])是等價的
網(wǎng)絡模塊request的request方法的設計
多數(shù)的可選參數(shù)被設計成可變關鍵字參數(shù)
有多種方法能夠為函數(shù)定義輸出:
非?;逎?/p>
如果使用可變對象作為函數(shù)的默認參數(shù),會導致默認參數(shù)在所有的函數(shù)調(diào)用中被共享。
例子1:
addItem方法的data設計了一個默認參數(shù),使用不當會造成默認參數(shù)被共享。
python里面,函數(shù)的默認參數(shù)被存在__default__屬性中,這是一個元組類型
例子2:
在例子1中,默認參數(shù)是一個列表,它是mutable的數(shù)據(jù)類型,當它寫進 __defauts__屬性中時,函數(shù)addItem的操作并不會改變它的id,相當于 __defauts__只是保存了data的引用,對于它的內(nèi)存數(shù)據(jù)并不關心,每次調(diào)用addItem,都可以修改 addItem.__defauts__中的數(shù)據(jù),它是一個共享數(shù)據(jù)。
如果默認參數(shù)是一個imutable類型,情況將會不一樣,你無法改變默認參數(shù)第一次存入的值。
例子1中,連續(xù)調(diào)用addItem('world') 的結(jié)果會是
而不是期望的
Python函數(shù)的參數(shù)類型主要包括必選參數(shù)、可選參數(shù)、可變參數(shù)、位置參數(shù)和關鍵字參數(shù),本文介紹一下他們的定義以及可變數(shù)據(jù)類型參數(shù)傳遞需要注意的地方。
必選參數(shù)(Required arguments)是必須輸入的參數(shù),比如下面的代碼,必須輸入2個參數(shù),否則就會報錯:
其實上面例子中的參數(shù) num1和num2也屬于關鍵字參數(shù),比如可以通過如下方式調(diào)用:
執(zhí)行結(jié)果:
可選參數(shù)(Optional arguments)可以不用傳入函數(shù),有一個默認值,如果沒有傳入會使用默認值,不會報錯。
位置參數(shù)(positional arguments)根據(jù)其在函數(shù)定義中的位置調(diào)用,下面是pow()函數(shù)的幫助信息:
x,y,z三個參數(shù)的的順序是固定的,并且不能使用關鍵字:
輸出:
在上面的pow()函數(shù)幫助信息中可以看到位置參數(shù)后面加了一個反斜杠 / ,這是python內(nèi)置函數(shù)的語法定義,Python開發(fā)人員不能在python3.8版本之前的代碼中使用此語法。但python3.0到3.7版本可以使用如下方式定義位置參數(shù):
星號前面的參數(shù)為位置參數(shù)或者關鍵字參數(shù),星號后面是強制關鍵字參數(shù),具體介紹見強制關鍵字參數(shù)。
python3.8版本引入了強制位置參數(shù)(Positional-Only Parameters),也就是我們可以使用反斜杠 / 語法來定義位置參數(shù)了,可以寫成如下形式:
來看下面的例子:
python3.8運行:
不能使用關鍵字參數(shù)形式賦值了。
可變參數(shù) (varargs argument) 就是傳入的參數(shù)個數(shù)是可變的,可以是0-n個,使用星號( * )將輸入?yún)?shù)自動組裝為一個元組(tuple):
執(zhí)行結(jié)果:
關鍵字參數(shù)(keyword argument)允許將任意個含參數(shù)名的參數(shù)導入到python函數(shù)中,使用雙星號( ** ),在函數(shù)內(nèi)部自動組裝為一個字典。
執(zhí)行結(jié)果:
上面介紹的參數(shù)可以混合使用:
結(jié)果:
注意:由于傳入的參數(shù)個數(shù)不定,所以當與普通參數(shù)一同使用時,必須把帶星號的參數(shù)放在最后。
強制關鍵字參數(shù)(Keyword-Only Arguments)是python3引入的特性,可參考:。 使用一個星號隔開:
在位置參數(shù)一節(jié)介紹過星號前面的參數(shù)可以是位置參數(shù)和關鍵字參數(shù)。星號后面的參數(shù)都是強制關鍵字參數(shù),必須以指定參數(shù)名的方式傳參,如果強制關鍵字參數(shù)沒有設置默認參數(shù),調(diào)用函數(shù)時必須傳參。
執(zhí)行結(jié)果:
也可以在可變參數(shù)后面命名關鍵字參數(shù),這樣就不需要星號分隔符了:
執(zhí)行結(jié)果:
在Python對象及內(nèi)存管理機制中介紹了python中的參數(shù)傳遞屬于對象的 引用傳遞 (pass by object reference),在編寫函數(shù)的時候需要特別注意。
先來看個例子:
執(zhí)行結(jié)果:
l1 和 l2指向相同的地址,由于列表可變,l1改變時,l2也跟著變了。
接著看下面的例子:
結(jié)果:
l1沒有變化!為什么不是[1, 2, 3, 4]呢?
l = l + [4]表示創(chuàng)建一個“末尾加入元素 4“的新列表,并讓 l 指向這個新的對象,l1沒有進行任何操作,因此 l1 的值不變。如果要改變l1的值,需要加一個返回值:
結(jié)果:
下面的代碼執(zhí)行結(jié)果又是什么呢?
執(zhí)行結(jié)果:
和第一個例子一樣,l1 和 l2指向相同的地址,所以會一起改變。這個問題怎么解決呢?
可以使用下面的方式:
也可以使用淺拷貝或者深度拷貝,具體使用方法可參考Python對象及內(nèi)存管理機制。這個問題在Python編程時需要特別注意。
本文主要介紹了python函數(shù)的幾種參數(shù)類型:必選參數(shù)、可選參數(shù)、可變參數(shù)、位置參數(shù)、強制位置參數(shù)、關鍵字參數(shù)、強制關鍵字參數(shù),注意他們不是完全獨立的,比如必選參數(shù)、可選參數(shù)也可以是關鍵字參數(shù),位置參數(shù)可以是必選參數(shù)或者可選參數(shù)。
另外,python中的參數(shù)傳遞屬于對象的 引用傳遞 ,在對可變數(shù)據(jù)類型進行參數(shù)傳遞時需要特別注意,如有必要,使用python的拷貝方法。
參考文檔:
--THE END--
創(chuàng)建一個函數(shù)用來計算三個數(shù)的和,如下:
下來,我們對其進行調(diào)用:
假設我們要計算這個函數(shù)返回結(jié)果的平均值。那么此時,我們只需將和值除以參數(shù)個數(shù)即可,那么參數(shù)個數(shù)怎么獲取呢?你可能會說:數(shù)一下就知道了。那么假設此時有很多的參數(shù),你還去數(shù)嗎?此時,明顯這個方法是不恰當?shù)?,那么有沒有更加方便、高效的方法呢?我們接著往下看。
通過上面這個例子,我們不但可以獲取參數(shù)個數(shù),還可以獲取所有變量名以及默認返回值。此時,我們只需根據(jù)自己的需求,去應用就可以了,那么以上的問題,就自然解決了。
參數(shù)可以是任意類型。
比如可以是列表。
-------------------------------
library=['python精通','MySQL','數(shù)據(jù)分析','人工智能']
#形參
def add_book(bookname):
library.append(bookname)
print('圖書添加成功!')
pass
def show_book(books):
for book in books:
print(book)
pass
pass
#調(diào)用函數(shù)
add_book('新概念英語')
show_book(library)
------------------------------
#輸出列表中所有大于50的數(shù)
list1=[23,45,77,88,58,10]
def get_list(list_1):
new_list=[ ]
for e in list_1:
if e=50:
new_list.append(e)
pass
pass
print(new_list)
pass
#調(diào)用函數(shù)
get_list(list1) #[77,88,58]
------------------------------
#刪除列表中小于50的數(shù)
def remove_from_list(list_1):
n=0
while nlen(list_1): p="" /len(list_1):
if list_1[n]50:
list_1.remove(list_1[n])
pass
else:
n+=1
pass
pass
print(list_1)
pass
#調(diào)用函數(shù)
remove_from_list(list1) #[77,88,58]