看datetime()函數的原型:
創新互聯是一家專業提供嵐縣企業網站建設,專注與成都網站設計、成都網站制作、H5頁面制作、小程序制作等業務。10年已為嵐縣眾多企業、政府機構等服務。創新互聯專業網絡公司優惠進行中。
其中前三個參數year, month, day是位置參數,因此傳參時可以寫參數名,也可以不寫參數名。
datetime(2020, 1, 1)
datetime(2020, month=1, day=1)
datetime(year=2020, month=1, day=1)
以上這些傳參方式均合法。
形參設置可以為數字字符串變量、元組和字典等任意類型數據,元組形參是在變量名前加*,字典形參是在變量名前加**
例如:fun(var),fun(*tuple),fun(*list),fun(**dict)
實參接受也可以是任意類型數據,當接收數據為元組列表或者字典時,同樣是在數據變量前加*和**
例如:fun(x),fun(*seq),fun(*list),fun(**stu_info)
可以使用元組形參和字典形參接收冗余或意外數據
例如:fun(var,*t_args,**dic_args)
但傳參時,數字和字符串形參必須傳值,元組和字典形參可不傳,原因為元組和字典數據可以是空元組或空字典,此特性正好適應處理冗余數據
形參參數名若和生產數據中字典鍵名相同加大大提高編程效率和生產效率
例如:有字典dic={'name':'csdn','age':10,'top':1} ,有函數fun(name='name',age=0,top=0),則函數可以方便的獲取字典數據fun(**dic)
上一期我們學習參數傳遞怎么傳遞,也了解了參數的幾種類型。
首先,我們再來回顧一下,形參和實參:
形參是在定義函數時定義的,放在函數名后面的圓括號里,可為空
實參是調用函數時為形參傳入具體的參數值
簡單總結一下,誰調用函數,誰就負責傳入參數。
好吶,本期我們來詳細學習函數幾種參數類型,大綱如下:
python函數的參數名是無意義的,Python允許在調用函數時通過通過名字來傳入參數值。
位置參數:按照形參位置傳入的參數
調用函數時,實參默認按位置順序傳遞的。同時實參個數也要和形參匹配
舉一個小栗子
如果實參的個數與形參不匹配時,調用函數運行就會報錯
Python中,形參與調用函數緊密聯系在一起的。
關鍵字參數:調用函數時,使形參名稱來傳遞參數,形式為“形參名=實參”
關鍵字參數,又叫命名參數,傳遞時無需考慮參數位置和順序
舉一個小栗子
默認參數:定義函數時,我們可以為形參提前設置具體的值。
在定義函數時,默認參數要放到位置等其他參數后面
在調用函數時,默認參數是可選的。如果傳入新值,則會覆蓋默認值
舉一個小栗子
注意,默認值不能位于位置參數前面,否則程序會報錯誤
不定長參數又名可變參數。
不定長參數指的是可變數量的參數,分兩種情況:
如果不定長參數后面,可以新增參數嗎?
我們通過例子來看,會發生什么?
運行上面的程序,Python解釋器會報錯
原因是,形參a已經是不定長參數,我們調用的test(2,3,4)傳入的三個實參,系統自動把它們屬于形參a的值,形參b 和形參c就等于沒有值傳入,這時候系統就認為,調用函數的對象,參數沒有傳夠。
為了解決這一報錯,python引入了 強制命名參數
規定,調用不定參數后面有跟位置參數的函數時,傳入給位置參數時,必須要強制命名參進行傳參。
逆向參數收集針對的對象傳入函數的實參
調用函數時,如果實參是元組,列表或者字典,通過在實參前面加入星號,可以自動把元素進行隔開,然后再轉入給函數進行處理
舉一個小栗子
本期,我們詳細學習了參數幾種類型,為后面我們學習函數,打好基礎。
實踐是檢驗真理的過程,大家多動手練習練習,會有不一樣的奇妙旅程~
好吶,以上是本期內容,歡迎大佬們評論區指正~
** 在python里面表示冪運算
傳遞實參和定義形參(所謂實參就是調用函數時傳入的參數,形參則是定義函數是定義的參數)的時候,你還可以使用兩個特殊的語法:``*`` ** 。
調用函數時使用* **
test(*args)* 的作用其實就是把序列 args 中的每個元素,當作位置參數傳進去。比如上面這個代碼,如果 args 等于 (1,2,3) ,那么這個代碼就等價于 test(1, 2, 3) 。
test(**kwargs)** 的作用則是把字典 kwargs 變成關鍵字參數傳遞。比如上面這個代碼,如果 kwargs 等于 {'a':1,'b':2,'c':3} ,那這個代碼就等價于 test(a=1,b=2,c=3) 。
定義函數參數時使用* **
def test(*args):
...定義函數參數時 * 的含義又要有所不同,在這里 *args 表示把傳進來的位置參數都裝在元組 args 里面。比如說上面這個函數,調用 test(1, 2, 3) 的話, args 的值就是 (1, 2, 3) 。:
def test(**kwargs):
...類似的, ** 就是針對關鍵字參數和字典的了。 調用 test(a=1,b=2,c=3) 的話, kwargs 的值就是 {'a':1,'b':2,'c':3} 了。
普通的參數定義和傳遞方式和 * 們都可以和平共處,不過顯然 * 必須放在所有位置參數的最后,而 ** 則必須放在所有關鍵字參數的最后,否則就要產生歧義了
Python中函數參數的傳遞是通過“賦值”來傳遞的。但這條規則只回答了函數參數傳遞的“戰略問題”,并沒有回答“戰術問題”,也就說沒有回答怎么賦值的問題。函數參數的使用可以分為兩個方面,一是函數參數如何定義,二是函數在調用時的參數如何解析的。而后者又是由前者決定的。函數參數的定義有四種形式:
1. F(arg1,arg2,...)
2. F(arg2=value,arg3=value...)
3. F(*arg1)
4. F(**arg1)
第1 種方式是最“傳統”的方式:一個函數可以定義不限個數參數,參數(形式參數)放在跟在函數名后面的小括號中,各個參數之間以逗號隔開。用這種方式定義的函數在調用的時候也必須在函數名后的小括號中提供相等個數的值(實際參數),不能多也不能少,而且順序還必須相同。也就是說形參和實參的個數必須一致,而且想給形參1的值必須是實參中的第一位,形參與實參之間是一一對應的關系,即“形參1=實參1 形參2=實參2...”。很明顯這是一種非常不靈活的形式。比如:"def addOn(x,y): return x + y",這里定義的函數addOn,可以用addOn(1,2)的形式調用,意味著形參x將取值1,主將取值2。addOn(1,2,3)和addOn (1)都是錯誤的形式。
第2種方式比第1種方式,在定義的時候已經給各個形參定義了默認值。因此,在調用這種函數時,如果沒有給對應的形式參數傳遞實參,那么這個形參就將使用默認值。比如:“def addOn(x=3,y=5): return x + y”,那么addOn(6,5)的調用形式表示形參x取值6,y取值5。此外,addOn(7)這個形式也是可以的,表示形參x取值7,y取默認值5。這時候會出現一個問題,如果想讓x取默認值,用實參給y賦值怎么辦?前面兩種調用形式明顯就不行了,這時就要用到Python中函數調用方法的另一大絕招 ──關健字賦值法。可以用addOn(y=6),這時表示x取默認值3,而y取值6。這種方式通過指定形式參數可以實現可以對形式參數進行“精確攻擊”,一個副帶的功能是可以不必遵守形式參數的前后順序,比如:addOn(y=4,x=6),這也是可以的。這種通過形式參數進行定點賦值的方式對于用第1種方式定義的函數也是適用的。
上面兩種方式定義的形式參數的個數都是固定的,比如定義函數的時候如果定義了5個形參,那么在調用的時候最多也只能給它傳遞5個實參。但是在實際編程中并不能總是確定一個函數會有多少個參數。第3種方式就是用來應對這種情況的。它以一個*加上形參名的方式表示,這個函數實際參數是不一定的,可以是零個,也可以是N個。不管是多少個,在函數內部都被存放在以形參名為標識符的tuple中。比如:
對這個函數的調用addOn() addOn(2) addOn(3,4,5,6)等等都是可以的。
與第3種方式類似,形參名前面加了兩個*表示,參數在函數內部將被存放在以形式名為標識符的dictionary中。這時候調用函數必須采用key1=value1、key2=value2...的形式。比如:
1. def addOn(**arg):
2. sum = 0
3. if len(arg) == 0: return 0
4. else:
5. for x in arg.itervalues():
6. sum += x
7. return sum
那么對這個函數的調用可以用addOn()或諸如addOn(x=4,y=5,k=6)等的方式調用。
上面說了四種函數形式定義的方式以及他們的調用方式,是分開說的,其實這四種方式可以組合在一起形成復雜多樣的形參定義形式。在定義或調用這種函數時,要遵循以下規則:
1. arg=value必須在arg后
2. *arg必須在arg=value后
3. **arg必須在*arg后
在函數調用過程中,形參賦值的過程是這樣的:
首先按順序把“arg”這種形式的實參給對應的形參
第二,把“arg=value”這種形式的實參賦值給形式
第三,把多出來的“arg”這種形式的實參組成一個tuple給帶一個星號的形參
第四,把多出來的“key=value”這種形式的實參轉為一個dictionary給帶兩個星號的形參。
例子:
1. def test(x,y=5,*a,**b):
2. print x,y,a,b
就這么一個簡單函數,來看看下面對這個函數調用會產生什么結果:
test(1) === 1 5 () {}
test(1,2) === 1 2 () {}
test(1,2,3) === 1 2 (3,) {}
test(1,2,3,4) === 1 2 (3,4)
test(x=1) === 1 5 () {}
test(x=1,y=1) === 1 1 () {}
test(x=1,y=1,a=1) === 1 1 () {'a':1}
test(x=1,y=1,a=1,b=1) === 1 1 () {'a':1,'b':1}
test(1,y=1) === 1 1 () {}
test(1,2,y=1) === 出錯,說y給賦了多個值
test(1,2,3,4,a=1) === 1 2 (3,4) {'a':1}
test(1,2,3,4,k=1,t=2,o=3) === 1 2 (3,4) {'k':1,'t':2,'o':3}
標題名稱:關于python函數傳遞實參的信息
本文路徑:http://vcdvsql.cn/article24/hedpje.html
成都網站建設公司_創新互聯,為您提供企業網站制作、手機網站建設、面包屑導航、移動網站建設、靜態網站、網頁設計公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯