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