1. 程式人生 > >Python 函式引數形式

Python 函式引數形式

一、位置引數

  根據定義的函式的引數位置來判斷引數的值。位置引數一旦定義,在呼叫函式時,就必須傳入對應的引數值。

def show_info(name, age):
    print("name: {0}, age: {1}".format(name,age))

show_info("yuchaoshui", 23)

二、預設引數

def show_info(name, age, city="beijing", company="alibaba"):
    print("name: {0}, age: {1}, city:{2}, company:{3}".format(name, age, city, company))

show_info("yuchaoshui"
, 23) show_info("yuchaoshui", 23, "shanghai") show_info("yuchaoshui", 23, company="baidu", city="shanghai")

注意

  • a、必選引數放在前面,預設引數放在後面
  • b、變化大引數放在前面,變化小的放在後面
  • c、呼叫時預設引數可以不用按順序提供預設引數,可以使用類似 show_info("yuchaoshui", 23, company="baidu", city="shanghai") 的方法傳遞引數, 後面的預設引數部分調換了順序
  • 呼叫時預設引數部分如果不給出關鍵字,可以用預設引數按照順序給出,以位置引數的形式呼叫,達到位置引數的效果。
show_info("yuchaoshui", 23, shanghai, baidu)
  • d、預設引數必須指定不變物件,不能是 [] 這種可變的序列。
def  func(a, b=[]) 
    pass

  上面的做法是錯誤的,正確的應該像下面這樣實現。

no_value = object()
def  func(a, b=no_value):
     if b is no_value:
          print("No b value supplied")

三、可變引數

  可變引數表示引數的個數變化的,呼叫時傳遞多個引數。

def
func(*args):
for i in args: print(i) func(1,2,3,4)

  也可以先組裝 list 或 tuple,再通過 *mylist 傳入,呼叫函式時, * 可以將序列分解成單個的引數。args接收到的是一個 tuple 或 list

def func(*args):
    for i in args:
        print(i)

mylist = [1,2,3,4]
func(*mylist)

四、關鍵字引數

  關鍵字引數允許傳入未定義的引數名, 函式中 kwargs 接收到的是一個字典。
  呼叫函式方式時使用類似 city='Shanghai' 這種方式傳入引數。 也可以傳入一個字典,傳入時使用兩個 ** 號來將字典解析成引數傳入。

def person(**kwargs):
    for k,v in kwargs.items():
        print('{0}: {1}'.format(k, v))

person(city='Shanghai')

extra = {'city': 'Beijing', 'job': 'Engineer'}
person(**extra)

五、命名關鍵字引數

  命名關鍵字引數也叫強制關鍵字引數。關鍵字引數允許傳入任意的引數,命名關鍵字引數可以限制傳入引數的關鍵字,使用*將其分開。

  • 通常使用方式如下,表示只接收關鍵字為city、job的引數傳入值。如果傳入其他未定義的關鍵字引數則報錯。
def person(name, age, *, city, job):
    print(name, age, city, job)

person('yzy', 23, city='beijing', job='programer')
  • 命名關鍵字引數一旦定義,呼叫時就必須要傳入,除非給定的關鍵字引數已經有了預設值
def person(name, age, *, city='beijing', job='programer'):
    print(name, age, city, job)

person('yzy', 23)
  • 如果已經有了一個可變引數,後面跟著的命名關鍵字引數就不再需要一個特殊分隔符 * 了:
def person(name, age, *scores, city='beijing', job='programer'):
    print(name, age, scores, city, job)

person('yzy', 23, 99, 100, city='shanghai')

  結果為: yzy 23 (99, 100) shanghai programer , 99,100 是傳遞的可變引數,後面是命名關鍵字引數。

六、函式引數組合使用

  以上5中引數都可以隨意組合,但是引數定義的順序必須是:位置引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數。
  注意: 引數的組合使用不建議太複雜,太複雜的話可讀性很差。

七、函式引數型別檢查

  函式的引數可以使用 isinstance() 內建函式來檢查。

def test(x,y,z):
    if not isinstance(x, int):
        raise TypeError('x need arg type int')
    if not isinstance(y, str):
        raise TypeError('y need arg type str')
    if not isinstance(z, (str, int)):
        raise TypeError('z need arg type str or int')

test(2,'3',object)