淺談Python中的函數(def)及參數傳遞操作
如下所示:
#抽象 (函數) # 1、callable 判斷一個對象是否可以被調用 x = 1 def y(): return None callable(y) # y可以被調用 callable(x) # x不可以被調用 # 2、當函數沒有return時 函數將默認返回None # 3、放在函數開頭的字符串成為文檔字符串 如下: def square(x): 'my name is hexianmin' #這個為文檔字符串 將作為函數的一部分存儲起來 return x*x # 4、函數中的 '傳值' 和 '傳地址' 切片列表產生的是一個相等但不相同的副本(即兩個列表存儲地址不一樣) # 傳值: 調用函數時傳 變量 eg: x = 1 change(x) # 傳地址: 調用函數時傳 列表(在這裡說明:元組不可以改變 傳過去也不能修改) eg: x = list('pyhon') change(x) # 函數參數 : 1、位置參數 2、關鍵字參數 # 1、位置參數 :實參與形參的對應關系為 '一一對應' 的關系 實參的前後位置決定瞭形參接到的值 # 2、關鍵字參數 :由指定關鍵字去給形參傳值(或者傳地址) 像字典一樣 key-value 的對應關系 # 註意: 1、二者不可以沖突 2、關鍵字參數和位置參數可以混在一起用,優先關鍵字參數,剩下的按照位置一一對應 # * / ** 的妙用 :收集參數 和 分配參數 的作用 # 收集參數: * : 將 多餘的 一般的對象(位置參數,字典也將作為位置參數)收集成元組類型 ** : 將 多餘的 關鍵字參數 收集為字典類型 # 分配參數: * : 將元組類型的參數分配給形參 ** : 將字典類型的參數分配給形參 # 收集參數: def print_params_1(x, y, z=3, *pospar, **keypar): #註意這裡的 z=3 是給z賦一個默認值 當調用函數時沒有給z賦值時使用 但是一旦調用時給z賦值瞭 z就不用默認值瞭 print(x, y, z) print(pospar) #在函數裡面使用時 : 1、不帶星號(*) 是 一個元組 2、帶星號(*) 是 取元組中的每個值出來 print(keypar) #在函數裡面使用時 : 1、不帶星號(**) 是 一個字典(但是取不瞭值出來) 2、帶一個星號(*) 是 取字典中的每個關鍵字(key)出來 3、帶兩個星號 會報錯 print_params_1(1, 2, 4, 5, 6, 7, foo=1, bar=2) # 分配參數: def foo(x, y, z, m=0, n=0): print(x, y, z) print(m) print(n) return -1 def call_foo(*args, **kwds): #收集參數 print('calling foo!') foo(*args, kwds) #分配參數 這裡如果用foo(*args, **kwds) **kwds會報錯 x1 = 1 y1 = 2 z1 = 3 d = { 'm1': 4, 'n1': 5 } print(call_foo(x1, y1, z1, d1=1, d2=2)) #調用的時候 一個字典是作為一個位置參數的 # 作用域 :1、全局變量 2、局部變量 # 註意: 在局部函數(局部函數中默認變量都是局部變量)中使用全局變量: 1、隻使用一次(且重名瞭) 2、聲明後使用(聲明後就是全局變量瞭) # 1、隻使用一次(且重名瞭): para = 1 def combine(para): print(para,globals()['para']) # globals()['para'] combine(2) # 2、聲明後使用(聲明後就是全局變量瞭): xx = 2 def change_global(): global xx #聲明後就是全局變量瞭 xx = xx +2 print(xx) change_global() # 3、vars(): 賦值其實是一個看不見的字典 使用後返回的就是一個字典 x11 = 1 x22 = vars() print(x22['x11']) # 4、 vars() globals() locals() 使用後都是返回一個字典 # 作用域嵌套 def multi(fac): def multiFac(num): # multiFac(num)函數被稱為 : 閉包 return num * fac return multiFac dou = multi(2) #返回的 dou 現在是一個函數( multiFac(num)函數 ) dou(3) #這樣相當於調用 multiFac(3) # list(map(str,range(10))) 與 [str(i) for i in range(10)] 是等價的 # filter(lambda x: x.isalnum, seq) #from functools import reduce reduce(lambda x,y: x+y, numbers) # map filter reduce
補充:python參數傳遞問題(參數傳出)
變量、對象與類型關系
python是動態類型語言,並不需要預先聲明變量類型,變量的類型和值在賦值的那一刻完成初始化。進一步說,python中的類型是屬於對象的,而不是變量。
例如:
a=2 b=[1,2]
分別表示把一個int對象2,賦值給a;把一個list對象[1,2]賦值給b。
也就是說在將不同類型的python對象通過賦值號賦給某一個變量時,才完成該變量的初始化,而使得該變量代表某種類型的對象。
函數
不可更改參數傳遞
如果想進行參數傳遞,那麼在python 中的定義函數之前,必須對參數的變量進行聲明,否則會出現提示global name ‘abun1’ is not defined,當然,該變量的聲明過程可以是隱式的進行。
例如a=2或者a={},在對a進行賦值的那一刻完成變量的類型初始化,也即是完成變量的聲明。
但是,尤其需要註意的是,python中的int,long, bool, float,tuple() 等對象都是不能更改的,因此,在參數傳遞時,不能傳遞輸出這些類型的變量。
例如:
def tmpF(a): a=10 nint=2 tmpF(nint) print(nint) #結果仍是2
因為,變量nint代表一個整型對象2,調用函數tmpF()時,因整型對象無法改變,那麼新建瞭一個整型對象10,使a指向它,因此nint代表的整型對象仍舊是2,沒有發生改變。
可更改參數傳遞
如果在定義函數時,想利用參數輸出某些處理過的變量,那必須使用可以更改的對象,如list,dict等。
例如:
def tmpF(a): a.append(2) nx=[] tmpF(nx) print(nx) #nx=[2]
因為,list是可更改類型對象,因此,在調用函數tmpF()時,對該list型對象進行瞭修改,而nx指向的仍舊是這個對象。
所以,函數可以通過可變類型對象,將參數輸出。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Python lambda函數使用方法深度總結
- Python 入門學習之函數式編程
- python3中apply函數和lambda函數的使用詳解
- Python中不可錯過的五個超有用函數
- python lambda的使用詳解