Day6 函式與Lambad表示式

2021-09-29 00:03:21 字數 4495 閱讀 9065

函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的**段。

函式能提高應用的模組性,和**的重複利用率。你已經知道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 老馬的程式人生 傳遞進來的老馬的程式...