全局與局部變量
- 在函數中定義的變量稱為局部變量,在程序的一開始定義的變量稱為全局變量。
- 全局變量作用域是整個程序,局部變量作用域是定義該變量的函數。
- 當全局變量與局部變量同名時,在定義局部變量的函數內,局部變量起作用;在其它地方全局變量起作用。
name = "Alex Li" # 全局變量 def change_name(name): print("before change:",name) # 函數內部變量從內向外找,如果內部不存在,會找上一層 # 輸出 # before change: Alex Li name = "金角大王,一個有Tesla的男人" #局部變量 print("after change", name) # 輸出 # after change 金角大王,一個有Tesla的男人 change_name(name) print("在外面看看name改了么?",name) # 默認局部變量不能修改全局變量的值 # 輸出 # 在外面看看name改了么? Alex Li
不用傳name 值到函數里,也可以在函數里調用外面的變量
name = "Alex Li" def change_name(): name = "金角大王,一個有Tesla的男人" print("after change", name) # 輸出 # after change 金角大王,一個有Tesla的男人 change_name() print("在外面看看name改了么?", name ) # 輸出 # 在外面看看name改了么? Alex Li
作用域
Python中函數就是一個作用域,局部變量放置在其作用域中。
如何在函數里修改全局變量?global
name = "Alex Li" def change_name(): global name # 聲明全局變量 name = "Alex 又名 金角大王,路飛學城講師" print("after change", name) # 輸出 # after change Alex 又名 金角大王,路飛學城講師 change_name() print("在外面看看name改了么?", name) """ global name的作用就是要在函數里聲明全局變量name ,意味着最上面的name = "Alex Li"即使不寫,程序最后面的print也可以打印name """
在實踐中global一般情況下最好不要使用,在多人協作時容易產生錯誤
嵌套函數
在函數里面還可以定義函數,可以嵌套多層,執行需要被調用
name = "Alex" def change_name(): name = "Alex2" def change_name2(): name = "Alex3" print("第3層打印", name) change_name2() # 調用內層函數 # 輸出 # 第3層打印 Alex3 print("第2層打印", name) # 輸出 # 第2層打印 Alex2 change_name() print("最外層打印", name) # 輸出 # 最外層打印 Alex
嵌套函數舉例1
嵌套函數舉例2
嵌套函數舉例3
嵌套函數舉例4
嵌套函數舉例5
嵌套函數舉例6
高階函數
變量可以指向函數,函數的參數能接收變量,那么一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。
變量可以指向函數
以Python內置的求絕對值的函數abs()
為例,調用該函數用以下代碼
>>> abs(-1)
1
但是,如果只寫abs
呢?
>>> abs <built-in function abs>
如果把函數本身賦值給變量呢?
>>> f = abs >>> f <built-in function abs>
總結:函數本身也可以賦值給變量,即:變量可以指向函數
驗證:
f = abs print(f(-10)) # 輸出10
傳入函數
既然變量可以指向函數,函數的參數能接收變量,那么一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。
一個最簡單的高階函數:
def add(x, y, f): # 高階函數 return f(x) + f(y) """ 當我們調用add(-5, 6, abs)時,參數x,y和f分別接收-5,6和abs,根據函數定義,我們可以推導計算過程為: x = -5 y = 6 f = abs f(x) + f(y) ==> abs(-5) + abs(6) ==> 11 """ print(add(-5, 6, abs)) # 輸出11