python學習3(廖雪峰教程) 函式

2021-10-19 19:19:24 字數 4195 閱讀 3309

1.函式定義

依次寫出函式名、括號、括號中的引數和冒號:,然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。

def my_abs(x):

if x >= 0:

return x

else:

return -x

如果想定義乙個什麼事也不做的空函式,可以用pass語句:

def nop(

): pass

pass語句什麼都不做,那有什麼用?實際上pass可以用來作為佔位符,比如現在還沒想好怎麼寫函式的**,就可以先放乙個pass,讓**能執行起來。

pass還可以用在其他語句裡,比如:

if age >= 18:

pass

缺少了pass,**執行就會有語法錯誤。

當傳入了不恰當的引數時,內建函式abs會檢查出引數錯誤,而我們定義的my_abs沒有引數檢查,會導致if語句出錯,出錯資訊和abs不一樣。所以,這個函式定義不夠完善。

讓我們修改一下my_abs的定義,對引數型別做檢查,只允許整數和浮點數型別的引數。資料型別檢查可以用內建函式isinstance()實現:

def my_abs(x):

if not isinstance(x, (int, float)):

raise typeerror(

'bad operand type'

)if x >= 0:

return x

else:

return -x

2.可變引數與不可變引數

可更改(mutable)與不可更改(immutable)物件

在 python 中,strings, tuples, 和 numbers 是不可更改的物件,而 list,dict 等則是可以修改的物件。

不可變型別:變數賦值 a=5 後再賦值 a=10,這裡實際是新生成乙個 int 值物件 10,再讓 a 指向它,而 5 被丟棄,不是改變a的值,相當於新生成了a。

可變型別:變數賦值 la=[1,2,3,4] 後再賦值 la[2]=5 則是將 list la 的第三個元素值更改,本身la沒有動,只是其內部的一部分值被修改了。

python 函式的引數傳遞:

不可變型別:類似 c++ 的值傳遞,如 整數、字串、元組。如fun(a),傳遞的只是a的值,沒有影響a物件本身。比如在 fun(a)內部修改 a 的值,只是修改另乙個複製的物件,不會影響 a 本身。

def change(a):

print(id(a))

# 指向的是同乙個物件

a=10

print(id(a))

# 乙個新物件

a=1print(id(a))

change(a)

可變型別:類似 c++ 的引用傳遞,如 列表,字典。可變物件在函式裡修改了引數,那麼在呼叫這個函式的函式裡,原始的引數也被改變了

# 可寫函式說明

def changeme( mylist ):

"修改傳入的列表"

[1,2,3,4]

) print (

"函式內取值: ", mylist)

return

# 呼叫changeme函式

mylist =

[10,20,30]

changeme( mylist )

print (

"函式外取值: ", mylist)

傳入函式的和在末尾新增新內容的物件用的是同乙個引用。故輸出結果如下:

函式內取值: [10, 20, 30, [1, 2, 3, 4]]

函式外取值: [10, 20, 30, [1, 2, 3, 4]]

2.函式的引數

以下是呼叫函式時可使用的正式引數型別:

必需引數

關鍵字引數

預設引數

不定長引數

(1)必須引數

必需引數須以正確的順序傳入函式。呼叫時的數量必須和宣告時的一樣。

呼叫 printme() 函式,你必須傳入乙個引數,不然會出現語法錯誤

(2)關鍵字引數

關鍵字引數和函式呼叫關係緊密,函式呼叫使用關鍵字引數來確定傳入的引數值。

使用關鍵字引數允許函式呼叫時引數的順序與宣告時不一致,因為 python 直譯器能夠用引數名匹配引數值。

def printinfo( name, age ):

"列印任何傳入的字串"

print (

"名字: ", name)

print (

"年齡: ", age)

return

#呼叫printinfo函式

printinfo( age=50, name=

"runoob"

)

(3)預設引數

呼叫函式時,如果沒有傳遞引數,則會使用預設引數。預設引數必須放在最後,以下例項中如果沒有傳入 age 引數,則使用預設值:

def printinfo( name, age = 35 ):

"列印任何傳入的字串"

print (

"名字: ", name)

print (

"年齡: ", age)

return

#呼叫printinfo函式

printinfo( age=50, name=

"runoob"

)print (

"------------------------"

)printinfo( name=

"runoob"

)

def functionname(

[formal_args,] *var_args_tuple ):

"函式_文件字串"

function_suite

return

[expression]

加了星號 * 的引數會以元組(tuple)的形式匯入,存放所有未命名的變數引數。

#不定長引數

def printinfo(adg1,*vartuple):

"列印任何輸入的引數"

print(adg1)

print(vartuple)

printinfo(40,34,70,60,80)

printinfo(30)

40

(34, 70, 60, 80)

30()

如果在函式呼叫時沒有指定引數,它就是乙個空元組。我們也可以不向函式傳遞未命名的變數。

還有一種就是引數帶兩個星號 **基本語法如下:

def functionname(

[formal_args,] **var_args_dict ):

"函式_文件字串"

function_suite

return

[expression]

加了兩個星號 ** 的引數會以字典的形式匯入。

def printinfo(arg1,**vardict):

"列印任何傳入的引數"

print(arg1)

print(vardict)

printinfo(1,a=2,b=3,c=

'd')

1

宣告函式時,引數中星號 * 可以單獨出現,例如:

def f(a,b,*,c):

return a+b+c

如果單獨出現星號 * 後的引數必須用關鍵字傳入。

>>

> def f(a,b,*,c):

... return a+b+c

...

>>

> f(1,2,3)

# 報錯

traceback (most recent call last):

file "", line 1, in

typeerror: f(

) takes 2 positional arguments but 3 were given

>>

> f(1,2,c=3)

# 正常

6

廖雪峰python3教程學習隨筆

未完 1.建立例項的時候,需要定義乙個特殊的 init 方法,而且它的第乙個引數永遠是self,表示建立的例項本身。因此,在 init 方法內部,就可以把各種屬性繫結到self,因為self就指向建立的例項本身。class student object def init self,name,scor...

python廖雪峰教程 學習筆記

如何用字元來描述字元 d匹配數字 digit w匹配字母或數字 word s可以匹配空格 space 表示任意個字元,表示至少乙個字元 表示0個或1個字元,表示n個字元,表示n m個字元 可以匹配任意字元 例如 kongxiangyu w如何做到更精確的匹配?規定數字 字母或者下劃線 0 9a za...

廖雪峰git教程學習筆記3

commit是一串不便記憶的數字,為了方便記憶,引入tag,tag就跟head一樣,就像乙個指標,指向commit,且指向是不能變得,乙個commit就有乙個tag 給當前分支下的當前commit打上tag git tag 檢視所有tag git tag 給以前的commit打上tag 用git l...