python函式引數學習筆記

2022-05-12 18:16:53 字數 4216 閱讀 6091

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...