申明:資料來源于網路及書本,通過理解、實踐、整理成學習筆記,
文章目錄
- 函式定義
- 函式引數
- 變數作用域
- lambda運算式
- 遞回函式
函式定義
定義一個函式只要以"def"開頭即可,Python內置了很多有用的函式,我們可以直接呼叫,
def function_name(arg1):
function body
return value
- 函式名(function_name):函式名以字母或下劃線開頭,并且區分大小寫
- 函式引數(arg1):呼叫一個函式時可以傳遞的引數,引數可以沒有,也可以有一個或多個
- 函式內容(function body):在函式的內部,與"def"相比需要縮進4個空格
- 函式回傳值(return value):函式執行完成后回傳的值,也可以不回傳內容,默認為none
函式引數
- 必須引數:如果函式內容中使用了此函式引數,此引數就是必須引數,呼叫函式時缺少的話就會報錯
#定義函式 def fun1(a): print(a) #呼叫函式 fun1(1) 執行結果: 1#定義函式 def fun1(a): print(a) #呼叫函式 fun1() 執行結果: 發生例外:TypeError fun1() missing 1 required positional argument: 'a' - 關鍵字引數:使用關鍵字引數可以不按引數的順序來呼叫函式
def fun1(a,b): print(a,b) fun1("深圳","廣州") fun1(b="廣州",a="深圳") 執行結果: 深圳 廣州 深圳 廣州 - 默認引數:在定義函式時給引數添加默認值,如果呼叫函式時沒有傳入引數,函式就會使用默認值,注意:默認引數一定要定義在必須引數的后面
def fun1(a,b = 1): print(a,b) fun1("深圳") fun1("深圳","廣州") 執行結果: 深圳 1 深圳 廣州 - 可變引數:如果我們不能在定義函式的時候確定引數的數量和內容,就可以使用可變引數,如下:用 * 分隔開,args表示一個元組,用 ** 分隔開,kwargs表示一個字典
def fun1(*args,**kwargs): print(args) print(kwargs) i = (1,2,3) j = {"sz": "深圳", "gz": "廣州"} fun1(*i,**j) 執行結果: (1, 2, 3) {'sz': '深圳', 'gz': '廣州'} - 組合引數:顧名思義,就是將上面的必須引數、關鍵字引數、默認引數、可變引陣列合到一起使用
變數作用域
變數的作用域相當于變數的命名空間,Python中變數賦值的位置決定了哪些范圍的物件可以訪問這個變數,這個范圍被稱為作用域,Python中有兩種最基本的變數作用域:區域變數和全域變數,
-
區域變數:一般情況下,在函式內進行賦值的變數和不做特殊宣告的變數都是區域變數
#變數a在函式內賦值,屬于區域變數 def fun1(): a = 1 print(a) fun1() 執行結果: 1#變數b屬于函式的引數,也屬于區域變數 def fun1(b): print(b) fun1(1) 執行結果: 1 -
全域變數:在函式外賦值的變數就屬于全域變數,全域變數可以在整個程式范圍內進行訪問
#變數a在函式外賦值,屬于全域變數 a = 1 def fun1(): print(a) fun1()
lambda運算式
lambda運算式也稱為匿名函式,不再使用 def 陳述句這樣標準的形式定義一個函式,就是匿名函式,
a = lambda x, y : x + y
print(a(1,2))
執行結果:
3
- ":“左邊的"x”,"y"是函式的引數
- ":"右邊的是要回傳的值
- "a(1,2)"是呼叫此lambda函式
- 注意:lambda 函式擁有自己的命名空間,且不能訪問自己引數串列之外或全域命名空間里的引數
遞回函式
如果一個函式在內部呼叫自身本身,這個函式就是遞回函式,例如連加、連乘及階乘等
#階乘
def fact1(n):
if n == 1:
return 1
return n * fact1(n-1)
#fact1(5) = 5! = 5*4*3*2*1
print(fact1(5))
執行結果:
120
注意:使用遞回函式需要注意防止堆疊溢位,函式呼叫是通過堆疊(stack)這種資料結構實作的,每當進入一個函式呼叫,堆疊就會加一層堆疊幀,每當函式回傳,堆疊就會減一層堆疊幀,由于堆疊的大小不是無限的,所以,遞回呼叫的次數過多,會導致堆疊溢位,解決遞回呼叫堆疊溢位的方法是通過尾遞回優化
尾遞回:在函式回傳的時候,呼叫自身本身,并且,return陳述句不能包含運算式,這樣,編譯器或者解釋器就可以把尾遞回做優化,使遞回本身無論呼叫多少次,都只占用一個堆疊幀,不會出現堆疊溢位的情況
def fact1(n):
return fact2(n, 1)
def fact2(a, b):
if a == 1:
return b
return fact2(a - 1, a * b)
print(fact1(5))
執行結果:
120
執行程序
fact1(5)
-》fact2(5, 1)
-》fact2(4, 5)
-》fact2(3, 20)
-》fact2(2, 60)
-》fact2(1, 120)
-》120
一個堅持學習,堅持成長,堅持分享的人,即使再不聰明,也一定會成為優秀的人!
如果看完覺得有所識訓的話,記得一鍵三連哦,謝謝大家!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/267381.html
標籤:python
