函數的形式:
def name(param1, param2, ..., paramN): statements return/yield value # optional
- 和其餘須要編譯的語言(好比 C 語言)不同的是,def 是可執行語句,這意味着函數直到被調用前,都是不存在的。當程序調用函數時,def 語句纔會建立一個新的函數對象,並賦予其名字。
- Python 是 dynamically typed ,對函數參數來講,能夠接受任何數據類型,這種行爲在編程語言中稱爲多態。因此在函數裏必要時要作類型檢查,不然可能會出現例如字符串與整形相加出異常的狀況。
函數的嵌套:
例:編程
def f1(): print('hello') def f2(): print('world') f2() f1() 'hello' 'world'
嵌套函數的做用安全
-
保證內部函數的隱私
def connect_DB(): def get_DB_configuration(): ... return host, username, password conn = connector.connect(get_DB_configuration()) return conn
在connect_DB函數外部,並不能直接訪問內部函數get_DB_configuration,提升了程序的安全性閉包
-
若是在須要輸入檢查不是很快,還會耗費必定資源時,可使用函數嵌套提升運行效率。
def factorial(input): # validation check if not isinstance(input, int): raise Exception('input must be an integer.') if input < 0: raise Exception('input must be greater or equal to 0' ) ... def inner_factorial(input): if input <= 1: return 1 return input * inner_factorial(input-1) return inner_factorial(input) print(factorial(5))
函數做用域
1.global編程語言
在Python中,咱們不能在函數內部隨意改變全局變量的值,會報local variable 'VALUE' referenced before assignment。函數
下例經過global聲明,告訴解釋器VALUE是全局變量,不是局部變量,也不是全新變量
VALUE = 10 LIST = ['a','b'] print(id(LIST)) #2490616668744 def validation_check(value): global VALUE VALUE += 3 #若是註釋掉global VALUE,會報local variable 'VALUE' referenced before assignment LIST[0] = 10 #可變類型無需global可使用全局變量? print(id(LIST)) #2490616668744 print(f'in the function VALUE: {LIST}') #in the function VALUE: [10, 'b'] print(f'in the function VALUE: {VALUE}') #in the function VALUE: 13 validation_check(1) print(f'out of function {LIST}') #out of function [10, 'b'] print(f'out of function {VALUE}') #out of function 13 #a: 13 #b: 13
2.nonlocalspa
對於嵌套函數,nonlocal 聲明變量是外部函數中的變量code
def outer(): x = "local" def inner(): nonlocal x # nonlocal 關鍵字表示這裏的 x 就是外部函數 outer 定義的變量 x x = 'nonlocal' print("inner:", x) inner() print("outer:", x) outer() # inner :nonlocal # outer :nonlocal
當內部變量與外部變量同名時,內部變量會覆蓋外部變量
def outer(): x = "local" def inner(): x = 'nonlocal' # 這裏的 x 是 inner 這個函數的局部變量 print("inner:", x) inner() print("outer:", x) outer() # 輸出 # inner: nonlocal # outer: local
閉包
- 內部函數返回一個函數
- 外部函數nth_power()中的exponent參數在執行完nth_power()後仍然會被內部函數exponent_of記住
def nth_power(exponent): def exponent_of(base): return base ** exponent return exponent_of # 返回值是 exponent_of 函數 square = nth_power(2) # 計算一個數的平方 cube = nth_power(3) # 計算一個數的立方 # square # # 輸出 # <function __main__.nth_power.<locals>.exponent(base)> # cube # # 輸出 # <function __main__.nth_power.<locals>.exponent(base)> # print(square(2)) # 計算 2 的平方 # print(cube(2)) # 計算 2 的立方 # # 輸出 # 4 # 2^2 # 8 # 2^3
參考:對象
極客時間《Python核心技術與實戰 》blog