1、引數的傳遞是通過自動將物件賦值給本地變數名來實現的。函式引數(呼叫者傳送的(可能的)共享物件的引用值),所有的引數實際上都是通過指標進行傳遞的。作為引數被傳遞的物件從裡不自動拷貝。2、在函式內部的引數名的賦值不會影響呼叫者。在函式執行時,在函式頭部的引數名是乙個新的、本地變了,這個變數名時再函式的本地作用域內的。函式引數名和呼叫者作用域的變數名是沒有別名的。
3、改變函式的可變物件的引數也許會對呼叫者有影響。換句話說,因為引數是簡單的賦值給傳入物件。函式能夠就地的改變傳入的可變物件,因此其結果影響呼叫者。可變引數對於函式來說是可以做輸入和輸出的。
4、不可變引數「通過值」進行拷貝的。像整數和字串這樣的物件通過物件引用而不是拷貝進行傳遞的,但是因為你無聊怎樣都不可能在原處改變不可變物件,實際效果就很像建立乙份拷貝。
5、可變物件是通過「指標」進行傳遞的。例如,列表和字典這樣的物件也就是通過物件引用進行傳遞的,這點與c語言使用的指標傳遞陣列很相似:可變物件那個在函式內部進行原處的改變,這一點和c陣列很像。
例如:def f(a,b):
a = 100
b[0]='spam'
x = 1
y = [1,2]
f(x,y)
print(x,y) #輸出:100,['spam',2] 因為給a傳遞的是數字,數字不可變,但是b可以改變
6、引數傳遞的幾種方式
位置:從左到右進行匹配。
關鍵字引數:通過引數名進行匹配
預設引數:為沒有傳入值的引數定義引數值
可變引數:手機任意多基於位置或者關鍵字的引數:(呼叫者能夠再使用*語法去將引數集合打散,分成引數,這個*與在函式頭部的*恰恰相反,在函式頭部的它意味著收集任意多的引數,而在呼叫中意味著傳遞任意多的引數。)
keywod-only引數:引數必須按照名稱傳遞:(在python3.0中(不包括python2.6))函式也可以指定引數,引數必須用帶有關鍵字引數的名字來傳遞。這樣的引數通常用來地宮一實際引數以外配置選項。
7、例子:
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中有的
8、如果決定使用並混合特定的引數匹配模型,python將會遵循下面有關 順序法則。
(在函式呼叫中,引數必須以此屬性出現:任何位置引數(value),後面跟著任何關鍵字引數(name=value)和*sequence像是的組合,後面跟著**dict形式)
(在函式頭部,引數必須以此書序出現;任何一般引數(name),緊跟著任何預設引數(name=value),如果有的話,後面是*name(或者在python3.0中是*)形式,後面跟著任何name或者name=value kyeword-only(在python3.0中)後面跟著**name形式)
9、任意引數的例項
例如:* def f(*arg):print(arg)
f() #輸出:()
f(1)#輸出:(1,)
f(1,2,3,4,5)#輸出:(1,2,3,4,5)
**能夠對多餘的關鍵字引數有效,將多餘的關鍵字引數轉化為字典。
def (**arg):print(arg)
f() #輸出:{}
f(a=1,b=2) #輸出:
混合用法:
def f(a,*arg,**kargs):print(a,arg,kargs)
f(1,2,3,x=1,y=x) #輸出:1,(2,3)
10、解包引數
*解包元祖,列表,集合,字串
def func(a,b,c,d):print(a,b,c,d)
arg = (1,2)
arg += (3,4)
func(*args) #輸出:1,2,3,4
**解包字典,使其成為獨立的關鍵字引數(就是說鍵必須跟函式定義時的引數同名)
d =
f(**d)#輸出:1,2,3,4
#錯誤的:d = f(**t) 會報錯
11、python3.0 keysword-only關鍵字引數
語法:keyword-onl引數編碼為命名的引數,出現在引數列表*args之後,所有的這些引數必須在呼叫中使用關鍵字語法來傳遞。例如下面的**:a可能按照名稱或者位置傳遞,b可以收集任意額外的位置引數,並且c必須只按照關鍵字攢地
def f(a,*b,c):
print(a,b,c)
f(1,2,c=3) #輸出;1 (2,) 3
f(a=1,c=3) #輸出:1 () 3
#f(1,2,3) 報錯
我們可以在引數列表中使用乙個*字元,來表示乙個函式不會接受乙個變數長度引數列表,而仍然期待跟在*後面的所有字元都作為關鍵字傳遞。在下乙個函式中,a可能再次按照位置或者名稱傳遞,但是b和c必須按照關鍵字傳遞,不允許其他額外的位置傳遞
def f(a,*,b,c):
print(a,b,c)
f(1,c=3,b=2) #輸出:1,2,3
f(c=3,b=2,a=1) #輸出:1,2,3
#f(1,2,3) 和f(1)都會報錯。
仍然可以對keyword——only引數使用預設值,即便他們出現在函式的頭部中*後面,在下面的**中,a可能按照名次或者位置傳遞,而b和c是可選的,但是如果使用的話必須按照關鍵字傳遞:
def f(a,*,b='spam',c='ham'):
print(a,b,c)
f(1) #輸出:1,spam,ham
f(1,c=3) #輸出:1,spam,3
f(a=1) #輸出:1,spam,ham
f(c=3,a=1,b=2) #輸出:1,2,3
12、keyword-only定義時排序規則
keyword-only引數必須在乙個單個星號後面指定,而不是兩個星號前。這意味著,在乙個函式頭部,keyword-only引數必須編寫在**args關鍵字引數之前,且在*arg任意位置形式之後。當二者都有的時候,無論何時,乙個引數名稱出現在*args之前,它可能是預設位置引數,而不是keyword_only引數。
#錯誤的def f(a,*b,**d,c=6):print(a,b,c,d)
#正確的
def f(a,*b,c=6,**d):print(a,b,c,d)
f(1,2,3,x=4,y=5) #輸出:1 (2,3) 6
f(1,2,3,x=4,y=5,c=7) #輸出:1 (2,3) 7
f(1,2,3,c=7,x=4,y=5) #輸出:1 (2,3) 7
但是最後乙個不是keyword-only引數了
def f(a,c=6,*b,**d):print(a,b,c,d)
f(1,2,3,x=4) #輸出:1 (3,) 2
13、keyword-only呼叫時排序規則
在函式呼叫中,當傳遞keyword-only引數的時候,他們必須出現在**args形式之前。keyword-only引數可以出現在*arg之前或者之後,也有可能包含在**arg中
def f(a,*b,c=6,**d)
14、模擬python3.0中的print函式
def print30(*args,**kargs):
sep = kargs.get('seq',' ')
end = kargs.get('end','\n')
file = kargs.get('file',sys.stdout)
output = ''
first = true
for arg in args:
output += ('' if first else sep))+str(arg)
first = false
file.write(output+end)
Python函式學習 函式 引數
本篇是對 python3函式的學習與小結,用於複習鞏固使用,如有理解偏差的地方,還望各位大佬指正。函式的作用 函式的分類 小結 def 函式名 引數列表 函式體 塊 return 返回值 小結 函式名 str 函式定義,只是宣告了乙個函式,它不會被執行,需要呼叫 呼叫的方式,就是函式名後加上小括號,...
python函式引數學習 python函式學習1
函式1 1 定義 def 函式名 引數列表 函式體 2 引數傳遞 在python中,一切都是物件,型別也屬於物件,變數是沒有型別的。a 1,2,3 a helloworld 以上 中,1,2,3 是list型別,helloworld 是string型別,而變數a是沒有型別的,它僅僅是乙個物件的引用 ...
Python函式學習 引數型別
在定義python函式時可定義形參,這些引數在呼叫時候才能確定具體的值,由函式的呼叫者負責為行參傳入引數值 也叫必傳引數,順序引數,是最重要的,也是必須在呼叫函式時明確提供的引數!位置引數必須按先後順序,一一對應,個數不多不少的傳遞!說明 a,b,c是函式add的行參,沒有具體的值,只有在add x...