python的位置參數、默認參數、關(guān)鍵字參數、可變參數區別
一、位置參數
本文引用地址:http://dyxdggzs.com/article/201807/383601.htm調用函數時(shí)根據函數定義的參數位置來(lái)傳遞參數。
#!/usr/bin/env python
# coding=utf-8
def print_hello(name, sex):
sex_dict = {1: u'先生', 2: u'女士'}
print 'hello %s %s, welcome to python world!' %(name, sex_dict.get(sex, u'先生'))
# 兩個(gè)參數的順序必須一一對應,且少一個(gè)參數都不可以
# print_hello('tanggu', 1)
二、關(guān)鍵字參數
用于函數調用,通過(guò)“鍵-值”形式加以指定??梢宰尯瘮蹈忧逦?、容易使用,同時(shí)也清除了參數的順序需求。
# 以下是用關(guān)鍵字參數正確調用函數的實(shí)例
# print_hello('tanggu', sex=1)
# print_hello(name='tanggu', sex=1)
# print_hello(sex=1, name='tanggu')
# 以下是錯誤的調用方式
# print_hello(1, name='tanggu')
# print_hello(name='tanggu', 1)
# print_hello(sex=1, 'tanggu')
通過(guò)上面的代碼,我們可以發(fā)現:有位置參數時(shí),位置參數必須在關(guān)鍵字參數的前面,但關(guān)鍵字參數之間不存在先后順序的
三、默認參數
用于定義函數,為參數提供默認值,調用函數時(shí)可傳可不傳該默認參數的值(注意:所有位置參數必須出現在默認參數前,包括函數定義和調用)
# 正確的默認參數定義方式--> 位置參數在前,默認參數在后
def print_hello(name, sex=1):
....
# 錯誤的定義方式
def print_hello(sex=1, name):
....
# 調用時(shí)不傳sex的值,則使用默認值1
# print_hello('tanggu')
# 調用時(shí)傳入sex的值,并指定為2
# print_hello('tanggu', 2)
四、可變參數
定義函數時(shí),有時(shí)候我們不確定調用的時(shí)候會(huì )傳遞多少個(gè)參數(不傳參也可以)。此時(shí),可用包裹(packing)位置參數,或者包裹關(guān)鍵字參數,來(lái)進(jìn)行參數傳遞,會(huì )顯得非常方便。
1、包裹位置傳遞
def func(*args):
....
# func()
# func(a)
# func(a, b, c)
我們傳進(jìn)的所有參數都會(huì )被args變量收集,它會(huì )根據傳進(jìn)參數的位置合并為一個(gè)元組(tuple),args是元組類(lèi)型,這就是包裹位置傳遞。
2、包裹關(guān)鍵字傳遞
def func(**kargs):
....
# func(a=1)
# func(a=1, b=2, c=3)
kargs是一個(gè)字典(dict),收集所有關(guān)鍵字參數
五、解包裹參數
*和**,也可以在函數調用的時(shí)候使用,稱(chēng)之為解包裹(unpacking)
1、在傳遞元組時(shí),讓元組的每一個(gè)元素對應一個(gè)位置參數
def print_hello(name, sex):
print name, sex
# args = ('tanggu', '男')
# print_hello(*args)
# tanggu 男
2、在傳遞詞典字典時(shí),讓詞典的每個(gè)鍵值對作為一個(gè)關(guān)鍵字參數傳遞給函數
def print_hello(kargs):
print kargs
# kargs = {'name': 'tanggu', 'sex', u'男'}
# print_hello(**kargs)
# {'name': 'tanggu', 'sex', u'男'}
六、位置參數、默認參數、可變參數的混合使用
基本原則是:先位置參數,默認參數,包裹位置,包裹關(guān)鍵字(定義和調用都應遵循)
def func(name, age, sex=1, *args, **kargs):
print name, age, sex, args, kargs
# func('tanggu', 25, 2, 'music', 'sport', class=2)
# tanggu 25 1 ('music', 'sport') {'class'=2}
評論