函式用法和底層分析

2022-07-21 03:27:13 字數 3105 閱讀 7764

函式是可重用的程式**塊。函式的作用,不僅可以實現**的復用,更能實現**的一致性。一致性指的是,只要修改函式的**,則所有呼叫該函式的地方都能得到體現。

在編寫函式時,函式體中的**寫法和我們前面講述的基本一致,只是對**實現了封裝,並增加了函式呼叫、傳遞引數、返回計算結果等內容。

為了讓大家更容易理解,掌握的更深刻。我們也要深入記憶體底層進行分析。絕大多數語言記憶體底層都是高度相似的,這樣大家掌握了這些內容也便於以後學習其他語言。

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語句我們通過實際定義函式來學習函式的定義方式。

def

printmax(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.如果區域性變數和全域性變數同名,則在函式內隱藏全域性變數,只使用同名的區域性變數

區域性變數的查詢和訪問速度比全域性變數快,優先考慮使用,尤其是在迴圈的時候。在特別強調效率的地方或者迴圈次數較多的地方,可以通過將全域性變數轉為區域性變數提高執行速度。

import

math

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....