淺談Python中的函數(shù)(def)及參數(shù)傳遞操作
如下所示:
#抽象 (函數(shù)) # 1、callable 判斷一個(gè)對(duì)象是否可以被調(diào)用 x = 1 def y(): return None callable(y) # y可以被調(diào)用 callable(x) # x不可以被調(diào)用 # 2、當(dāng)函數(shù)沒有return時(shí) 函數(shù)將默認(rèn)返回None # 3、放在函數(shù)開頭的字符串成為文檔字符串 如下: def square(x): 'my name is hexianmin' #這個(gè)為文檔字符串 將作為函數(shù)的一部分存儲(chǔ)起來 return x*x # 4、函數(shù)中的 '傳值' 和 '傳地址' 切片列表產(chǎn)生的是一個(gè)相等但不相同的副本(即兩個(gè)列表存儲(chǔ)地址不一樣) # 傳值: 調(diào)用函數(shù)時(shí)傳 變量 eg: x = 1 change(x) # 傳地址: 調(diào)用函數(shù)時(shí)傳 列表(在這里說明:元組不可以改變 傳過去也不能修改) eg: x = list('pyhon') change(x) # 函數(shù)參數(shù) :?。?、位置參數(shù) 2、關(guān)鍵字參數(shù) # 1、位置參數(shù) :實(shí)參與形參的對(duì)應(yīng)關(guān)系為 '一一對(duì)應(yīng)' 的關(guān)系 實(shí)參的前后位置決定了形參接到的值 # 2、關(guān)鍵字參數(shù) :由指定關(guān)鍵字去給形參傳值(或者傳地址) 像字典一樣 key-value 的對(duì)應(yīng)關(guān)系 # 注意: 1、二者不可以沖突 2、關(guān)鍵字參數(shù)和位置參數(shù)可以混在一起用,優(yōu)先關(guān)鍵字參數(shù),剩下的按照位置一一對(duì)應(yīng) # * / ** 的妙用 :收集參數(shù) 和 分配參數(shù) 的作用 # 收集參數(shù): * : 將 多余的 一般的對(duì)象(位置參數(shù),字典也將作為位置參數(shù))收集成元組類型 ** : 將 多余的 關(guān)鍵字參數(shù) 收集為字典類型 # 分配參數(shù): * : 將元組類型的參數(shù)分配給形參 ** : 將字典類型的參數(shù)分配給形參 # 收集參數(shù): def print_params_1(x, y, z=3, *pospar, **keypar): #注意這里的 z=3 是給z賦一個(gè)默認(rèn)值 當(dāng)調(diào)用函數(shù)時(shí)沒有給z賦值時(shí)使用 但是一旦調(diào)用時(shí)給z賦值了 z就不用默認(rèn)值了 print(x, y, z) print(pospar) #在函數(shù)里面使用時(shí) : 1、不帶星號(hào)(*) 是 一個(gè)元組 2、帶星號(hào)(*) 是 取元組中的每個(gè)值出來 print(keypar) #在函數(shù)里面使用時(shí) : 1、不帶星號(hào)(**) 是 一個(gè)字典(但是取不了值出來) 2、帶一個(gè)星號(hào)(*) 是 取字典中的每個(gè)關(guān)鍵字(key)出來 3、帶兩個(gè)星號(hào) 會(huì)報(bào)錯(cuò) print_params_1(1, 2, 4, 5, 6, 7, foo=1, bar=2) # 分配參數(shù): def foo(x, y, z, m=0, n=0): print(x, y, z) print(m) print(n) return -1 def call_foo(*args, **kwds): #收集參數(shù) print('calling foo!') foo(*args, kwds) #分配參數(shù) 這里如果用foo(*args, **kwds) **kwds會(huì)報(bào)錯(cuò) x1 = 1 y1 = 2 z1 = 3 d = { 'm1': 4, 'n1': 5 } print(call_foo(x1, y1, z1, d1=1, d2=2)) #調(diào)用的時(shí)候 一個(gè)字典是作為一個(gè)位置參數(shù)的 # 作用域 :1、全局變量 2、局部變量 # 注意: 在局部函數(shù)(局部函數(shù)中默認(rèn)變量都是局部變量)中使用全局變量: 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(): 賦值其實(shí)是一個(gè)看不見的字典 使用后返回的就是一個(gè)字典 x11 = 1 x22 = vars() print(x22['x11']) # 4、 vars() globals() locals() 使用后都是返回一個(gè)字典 # 作用域嵌套 def multi(fac): def multiFac(num): # multiFac(num)函數(shù)被稱為 : 閉包 return num * fac return multiFac dou = multi(2) #返回的 dou 現(xiàn)在是一個(gè)函數(shù)( multiFac(num)函數(shù) ) dou(3) #這樣相當(dāng)于調(diào)用 multiFac(3) # list(map(str,range(10))) 與 [str(i) for i in range(10)] 是等價(jià)的 # filter(lambda x: x.isalnum, seq) #from functools import reduce reduce(lambda x,y: x+y, numbers) # map filter reduce
補(bǔ)充:python參數(shù)傳遞問題(參數(shù)傳出)
變量、對(duì)象與類型關(guān)系
python是動(dòng)態(tài)類型語言,并不需要預(yù)先聲明變量類型,變量的類型和值在賦值的那一刻完成初始化。進(jìn)一步說,python中的類型是屬于對(duì)象的,而不是變量。
例如:
a=2 b=[1,2]
分別表示把一個(gè)int對(duì)象2,賦值給a;把一個(gè)list對(duì)象[1,2]賦值給b。
也就是說在將不同類型的python對(duì)象通過賦值號(hào)賦給某一個(gè)變量時(shí),才完成該變量的初始化,而使得該變量代表某種類型的對(duì)象。
函數(shù)
不可更改參數(shù)傳遞
如果想進(jìn)行參數(shù)傳遞,那么在python 中的定義函數(shù)之前,必須對(duì)參數(shù)的變量進(jìn)行聲明,否則會(huì)出現(xiàn)提示global name 'abun1' is not defined,當(dāng)然,該變量的聲明過程可以是隱式的進(jìn)行。
例如a=2或者a={},在對(duì)a進(jìn)行賦值的那一刻完成變量的類型初始化,也即是完成變量的聲明。
但是,尤其需要注意的是,python中的int,long, bool, float,tuple() 等對(duì)象都是不能更改的,因此,在參數(shù)傳遞時(shí),不能傳遞輸出這些類型的變量。
例如:
def tmpF(a): a=10 nint=2 tmpF(nint) print(nint) #結(jié)果仍是2
因?yàn)椋兞縩int代表一個(gè)整型對(duì)象2,調(diào)用函數(shù)tmpF()時(shí),因整型對(duì)象無法改變,那么新建了一個(gè)整型對(duì)象10,使a指向它,因此nint代表的整型對(duì)象仍舊是2,沒有發(fā)生改變。
可更改參數(shù)傳遞
如果在定義函數(shù)時(shí),想利用參數(shù)輸出某些處理過的變量,那必須使用可以更改的對(duì)象,如list,dict等。
例如:
def tmpF(a): a.append(2) nx=[] tmpF(nx) print(nx) #nx=[2]
因?yàn)椋琹ist是可更改類型對(duì)象,因此,在調(diào)用函數(shù)tmpF()時(shí),對(duì)該list型對(duì)象進(jìn)行了修改,而nx指向的仍舊是這個(gè)對(duì)象。
所以,函數(shù)可以通過可變類型對(duì)象,將參數(shù)輸出。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)添加圖片到word文檔中
這篇文章主要介紹了python實(shí)現(xiàn)添加圖片到word文檔中方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09python?time模塊計(jì)算時(shí)間之間的差距(練習(xí)題)
這篇文章主要介紹了python?time模塊計(jì)算時(shí)間之間的差距,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05Python實(shí)現(xiàn)讀取HTML表格 pd.read_html()
這篇文章主要介紹了Python實(shí)現(xiàn)讀取HTML表格 pd.read_html(),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Python實(shí)現(xiàn)線性判別分析(LDA)的MATLAB方式
今天小編大家分享一篇Python實(shí)現(xiàn)線性判別分析(LDA)的MATLAB方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12淺談python中截取字符函數(shù)strip,lstrip,rstrip
這篇文章主要介紹了淺談python中截取字符函數(shù)strip,lstrip,rstrip的相關(guān)資料,需要的朋友可以參考下2015-07-07Scrapy 配置動(dòng)態(tài)代理IP的實(shí)現(xiàn)
這篇文章主要介紹了Scrapy 配置動(dòng)態(tài)代理IP的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Python IndexError報(bào)錯(cuò)分析及解決方法
在Python編程中,IndexError是一種常見的異常類型,它通常發(fā)生在嘗試訪問序列(如列表、元組或字符串)中不存在的索引時(shí),本文將深入分析IndexError的成因、表現(xiàn)形式,并提供相應(yīng)的解決辦法,同時(shí)附帶詳細(xì)的代碼示例,需要的朋友可以參考下2024-07-07