Python函數的參數

函數的參數:

先來安利一下:定義函數的時候,咱們把參數的名字和位置肯定下來,函數的接口就定義完了。
			對於函數的調用者來講,只須要知道如何傳遞正確的參數,以及函數返回什麼樣的值就夠了,
			函數內部的複雜邏輯被封裝起來,調用者無需瞭解。

	Python的函數定義很是簡單,可是卻很是靈活。除了正常定義的必選參數外,還可使用默認參數,
		可變參數和關鍵字參數,使得函數定義出來的接口,不但能處理複雜的參數,還能夠簡化
		調用者的代碼。

	只要函數執行到return 函數就會中止執行
	# 1. 每一個函數若是在函數中不寫return, 默認返回None
	# 2. 咱們也能夠只寫一個return, 也是返回None, 中止函數的執行
	# 3. return 一個返回值.  你在調用方能接受到一個返回值
	# 4. return 多個返回值. 多個值須要用,隔開   接收的位置. 接收的是元組.
	# 函數return返回多個值以元祖(tuple)存儲 	

1.位置參數
	def fun(a):
		return a+a	
	print(fun(3))#6
	對於fun(a)函數,參數a就是一個位置參數。
	當咱們調用fun函數時,必須傳入有且僅有的一個參數x

	def fun(x,n)
		x = x **n
		return x
	print(fun(2,4))#16
	x和n,這兩個參數都是位置參數,調用函數時,傳入的兩個值按照位置順序依次付給參數x和n

2.默認參數
	def fun(x,n=2):
		x = x **n
		return x
	print(fun(2))#4
	print(fun(2,4))#16
	默認參數能夠簡化函數的調用。設置默認參數時,需注意:
		1)必選參數在前,默認參數在後,不然python解釋器會報錯
		2)如何設置默認參數:當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。
			變化小的參數就能夠做爲默認參數。
	使用默認參數有什麼好處呢:最大的好處就是可以下降調用函數的難度。

	注意:默認參數的一個坑
			例子:
				def add(l=[]):
					l.append('a')
					return  l
				#正常調用時,結果正常
				print(add([1, 2, 3]))#[1, 2, 3, 'a']
				print(add([5, 4, 3]))#[5, 4, 3, 'a']
				#當使用默認參數調用時,一開始結果還正確,但是再此調用就不對了
				print(add())#['a']
				print(add())#['a', 'a']

				緣由解釋:
					Python函數在定義的時候,默認參數l的值就被計算出來了,即[],由於默認場參數l也是一個變量,
                    他指向對象[],每次調用函數,若是改變了l的內容,則下次調用時,默認參數的內容就變了,再也不
                    是函數定義時的[]了。

				注:定義默認參數要記牢一點:默認參數必須指向不變對象。

				解決上述問題:
					def add(L=None):
						if L is None:
							L=[]
						L.append('a')
						return L

3.可變參數

	def fun(*n):
	    sum = 0
	    for i in n:
	        sum += i
	    return sum
	print(fun(1,2,3))#6
	lis = [1,2,3]
	print(fun(*lis))#6
	tu = (1,2,3)
	print(fun(*tu))#6

	注意:因爲參數不肯定,因此咱們就傳入一個可變參數*n,Python容許你在list或tuple前面加一個*號,
        把list或tuple的元素變成可變參數傳進去。

4.關鍵字參數

		可變參數容許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝爲一個tuple。
        而關鍵字參數容許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict。

		def person(name, age, **kw):
    		print('name:', name, 'age:', age, 'other:', kw)
    	person('Michael', 3)#name: Michael age: 3 other: {}
    	person('A', 4, g='M', j='E')#name: A age: 4 other: {'g': 'M', 'j': 'E'}

    	關鍵字參數有什麼用?:它能夠擴展函數的功能。好比,在person函數裏,咱們保證能接收到name和age這兩個參數,
            可是,若是調用者願意提供更多的參數,咱們也能收到。試想你正在作一個用戶註冊的功能,除了用戶名和年齡
            是必填項外,其餘都是可選項,利用關鍵字參數來定義這個函數就能知足註冊的需求。

 5.命名關鍵字參數:
 		<1>
    	對於關鍵字參數,函數的調用者能夠傳入任意不受限制的關鍵字參數。
    	def person(name, age, **kw):
    		print('name:', name, 'age:', age, 'other:', kw)
    	person('JackChen', 20, city='shanghai', addr='shanxi', zipcode=123)

    	<2>
    	若是要限制關鍵字參數的名字,就能夠用命名關鍵字參數.
    	例如,只接收city和job做爲關鍵字參數。這種方式定義的函數以下:
    	def person(name, age, *, city, job):
    		print(name, age, city, job)
    	#和關鍵字參數**kw不一樣,命名關鍵字參數須要一個特殊分隔符*,
    	#*後面的參數被視爲命名關鍵字參數。
    	person('Jack', 20, city='Beijing', job='Engineer')#Jack 20 Beijing Engineer

    	<3>
    	若是函數定義中已經有了一個可變參數,後面跟着的命名關鍵字參數就再也不須要一個特殊分隔符
    	*了:
    	def person(name, age, *args, city, job):
    		print(name, age, args, city, job)

    	#命名關鍵字參數必須傳入參數名,這和位置參數不一樣。若是沒有傳入參數名,調用將報錯.
		person('Jack', 20, 'Beijing', 'Engineer')
		#Traceback (most recent call last):
		# File "<stdin>", line 1, in <module>
		#TypeError: person() takes 2 positional arguments but 4 were given
		因爲調用時缺乏參數名city和job,Python解釋器把這4個參數均視爲位置參數,
		但person()函數僅接受2個位置參數。

		<4>
		命名關鍵字參數能夠有缺省值,從而簡化調用:
		def person(name, age, *, city='Beijing', job):
    		print(name, age, city, job)
    	person('Jack', 20, job='Engineer')#Jack 20 Beijing Engineer

    	注意:使用命名關鍵字參數時,要特別注意,若是沒有可變參數,
    		 就必須加一個*做爲特殊分隔符。若是缺乏*,
    		 Python解釋器將沒法識別位置參數和命名關鍵字參數



參數組合:
		在Python中定義函數,能夠用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,
            這5種參數均可以組合使用。可是請注意,參數定義的順序必須是:
            必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。

		對於任意函數,均可以經過相似func(*args, **kw)的形式調用它,不管它的參數是如何定義的。
相關文章
相關標籤/搜索