python 的函數(shù)參數(shù)類型分為4種:
創(chuàng)新互聯(lián)公司主營嘉禾網站建設的網絡公司,主營網站建設方案,app開發(fā)定制,嘉禾h5微信小程序開發(fā)搭建,嘉禾網站營銷推廣歡迎嘉禾等地區(qū)企業(yè)咨詢
1.位置參數(shù):調用函數(shù)時根據(jù)函數(shù)定義的參數(shù)位置來傳遞參數(shù),位置參數(shù)也可以叫做必要參數(shù),函數(shù)調用時必須要傳的參數(shù)。
當參數(shù)滿足函數(shù)必要參數(shù)傳參的條件,函數(shù)能夠正常執(zhí)行:
add(1,2) #兩個參數(shù)的順序必須一一對應,且少一個參數(shù)都不可以
當我們運行上面的程序,輸出:
當函數(shù)需要兩個必要參數(shù),但是調用函數(shù)只給了一個參數(shù)時,程序會拋出異常
add(1)
當我們運行上面的程序,輸出:
當函數(shù)需要兩個必要參數(shù),但是調用函數(shù)只給了三個參數(shù)時,程序會拋出異常
add(1,2,3)
當我們運行上面的程序,輸出
2.關鍵字參數(shù):用于函數(shù)調用,通過“鍵-值”形式加以指定。可以讓函數(shù)更加清晰、容易使用,同時也清除了參數(shù)的順序需求。
add(1,2) # 這種方式傳參,必須按順序傳參:x對應1,y對應:2
add(y=2,x=1) #以關健字方式傳入參數(shù)(可以不按順序)
正確的調用方式
add(x=1, y=2)
add(y=2, x=1)
add(1, y=2)
以上調用方式都是允許的,能夠正常執(zhí)行
錯誤的調用方式
add(x=1, 2)
add(y=2, 1)
以上調用都會拋出SyntaxError 異常
上面例子可以看出:有位置參數(shù)時,位置參數(shù)必須在關鍵字參數(shù)的前面,但關鍵字參數(shù)之間不存在先后順序的
3.默認參數(shù):用于定義函數(shù),為參數(shù)提供默認值,調用函數(shù)時可傳可不傳該默認參數(shù)的值,所有位置參數(shù)必須出現(xiàn)在默認參數(shù)前,包括函數(shù)定義和調用,有多個默認參數(shù)時,調用的時候,既可以按順序提供默認參數(shù),也可以不按順序提供部分默認參數(shù)。當不按順序提供部分默認參數(shù)時,需要把參數(shù)名寫上
默認參數(shù)的函數(shù)定義
上面示例第一個是正確的定義位置參數(shù)的方式,第二個是錯誤的,因為位置參數(shù)在前,默認參數(shù)在后
def add1(x=1,y) 的定義會拋出如下異常
默認參數(shù)的函數(shù)調用
注意:定義默認參數(shù)默認參數(shù)最好不要定義為可變對象,容易掉坑
不可變對象:該對象所指向的內存中的值不能被改變,int,string,float,tuple
可變對象,該對象所指向的內存中的值可以被改變,dict,list
這里只要理解一下這個概念就行或者自行百度,后續(xù)會寫相關的專題文章講解
舉一個簡單示例
4.可變參數(shù)區(qū)別:定義函數(shù)時,有時候我們不確定調用的時候會多少個參數(shù),j就可以使用可變參數(shù)
可變參數(shù)主要有兩類:
*args: (positional argument) 允許任意數(shù)量的可選位置參數(shù)(參數(shù)),將被分配給一個元組, 參數(shù)名前帶*,args只是約定俗成的變量名,可以替換其他名稱
**kwargs:(keyword argument) 允許任意數(shù)量的可選關鍵字參數(shù),,將被分配給一個字典,參數(shù)名前帶**,kwargs只是約定俗成的變量名,可以替換其他名稱
*args 的用法
args 是用來傳遞一個非鍵值對的可變數(shù)量的參數(shù)列表給函數(shù)
語法是使用 符號的數(shù)量可變的參數(shù); 按照慣例,通常是使用arg這個單詞,args相當于一個變量名,可以自己定義的
在上面的程序中,我們使用* args作為一個可變長度參數(shù)列表傳遞給add()函數(shù)。 在函數(shù)中,我們有一個循環(huán)實現(xiàn)傳遞的參數(shù)計算和輸出結果。
還可以直接傳遞列表或者數(shù)組的方式傳遞參數(shù),以數(shù)組或者列表方式傳遞參數(shù)名前面加(*) 號
理解* * kwargs
**kwargs 允許你將不定長度的鍵值對, 作為參數(shù)傳遞給函數(shù),這些關鍵字參數(shù)在函數(shù)內部自動組裝為一個dict
下篇詳細講解 *args, **kwargs 的參數(shù)傳遞和使用敬請關注
在python中可以用id()函數(shù)獲取對象的內存地址。
#例如:
object = 1 + 2
print(id(object)) #4304947776
python的內存駐留機制,是一種節(jié)省內存的方案,它將int, str, bool類型的數(shù)據(jù)做成小數(shù)據(jù)池。當程序要創(chuàng)建字符串等對象前會先檢查池中是否有滿足的字符串。
駐留機制節(jié)省大量的重復內存。在內部,小數(shù)據(jù)池是由一個全局的dict 維護,該字典中的對象成了單例模式,從而節(jié)省內存。
變量 interned 就是全局存放字符串池的字典的變量名 interned = PyDict_New() ,為了讓 intern 機制中的字符串不被回收,設置字典時 PyDict_SetDefault(interned, s, s); 將字符串作為鍵同時也作為值進行設置,這樣對于字符串對象的引用計數(shù)就會進行兩次 +1 操作,這樣存于字典中的對象在程序結束前永遠不會為 0,這也是 y_REFCNT(s) -= 2; 將計數(shù)減 2 的原因。
從函數(shù)參數(shù)中可以看到其實字符串對象還是被創(chuàng)建了,內部其實始終會為字符串創(chuàng)建對象,但經過 inter 機制檢查后,臨時創(chuàng)建的字符串會因引用計數(shù)為 0 而被銷毀,臨時變量在內存中曇花一現(xiàn)然后迅速消失。
指定要駐留的字符串:
為什么要進行字符串駐留呢?
總結:
系統(tǒng)維護一個interned全局字典,記錄已被駐留的字符串對象,當新字符串a對象需要駐留時,先在interned中查找是否存在,若存在則指向已存在的字符串對象,a對象的引用計數(shù)減1,若不存在,則記錄a對象到interned中。
一、對象的引用計數(shù)機制
python內部使用引用計數(shù),來保持追蹤內存中的對象,所有對象都有引用計數(shù)
引用計數(shù)增加的情況:
1. 一個對象分配一個新名稱
2. 將其放入一個容器中
引用計數(shù)減少的情況:
1. 使用del語句對對象別名顯示的銷毀
2. 引用超出作用域或被重新賦值
sys.getrefcount()函數(shù)可以獲得對象的當前引用計數(shù)
多數(shù)情況下,引用計數(shù)比你猜測的要大得多。對于不可變數(shù)據(jù)(如數(shù)字和字符串),解釋器會在程序的不同部分共享內存,以便節(jié)約內存。
二、垃圾回收
當一個對象的引用計數(shù)歸零時,它將被垃圾收集機制處理掉。當兩個對象a 和b 相互引用時,del語句可以減少a和b的引用次數(shù),并銷毀用于引用底層對象的名稱。然而由于每個對象都包含一個對其他對象的應用,因此引用計數(shù)不會歸零,對象也不會銷毀。(從而導致內存泄漏)。為解決這一問題,解釋器會定期執(zhí)行一個循環(huán)檢測器,搜索不可訪問對象的循環(huán)并刪除它們。
三、內存池機制
python提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統(tǒng)。
1. Pymalloc機制。為了加速python的執(zhí)行效率,python引入了一個內存池機制,用于管理對小塊內存的申請和釋放。
2. python中所有小于256個字節(jié)的對象都使用pymalloc實現(xiàn)的分配器,而大的對象則使用系統(tǒng)的malloc。
3. 對于python對象,如整數(shù),浮點數(shù)和list,都有其獨立的私有內存池,對象間不共享它們的內存池。也就是說如果你分配又釋放了大量的整數(shù),用于緩存這些整數(shù)的內存就不能再分配給浮點數(shù)。
python控制內存的方法:
一、對象的引用計數(shù)機制
二、垃圾回收機制
三、內存池機制
一、對象的引用計數(shù)機制
Python內部使用引用計數(shù),來保持追蹤內存中的對象,所有對象都有引用計數(shù)。
引用計數(shù)增加的情況:
1、一個對象分配一個新名稱
2、將其放入一個容器中(如列表、元組或字典)
引用計數(shù)減少的情況:
1、使用del語句對對象別名顯示的銷毀
2、引用超出作用域或被重新賦值 sys.getrefcount( )函數(shù)可以獲得對象的當前引用計數(shù)
多數(shù)情況下,引用計數(shù)比你猜測得要大得多。對于不可變數(shù)據(jù)(如數(shù)字和字符串),解釋器會在程序的不同部分共享內存,以便節(jié)約內存。
二、垃圾回收
1、當一個對象的引用計數(shù)歸零時,它將被垃圾收集機制處理掉。
2、當兩個對象a和b相互引用時,del語句可以減少a和b的引用計數(shù),并銷毀用于引用底層對象的名稱。然而由于每個對象都包含一個對其他對象的應用,因此引用計數(shù)不會歸零,對象也不會銷毀。(從而導致內存泄露)。為解決這一問題,解釋器會定期執(zhí)行一個循環(huán)檢測器,搜索不可訪問對象的循環(huán)并刪除它們。
三、內存池機制
Python提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統(tǒng)。
1、Pymalloc機制。為了加速Python的執(zhí)行效率,Python引入了一個內存池機制,用于管理對小塊內存的申請和釋放。
2、Python中所有小于256個字節(jié)的對象都使用pymalloc實現(xiàn)的分配器,而大的對象則使用系統(tǒng)的malloc。
3、對于Python對象,如整數(shù),浮點數(shù)和List,都有其獨立的私有內存池,對象間不共享他們的內存池。也就是說如果你分配又釋放了大量的整數(shù),用于緩存這些整數(shù)的內存就不能再分配給浮點數(shù)。
更多Python知識請關注Python視頻教程欄目。
由于python中萬物皆對象,所以python的存儲問題是對象的存儲問題。實際上,對于每個對象,python會分配一塊內存空間去存儲它。
那么python是如何進行內存分配,如何進行內存管理,又是如何釋放內存的呢?
總結起來有一下幾個方面:引用計數(shù),垃圾回收,內存池機制
python內部使用引用計數(shù),來保持追蹤內存中的對象,Python內部記錄了對象有多少個引用,即引用計數(shù)
1、對象被創(chuàng)建 a= 'abc'
2、對象被引用 b =a
3、對象被其他的對象引用 li = [1,2,a]
4、對象被作為參數(shù)傳遞給函數(shù):foo(x)
1、變量被刪除 del a 或者 del b
2、變量引用了其他對象 b = c 或者 a = c
3、變量離開了所在的作用域(函數(shù)調用結束) 比如上面的foo(x)函數(shù)結束時,x指向的對象引用減1。
4、在其他的引用對象中被刪除(移除) li.remove(a)
5、窗口對象本身被銷毀:del li,或者窗口對象本身離開了作用域。
即對象p中的屬性引用d,而對象d中屬性同時來引用p,從而造成僅僅刪除p和d對象,也無法釋放其內存空間,因為他們依然在被引用。深入解釋就是,循環(huán)引用后,p和d被引用個數(shù)為2,刪除p和d對象后,兩者被引用個數(shù)變?yōu)?,并不是0,而python只有在檢查到一個對象的被引用個數(shù)為0時,才會自動釋放其內存,所以這里無法釋放p和d的內存空間
垃圾回收機制: ① 引用計數(shù) , ②標記清除 , ③分帶回收
引用計數(shù)也是一種垃圾收集機制, 而且也是一種最直觀, 最簡單的垃圾收集技術.當python某個對象的引用計數(shù)降為 0 時, 說明沒有任何引用指向該對象, 該對象就成為要被回收的垃圾了.(如果出現(xiàn)循環(huán)引用的話, 引用計數(shù)機制就不再起作用了)
優(yōu)點:簡單實時性,缺點:維護引用計數(shù)消耗資源,且無法解決循環(huán)引用。
如果兩個對象的引用計數(shù)都為 1 , 但是僅僅存在他們之間的循環(huán)引用,那么這兩個對象都是需要被回收的, 也就是說 它們的引用計數(shù)雖然表現(xiàn)為非 0 , 但實際上有效的引用計數(shù)為 0 ,.所以先將循環(huán)引用摘掉, 就會得出這兩個對象的有效計數(shù).
標記清除算法也有明顯的缺點:清除非活動的對象前它必須順序掃描整個堆內存,哪怕只剩下小部分活動對象也要掃描所有對象。
為了提高效率,有很多對象,清理了很多次他依然存在,可以認為,這樣的對象不需要經?;厥?,可以把它分到不同的集合,每個集合回收的時間間隔不同。簡單的說這就是python的分代回收。
具體來說,python中的垃圾分為1,2,3代,在1代里的對象每次回收都會去清理,當清理后有引用的對象依然存在,此時他會進入2代集合,同理2代集合清理的時候存在的對象會進入3代集合。
每個集合的清理時間如何分配:會先清理1代垃圾,當清理10次一代垃圾后會清理一次2代垃圾,當清理10次2代垃圾后會清理3代垃圾。
在Python中,許多時候申請的內存都是小塊的內存,這些小塊內存在申請后,很快又會被釋放,當創(chuàng)建大量消耗小內存的對象時,頻繁調用new/malloc會導致大量的內存碎片,致使效率降低。
內存池的概念就是預先在內存中申請一定數(shù)量的,大小相等的內存塊留作備用,當有新的內存需求時,就先從內存池中分配內存給這個需求,不夠了之后再申請新的內存。這樣做最顯著的優(yōu)勢就是能夠減少內存碎片,提升效率。
Python中有分為大內存和小內存:(256K為界限分大小內存)
大小小于256kb時,pymalloc會在內存池中申請內存空間,當大于256kb,則會直接執(zhí)行 new/malloc 的行為來申請新的內存空間
在python中 -5到256之間的數(shù)據(jù),系統(tǒng)會默認給每個數(shù)字分配一個內存區(qū)域,其后有賦值時都會指向固定的已分配的內存區(qū)域
在運行py程序的時候,解釋器會專門分配一塊空白的內存,用來存放純單詞字符組成的字符串(數(shù)字,字母,下劃線)
字符串賦值時,會先去查找要賦值的字符串是否已存在于內存區(qū)域,已存在,則指向已存在的內存,不存在,則會在大整數(shù)池中分配一塊內存存放此字符串
網站欄目:python內存函數(shù),python的內存
網頁鏈接:http://chinadenli.net/article46/hsceeg.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站設計公司、品牌網站建設、App設計、網頁設計公司、企業(yè)網站制作、標簽優(yōu)化
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)