函式是可重用的程式**塊。函式的作用,不僅可以實現**的復用,更能實現**的一致性。一致性指的是,只要修改函式的**,則所有呼叫該函式的地方都能得到體現。
在編寫函式時,函式體中的**寫法和我們前面講述的基本一致,只是對**實現了封裝,並增加了函式呼叫、傳遞引數、返回計算結果等內容。
為了讓大家更容易理解,掌握的更深刻。我們也要深入記憶體底層進行分析。絕大多數語言記憶體底層都是高度相似的,這樣大家掌握了這些內容也便於以後學習其他語言。
1.乙個程式由乙個個任務組成;函式就是代表乙個任務或者乙個功能。
2.函式是**復用的通用機制。
python中函式分為如下幾類∶
我們前面使用的str()、list()、len()等這些都是內建函式,我們可以拿來直接使用。
我們可以通過import語句導入庫,然後使用其中定義的函式
使用者自己定義的函式,顯然也是開發中適應使用者自身需求定義的函式。今天我們學習的就是如何自定義函式。
核心要點
語法:def 函式名([引數列表]):
『』『文件字串』『』
函式體/若干語句
1.我們使用def來定義函式,然後就是乙個空格和函式名稱;
(1) python執行def時,會建立乙個函式物件,並繫結到函式名變數上。
2.引數列表
(1)圓括號內是形式引數列表,有多個引數則使用逗號隔開
(2)形式引數不需要宣告型別,也不需要指定函式返回值型別
(3)無引數,也必須保留空的圓括號
(4)實參列表必須與形參列表一一對應
3.return返回值
(1)如果函式體中包含return語句,貝則結束函式執行並返回值;
(2)如果函式體中不包含return語句,貝則返回none值。
4.呼叫函式之前,必須要先定義函式,即先呼叫def 建立函式物件
(1)內建函式物件會自動建立
(2)標準庫和第三方庫函式,通過import匯入模組時,會執行模組中的def語句我們通過實際定義函式來學習函式的定義方式。
defprintmax(a, b):
'''實現兩個數的比較,並返回較大的值
'''if a >b:
print(a, "
較大值"
)
else
:
print(b, "
較大值"
)printmax(10,20)
上面的printmax函式中,在定義時寫的printmax(a,b)。a和b稱為「形式引數」,簡稱「形參」。也就是說,形式引數是在定義函式時使用的。形式引數的命名只要符合「標
識符」命名規則即可。呼叫函式時,傳遞的引數稱為「實際引數」,簡稱「實參」。上面**中,
printmax(10,20),10和20就是實際引數。
程式的可讀性最重要,一般建議在函式體開始的部分附上函式定義說明,這就是「文件字串」,也有人成為「函式的注釋」。我們通過三個單引號或者三個雙引號來實現,中間可以加入多行文字進行說明。
help(函式名.__doc__)可以列印輸出函式的文件字串。
return返回值要點∶
1.如果函式體中包含return語句,則結束函式執行並返回值;
2.如果函式體中不包含return語句,則返回none值。
3.要返回多個返回值,使用列表、元組、字典、集合將多個值「存起來」即可。
變數起作用的範圍稱為變數的作用域,不同作用域內同名變數之間互不影響。變數分為∶全域性變數、區域性變數。
全域性變數:
1.在函式和類定義之外宣告的變數。作用域為定義的模組,從定義位置開始直到模組結束。
2.全域性變數降低了函式的通用性和可讀性。應盡量避免全域性變數的使用。
3.全域性變數─般做常量使用。
4.函式內要改變全域性變數的值,使用global宣告—下
區域性變數:
1.在函式體中(包含形式引數)宣告的變數。
2.區域性變數的引用比全域性變數快,優先考慮使用。
3.如果區域性變數和全域性變數同名,則在函式內隱藏全域性變數,只使用同名的區域性變數
區域性變數的查詢和訪問速度比全域性變數快,優先考慮使用,尤其是在迴圈的時候。在特別強調效率的地方或者迴圈次數較多的地方,可以通過將全域性變數轉為區域性變數提高執行速度。
importmath
import
time
deftest01():
start =time.time()
for i in range(10000000):
math.sqrt(30)
end =time.time()
print(end-start)
deftest02():
b =math.sqrt
start01 =time.time()
for i in range(10000000):
b(30)
end01 =time.time()
print(end01-start01)
test01()
test02()
函式的引數傳遞本質上就是∶從實參到形參的賦值操作。python中「一切皆物件」,所有的賦值操作都是「引用的賦值」。所以,python中引數的傳遞都是「引用傳遞」,不是「值傳遞」。具體操作時分為兩類:
1.對「可變物件」進行「寫操作」,直接作用於原物件本身。
2.對「不可變物件」進行「寫操作」,會產生乙個新的「物件空間」,並用新的值填充這塊空間。(起到其他語言的「值傳遞」效果,但不是「值傳遞」)
可變物件有∶
字典、列表、集合、自定義的物件等
不可變物件有∶
數字、字串、元組、function等
傳遞引數是可變物件(例如∶列表、字典、自定義的其他可變物件等),實際傳遞的還是物件的引用。在函式體中不建立新的物件拷貝,而是可以直接修改所傳遞的物件。
傳遞引數是不可變物件(例: int、float、字串、元組、布林值),實際傳遞的還是物件的引用。在」賦值操作」時,由於不可變物件無法修改,系統會新建立乙個物件。
淺拷貝(copy):不拷貝子物件的內容,只是拷貝子物件的引用
深拷貝(deepcopy):會連子物件的記憶體也全部拷貝乙份,對子物件的修改不會影響源物件
56 函式用法和底層分析
python函式的分類 函式的定義和呼叫 函式是可重用的程式 塊。函式的作用,不僅可以實現 的復用,更能實現 的 一致性。一致性指的是,只要修改函式的 則所有呼叫該函式的地方都能得到體現。在編寫函式時,函式體中的 寫法和我們前面講述的基本一致,只是對 實現了封 裝,並增加了函式呼叫 傳遞引數 返回計...
2020 9 19函式的用法和底層分析
函式的用法和底層分析 def test01 print wo 10 print ai 10 print id test01 print type test01 test01 test01 for x in range 10 test01 形參和實參,文件字串通過使用turtle這個庫來畫圖 下面是d...
ArrayList底層實現和原理分析
今天是週末,沒什麼事就在家裡看了一下原始碼,我習慣使用jdk1.8,所以我的 全都是基於jdk1.8,好了下面是正文,今天來說說arraylist的底層實現和源 首先,集合arraylist是list的實現類,list還有兩個實現類linkedlist和vector。先說說這幾個實現類的區別吧 1....