函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的**段。
函式能提高應用的模組性,和**的重複利用率。你已經知道python提供了許多內建函式,比如print()。但你也可以自己建立函式,這被叫做使用者自定義函式。
定義乙個函式
你可以定義乙個由自己想要功能的函式,以下是簡單的規則:
def 函式名(引數列表):
函式體
預設情況下,引數值和引數名稱是按函式宣告中定義的順序匹配起來的。
函式呼叫
定義乙個函式:給了函式乙個名稱,指定了函式裡包含的引數,和**塊結構。
這個函式的基本結構完成以後,你可以通過另乙個函式呼叫執行,也可以直接從 python 命令提示符執行。
如下例項呼叫了 printme() 函式:
#!/usr/bin/python3
# 定義函式
defprintme
(str):
# 列印任何傳入的字串
print
(str
)return
# 呼叫函式
printme(
"我要呼叫使用者自定義函式!"
)printme(
"再次呼叫同一函式"
)
我要呼叫使用者自定義函式!
再次呼叫同一函式
引數傳遞
在 python 中,型別屬於物件,變數是沒有型別的
可更改(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 本身。
可變型別:類似 c++ 的引用傳遞,如 列表,字典。如 fun(la),則是將 la 真正的傳過去,修改後fun外部的la也會受影響
#!/usr/bin/python3
# 可寫函式說明
defchangeme
( 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]]
引數
以下是呼叫函式時可使用的正式引數型別:
必需引數
關鍵字引數
預設引數
不定長引數
必需引數
必需引數須以正確的順序傳入函式。呼叫時的數量必須和宣告時的一樣。
呼叫 printme() 函式,你必須傳入乙個引數,不然會出現語法錯誤。
關鍵字引數
關鍵字引數和函式呼叫關係緊密,函式呼叫使用關鍵字引數來確定傳入的引數值。
使用關鍵字引數允許函式呼叫時引數的順序與宣告時不一致,因為 python 直譯器能夠用引數名匹配引數值。
以下例項在函式 printme() 呼叫時使用引數名:
#!/usr/bin/python3
#可寫函式說明
defprintme
(str):
"列印任何傳入的字串"
print
(str
)return
#呼叫printme函式
printme(
str=
"菜鳥教程"
)
以上例項輸出結果:
菜鳥教程
函式引數的使用不需要指定順序
預設引數
呼叫函式時,如果沒有傳遞引數,則會使用預設引數。以下例項中如果沒有傳入 age 引數,則使用預設值:
#!/usr/bin/python3
#可寫函式說明
defprintinfo
( name, age =35)
:"列印任何傳入的字串"
print
("名字: "
, name)
print
("年齡: "
, age)
return
#呼叫printinfo函式
printinfo( age=
50, name=
"runoob"
)print
("------------------------"
)printinfo( name=
"runoob"
)
以上例項輸出結果:
名字: runoob
年齡:50--
----
----
----
----
----
--名字: runoob
年齡:35
加了兩個星號 ** 的引數會以字典的形式匯入
加了星號 * 的引數會以元組(tuple)的形式匯入,存放所有未命名的變數引數。
宣告函式時,引數中星號 * 可以單獨出現
如果單獨出現星號 * 後的引數必須用關鍵字傳入。
匿名函式
python 使用lambda來建立匿名函式。
所謂匿名,意即不再使用 def 語句這樣標準的形式定義乙個函式。
lambda 只是乙個表示式,函式體比 def 簡單很多。
lambda的主體是乙個表示式,而不是乙個**塊。僅僅能在lambda表示式中封裝有限的邏輯進去。
lambda 函式擁有自己的命名空間,且不能訪問自己引數列表之外或全域性命名空間裡的引數。
雖然lambda函式看起來只能寫一行,卻不等同於c或c++的內聯函式,後者的目的是呼叫小函式時不占用棧記憶體從而增加執行效率。
#!/usr/bin/python3
# 可寫函式說明
sum=
lambda arg1, arg2: arg1 + arg2
# 呼叫sum函式
print
("相加後的值為 : "
,sum(10
,20))
print
("相加後的值為 : "
,sum(20
,20))
以上例項輸出結果:
相加後的值為 :
30相加後的值為 :
40
return語句
return [表示式] 語句用於退出函式,選擇性地向呼叫方返回乙個表示式。不帶引數值的return語句返回none。之前的例子都沒有示範如何返回數值,以下例項演示了 return 的用法
#!/usr/bin/python3
# 可寫函式說明
defsum
( arg1, arg2 )
:# 返回2個引數的和."
total = arg1 + arg2
print
("函式內 : "
, total)
return total
# 呼叫sum函式
total =
sum(10,
20)print
("函式外 : "
, total)
函式內 :
30 函式外 :
30
Day 6 函式與模組
def函式名 引數列表 函式體 示例1 計算矩形面積 函式名 area 引數 width 和 height 返回值 width height def area width,height 1 return width height 必須引數,按順序傳入引數 其中,5,6 按順序傳入,預設傳入width...
DAY6 函式與Lambda表示式
no.5函式與lambda表示式 一 函式 1 建立函式def 語法 def myfunction 語句2 呼叫函式 語法 myfunction 函式內容 3 函式的引數 e.g.def a name print name 少年 a 壁花 壁花少年 e.g.def add b,c result b ...
Day 6 函式與Lambda表示式
練習1 怎麼給函式編寫 檔?def myfirstfunction name 函式定義過程中name是形參 因為ta只是乙個形式,表示佔據乙個引數位置 print 傳遞進來的叫做實參,因為ta是具體的引數值!format name myfirstfunction 老馬的程式人生 傳遞進來的老馬的程式...