1. 程式人生 > >python函式之引數

python函式之引數

#!/usr/bin/env python3
#_*_ coding:utf-8 _*_

1.位置引數

#單個引數
def power(x):
    return x * x
	
#多個引數
def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
	

2.預設引數

#當修改為多個引數後,單個引數的呼叫失敗了,所以需要引入預設引數
#n=2為預設值,呼叫的時候輸入了,則使用呼叫者輸入的值,當呼叫者沒有輸入則使用預設值2,提高相容性
def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

	
	#預設引數的設定原則
		#1.必填引數在前,可選引數在後
		#2.多個引數的情況下,變化大的引數放前面,變化小的引數放後面
		
	#預設引數的好處
		#降低呼叫函式的難度
	#值得注意:
		#預設引數一定要是不可變的物件,比如list是可變的不行,但是list=None,None是不變的,則可以
		
	

3.可變引數,

*星號表示,**可變引數就是傳入的引數個數是可變的**,
#可以是1個、2個到任意個,還可以是0個,可以是基本資料型別也可以是list,tuple

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum


呼叫:呼叫的時候也要帶上*
>>> nums = [1, 2, 3]
>>> calc(*nums)


4.關鍵字引數 **兩個星表示

#可變引數允許你傳入0個或任意個引數,這些可變引數在函式呼叫時自動組裝為一個tuple。
#而**關鍵字引數允許你傳入0個或任意個含引數名的引數**,這些關鍵字引數在函式內部自動組裝為一個dict

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
	
#不傳引數
>>> person('Michael', 30)
name: Michael age: 30 other: {}
#	傳一個引數
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
#傳兩個引數
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

#和可變引數類似,也可以先組裝出一個dict,然後,把該dict轉換為關鍵字引數傳進去
#**extra表示把extra這個dict的所有key-value用關鍵字引數傳入到函式的**kw引數,
#kw將獲得一個dict,注意kw獲得的dict是extra的一份拷貝,對kw的改動不會影響到函式外的extra
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}



5.命名關鍵字引數

	#和關鍵字引數**kw不同,命名關鍵字引數需要一個特殊分隔符*,*後面的引數被視為命名關鍵字引數
	def person(name, age, *, city, job):
    print(name, age, city, job)
	
	呼叫
 >>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

	#如果函式定義中已經有了一個可變引數,後面跟著的命名關鍵字引數就不再需要一個特殊分隔符*了
	
	def person(name, age, *args, city, job):
    print(name, age, args, city, job)
	
	#命名關鍵字引數必須傳入引數名,這和位置引數不同。如果沒有傳入引數名,呼叫將報錯
	#因為沒有接引數名,系統當成位置引數報錯了
	>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: person() takes 2 positional arguments but 4 were given

#命名關鍵字引數可以有預設值,預設值,從而簡化呼叫,city='Beijing'為預設值,呼叫時,可只傳入job

def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)
	
	



6.引數組合

#在Python中定義函式,可以用必選引數、預設引數、可變引數、關鍵字引數和命名關鍵字引數,這5種引數都可以組合使用。
#但是請注意,引數定義的順序必須是:必選引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數
#雖然可以組合多達5種引數,但不要同時使用太多的組合,否則函式介面的可理解性很差。

#對於任意函式,都可以通過類似func(*args, **kw)的形式呼叫它,無論它的引數是如何定義的

參考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431752945034eb82ac80a3e64b9bb4929b16eeed1eb9000