函數與過程
大多數語言都會有以下定義:
函數(function):有傳回值
過程(procedure):是簡單的特殊的沒有傳回值的一個特殊函數
python中只有函數沒有過程。
函數有return的話就傳回值,沒有return的話就返回None。
說明:hello()沒有return,所以temp沒有值。不會顯示不代表沒有傳回值。即使hello()沒有return,也會返回一個None對象。所以 python中函數都有傳回值。
python函數傳回值會動態自動確定類型。
python沒有變數,只有名字。換言而知,包括python函數的傳回值也不用關注資料類型。
>>> def back():
return[1,'哈哈',4.6435]
>>> back()
[1, '哈哈', 4.6435]
>>> def back():
return 1,'哈哈',4.6435
>>> back()
(1, '哈哈', 4.6435)
注意:元組的關鍵是逗號而不是小括弧
二、函數變數的範圍:變數的可見度
1、局部變數local
在函數裡定義的參數以及變數都為局部變數,在函數外不可使用
2、全域變數global
函數外定義的變數在整個程式碼片段,整個檔案,整個模組。全域變數在函數中也可使用。
注意:如果在函數內試圖去修改全域變數的話,python會自動建立一個新的局部變數代替,名字和全域變數相同。但兩個變數實際上是兩個互不影響的變數,儲存空間不同。python會自動屏蔽新建立的局部變數而保護全域變數。所以不要輕易的在函數中修改全域變數,可以訪問。全域變數的使用要謹慎。
經典例子:
說明:函數外部的a為全域變數,函數內部的a為新建立的同名局部變數。return a中的a為新建立的a,a都沒有初始值,所以返回肯定會出錯。
若想在函數外使用函數內部的局部變數,只需在函數內部定義變數前面加上global關鍵字就行。
三、內嵌函數和閉包
1、內嵌函數(內建函式):允許在函數內部建立另一個函數
說明:內建函式整個範圍都在外部函數之內,內建函式的定義和調用都在外部函數之內,出了外部函數之外,就沒有任何隊fun2的調用了
2、閉包:函數式編程的一個重要文法結構
編程範式:借用哲學的術語,如果說每個編程者都在創造虛擬世界,那麼編程範式就是他們置身其中自覺不自覺採用的世界觀和方法論。
物件導向和面向過程。l
函數式編程:百度
閉包:從表現形式上定義為,如果在一個內建函式裡,對外部範圍(但不是在全域範圍)的變數進行引用,那麼內建函式就會被認為是閉包。
注意:不能在外部函數的外部對內建函式進行調用
外部函數的局部變數和內建函式的局部變數就像之前全域變數對於函數中的局部變數。所以此時 內建函式可以對外部函數中的局變數進行訪問,但不能對他進行修改。
說明:這裡內建函式新建立的同名變數沒有初始值,所以返回會報錯。因為內建函式之外的變數已經被屏蔽掉了。
—python3之前:無法解決,只能間接的通過容器類型。容器類型是存在在棧裡面,變數不會被屏蔽掉。
容器類型:列表、元組之列的什麼都可以扔進去
—python3:用nonlocal關鍵字聲明x不是一個局部變數