點選(此處)折疊或打開
- #!/usr/bin/env python
- # -*- coding:utf8 -*-
- '''
- 參數(argument或parameter)
- 對象作為輸入發送給函數的方式,參數指派給函數中的一個名稱。
- 傳遞參數
- 參數的傳遞是通過自動将對象指派給本地變量名來實作的。
- 函數内部的參數名的指派不會影響調用者。
- 改變函數的可變對象參數的值也許會對調用者有影響
- 不可變參數‘通過值’進行傳遞。如字元串,整數。
- 可變參數通過‘指針’進行傳遞。如清單,字典。
- 避免可變參數的修改
- python的類依賴原處修改一個傳入的“self”參數來更新對象狀态。
- 如果不想函數内部的修改影響傳遞給它的對象,可以明确的建立可變對象的拷貝。如L=[:]
- 為了真正意義上防止這些改變,将可變對象轉換成不可變對象來解決。例如元組,tuple()函數。但使用這種技術會讓函數失去一種參數能夠調用任意清單特定方法的能力,包括不會在原處改變對象的那些方法都不再能夠使用。
- 函數能夠更新為傳入可變對象的形式。
- 必須要有意識到這個屬性:如果在你沒有預期的情況下對象在外部發生了改變,檢查一下是不是一個調用了函數引起的,并且有必要的話當傳入對象時進行拷貝。
- 對參數輸出進行模拟
- return可以傳回任意種類的對象,是以它也能名傳回多個值。
- 特定的參數比對模型
- 參數在python總是通過指派傳遞的。
- 預設情況下,參數是通過其位置進行比對的,左右順序,精确的傳遞數量一樣多的參數。
- 參數位置:從左至右進行比對
- 關鍵字參數:通過參數名進行比對。name=value形式文法。
- 預設參數:為沒有傳入值的參數定義參數值。還是name=value文法。
- 可變參數:收集任意多基于位置或關鍵字的參數。以×号開頭,收集任意多的額外參數。
- 可變參數解包:傳遞任意多的基于位置或關鍵字的參數。
- 同樣使用×。隻不過與函數頭部的×恰恰相反:在函數頭部它意味着收集任意多的參數,在調用者中意味着傳遞任意多的參數。
- keyword-only參數:參數必須按照名稱傳遞。
- 比對文法:
- 文法 位置 解釋
- func(value) 調用者 正常參數:通過位置進行比對
- func(name=value) 調用者 關鍵字參數:通過變量名比對
- func(*sequence) 調用者 以name傳遞所有的對象,并作為獨立的基于位置的參數
- func(**dict) 調用者 以name成對的傳遞所有的關鍵字/值,并作為獨立的關鍵字參數
- def func(name) 函數 正常參數:通過位置或變量名進行比對
- def func(name=value) 函數 預設值參數,如果沒有在調用中傳遞的話。
- def func(*name) 函數 比對關收集(在元組中)所有包含位置的參數。收集除了位置,關鍵字參數外的其它參數到元組中。
- def func(**name) 函數 比對差收集(在字典中)所有包含位置的參數。收集除了位置,關鍵字參數外的其它參數到字典中。
- def func(*args,name) 函數 參數必須在調用中按照關鍵字傳遞。
- def func(*,name=value) 函數 (python3.0)
- python參數比對的順序法則:
- 函數調用時,任何位置參數(value),後面跟着任何關鍵字參數(name=value)和*sequence組合後面跟着**dict形式。
- 函數頭部定義時,任何一般參數(name),緊跟預設參數(name=value),如果有的話,後面是*name(或*)的形式,後面跟着任何name或name=value keyword-only參數,後面踴着**name形式。
- 在調用時表示關鍵字參數,在函數字義時表示預設參數。
- 1,通過位置配置設定非關鍵字參數。
- 2.通過比對變量名配置設定關鍵字參數。
- 3.其它額外的非關鍵字參數配置設定到*name元組中。
- 4.其它額外的關鍵字參數配置設定到**name字典中。
- 5.用預設值配置設定給在頭部未得到配置設定的參數。
- # 參數和共享引用
- def f(a):
- a = 99
- b = 88
- f(b) # 将b整數對象的值賦給a
- print(b) # 88 b的值未受函數内部指派的影響。
- def changer(a, b):
- a = 2
- b[0] = 'talen'
- X = 1
- Y = [1, 2]
- changer(X, Y)
- print(X, Y) # (1, ['talen', 2])對于清單這種可變對象的傳遞,函數内部修改了引用後會影響到調用者的變量。當然這種原處修改,隻有在修改的對象比函數生命更長的時候才會影響調用者。
- a = X
- a = 2
- print(X) # 1 #對X沒有任何影響
- L = [1, 2]
- b = L
- b[0] = 'talen'
- print(L) # ['talen', 2] #對可變對象的原處修改,影響了引用者的值。
- changer(X, L[:])
- print(X, L) # (1, [1, 2]) #對拷貝L[:]的修改沒有影響L的對象。
- def multiple(x, y):
- x = 2
- y = [3, 4]
- return x, y
- C, D = multiple(1, 2)
- print(C, D) # (2, [3, 4]) #傳回了數組對象,勇冠指派列印出結果。
- # 參數比對
- print('預設值參數')
- def f(a, b, c=3000):
- print(a, b, c)
- print('位置參數')
- f(9, 8, 7)
- print('關鍵字參數')
- f(b=20, c=30, a=10) # (10, 20, 30) #調用者傳入的參數必須跟函數字義的參數名一緻。
- f(100, c=300, b=100) # (100, 100, 300) #混合使用時位置參數優先比對,是以a變量的位置必須固定。
- f(1000, b=2000) # (1000, 2000, 3000) #c會使用預設值參數
- f(10000, b=2) # (10000, 2, 3000) #預設值與關鍵字參數混合
- def func(spam, eggs, toast=3, ham=4):
- print((spam, eggs, toast, ham))
- func(1, 2) # (1, 2, 3, 4) #位置參數與預設值混合
- func(1, ham=44, eggs=22) # (1, 22, 3, 44) #位置參數,關鍵字與預設值混合
- func(spam=111, eggs=222) # (111, 222, 3, 4) #關鍵字與預設值混合
- func(toast=3333, eggs=2222, spam=1111) # (1111, 2222, 3333, 4)#同上
- func(1, 2, 3, 4) # (1, 2, 3, 4) #位置參數
- print('任意參數*,**')
- # 在函數定義中,在元組中收集不比對的位置參數。
- # **隻對關鍵字參數有效
- def t(*args):
- print(args)
- t()
- t(1)
- t(1, 2, 3, 5)
- def d(**args):
- d()
- d(a=100, b='sf')
- print('混合使用')
- def all(a, *pargs, **kargs):
- print(a, pargs, kargs)
- all(100, 3, 4, 5, x=77, b=99) # (100, (3, 4, 5), {'x': 77, 'b': 99})
- print('調用時解包參數')
- args = (1, 2)
- args += (5, 6)
- func(*args)
- func(*(1,2),**{'toast':67,'ham':788})
- def tracer(fund,*pargs,**kargs):
- print('calling:',fund.__name__)
- return fund(*pargs,**kargs)
- def fund(a,b,c,d):
- return a+b+c+d
- print(tracer(fund,1,2,c=3,d=4))
- print('min')
- def min1(*targs):
- res=targs[0]
- for arg in targs[1:]:
- if arg res:
- res=arg
- return res
- print(min1(6,7,8,1,2))
- def min2(first,*targs):
- res=first
- for arg in targs:
- print(min2(8,6,4,5,7))
- def min3(*targs):
- tmp=list(targs)
- tmp.sort()
- return tmp[0]
- print(min3(23,34,45,325,22,3,23345,89))
- print(min1('bb','aa'))
- print(min3([2,2],[1,1],[3,3]))
- #函數作為另一種參數對象可以傳入一個函數。
- def minmax(test,*margs):
- res=margs[0]
- for arg in margs[1:]:
- if test(arg,res): #如果為真,傳回arg的值,test可套用大于,小于等不同定義的函數。
- def lessthan(x,y):
- return x y
- def grtrthan(x,y):
- return x>y
- print(minmax(lessthan,5,3,21,3,5,3,25,45,26,6,7,100,325))
- print(minmax(grtrthan,324,243,3,5,6,7,8,8,3,2,967))
- #通用set函數
- def intersect(*sargs):
- res = []
- for x in sargs[0]:
- for other in sargs[1:]:
- if x not in other:
- break
- else:
- res.append(x)
- return union(res) #書上這一塊感覺有錯誤,沒有将重複的去除。
- def union(*sargs):
- res=[]
- for seq in sargs:
- for x in seq:
- if not x in res:
- s1,s2,s3='spam','scam','slam'
- #print(intersect(s1,s2))
- #print(union(s2,s3))
- print('多個參數')
- print(intersect(s1,s2,s3))
- print(union(s1,s2,s3))
- /usr/bin/python2.7 /home/talen/PycharmProjects/untitled/t18.py
- 88
- (1, ['talen', 2])
- 1
- ['talen', 2]
- (1, [1, 2])
- (2, [3, 4])
- 預設值參數
- 位置參數
- (9, 8, 7)
- 關鍵字參數
- (10, 20, 30)
- (100, 100, 300)
- (1000, 2000, 3000)
- (10000, 2, 3000)
- (1, 2, 3, 4)
- (1, 22, 3, 44)
- (111, 222, 3, 4)
- (1111, 2222, 3333, 4)
- 任意參數*,**
- ()
- (1,)
- (1, 2, 3, 5)
- {}
- {'a': 100, 'b': 'sf'}
- 混合使用
- (100, (3, 4, 5), {'x': 77, 'b': 99})
- 調用時解包參數
- (1, 2, 5, 6)
- (1, 2, 67, 788)
- ('calling:', 'fund')
- 10
- min
- 4
- 3
- aa
- [1, 1]
- 967
- 多個參數
- ['s', 'a', 'm']
- ['s', 'p', 'a', 'm', 'c', 'l']
- Process finished with exit code 0