人生苦短,我選Pythonpython
前文傳送門git
小白學 Python(1):開篇github
變量的做用域是指在程序中命名的變量產生想過的範圍。
沒看懂?不要緊,咱們寫個示例慢慢品。
a = 0 def print_1(): a = 1 print('a =', a) def print_2(): a = 2 print('a =', a) print_a()
顯示結果以下:
a = 1
在上面的示例中, a 咱們進行了三次賦值,可是注意,這裏並非賦值覆蓋,而是每次賦值時做用域不一樣。
第一次賦值 a 是在最外面,這個稱爲全局變量,意思是它的做用域是全局的,咱們在全局任何地方使用 a ,都能得到這個值。
第二次賦值, a 是在 print_1()
這個函數中,咱們調用了 print_1()
這個函數,因此這裏的賦值會生效。
第三次賦值是在 print_2()
這個函數中,咱們並未調用這個函數,因此這裏 a 的賦值並不會生效。
好比咱們能夠這麼打印:
a = 0 def print_1(): a = 1 print('a =', a) def print_2(): a = 2 print('a =', a) print('a =', a)
打印結果以下:
a = 0
這時咱們就將這個全局變量打印出來了。
第二個和第三個在方法內的 a 就成了局部變量,這兩個 a 都是隻在當前的函數中生效,出了這個函數就不生效了。
若是咱們將局部變量中的的賦值註釋掉,那麼在函數中是否能取到全局變量的值?
答案固然是確定的,咱們試試看:
a = 0 def print_1(): # a = 1 print('a =', a) def print_2(): a = 2 print('a =', a) print_a()
打印結果以下:
a = 0
咱們還能夠再作一點改變,在函數 print_1()
中調用函數 print_2()
,以下:
a = 0 def print_1(): # a = 1 print('a1 =', a) def print_2(): a = 2 print('a2 =', a) print_2() print('a3 =', a) print_1()
打印結果以下:
a3 = 0 a1 = 0 a2 = 2
此示例添加 a1 、 a2 、 a3 僅爲打印後方便識別,並不是這是三個變量。
注意: 內層函數的變量做用域僅在內層函數中,並不會覆蓋到外層函數。
是的,你沒看錯,函數是能夠不命名的。
當咱們須要使用匿名函數的時候,可使用 lambda
關鍵字來聲明匿名函數。
語法:
函數對象名 = lambda 形參:表達式
咱們仍是寫一個簡單的匿名函數你們體會一下:
add = lambda x,y: x + y print(add(1, 2))
打印結果以下:
3
這裏是實現了咱們上一篇文章中最簡單的加法,若是寫一個稍微複雜一點,好比說加上邏輯判斷的:
max_num = lambda x,y: x if x >= y else y print(max_num(5, 9))
打印結果以下:
9
建議: 當函數比較複雜的時候,不建議使用匿名函數,由於它只能是一行,寫起來很差寫的同時還很差閱讀,結構晦澀難懂,若是進行復雜的業務邏輯,匿名函數能讓寫的人懷疑人生,讀的人生不如死。真愛生命,請遠離匿名函數。
一個函數是能夠調用另外一個函數的,若是這個函數調用本身的話,那麼這個就叫遞歸函數。
如今咱們若是要求 n 的階乘:
千萬別告我你不知道什麼階乘,可能你須要回去問下你的初中數學老師。
n! = 1 * 2 * 3 * ... * n
看懂了哇,想一想看代碼怎麼寫。
想不出來仍是看我寫的吧:
def factorial(n): if n == 1: return 1 return n * factorial(n - 1) print('10的階乘爲:', factorial(10))
打印結果:
10的階乘爲: 3628800
但願各位同窗必定要本身動手敲代碼。
本系列的全部代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,方便你們取用。