什么是函數(shù)和為什么要用函數(shù)?
函數(shù)是組織好的,可重復使用的,用來實現(xiàn)單一,或相關聯(lián)功能的代碼段。
函數(shù)能提高應用的模塊性,和代碼的重復利用率。
已經(jīng)知道Python提供了許多內(nèi)建函數(shù),比如print。
但你也可以自己創(chuàng)建函數(shù),這被叫做用戶自定義函數(shù)。
如果不用函數(shù),會怎么樣?
如果沒有函數(shù),代碼就會從上往下執(zhí)行全部執(zhí)行。
函數(shù)沒有調(diào)用的時候,它不會自己執(zhí)行的。
比如你去購物網(wǎng)站買東西,網(wǎng)站沒有用函數(shù)。
你打開他們的首頁,然后后臺的代碼從上往下執(zhí)行。
一個項目中有多少功能,多少代碼量。
當打開首頁需要話費5分鐘,搜索商品又要花費 5分鐘,你以后肯定不去這個網(wǎng)站購物了。
本來網(wǎng)站首頁只需要調(diào)用一個函數(shù)就可以了,搜索商品頁面也是一個函數(shù)。這樣兩個頁面前后打開加起來也就幾秒的事。
定義一個函數(shù)
你可以定義一個由自己想要功能的函數(shù),以下是簡單的規(guī)則:
函數(shù)代碼塊以def關鍵詞開頭,后面依次寫出函數(shù)名、括號、括號中的參數(shù)和冒號。
任何傳入?yún)?shù)和自變量必須放在圓括號中間,圓括號之間可以用于定義參數(shù)。
函數(shù)的第一行語句可以選擇性地使用文檔字符串—用于存放函數(shù)說明。
函數(shù)內(nèi)容以冒號起始,在縮進塊中編寫函數(shù)體。
return 表達式結束函數(shù),選擇性地返回一個值給調(diào)用方。不帶表達式的return相當于返回 None。
只要有return 表達式后面的代碼都不會再執(zhí)行。
語法
Python 定義函數(shù)使用 def 關鍵字,一般格式如下:
函數(shù)調(diào)用
定義一個函數(shù),給了函數(shù)一個名稱,指定了函數(shù)里包含的參數(shù),和代碼塊結構。
參數(shù)傳遞
在 python 中,類型屬于對象,變量是沒有類型的。
定義函數(shù)的時候,我們把參數(shù)的名字和位置確定下來。
對于函數(shù)的調(diào)用者來說,只需要知道如何傳遞正確的參數(shù),以及函數(shù)將返回什么樣的值就夠了。
函數(shù)內(nèi)部的復雜邏輯被封裝起來,調(diào)用者無需了解。
Python的函數(shù)定義非常簡單,但靈活度卻非常大。
除了空參數(shù)和正常定義的必選參數(shù)外,還可以使用默認參數(shù)、可變參數(shù)和關鍵字參數(shù)。以下是調(diào)用函數(shù)時可使用的正式參數(shù)類型:
空參數(shù)
必需參數(shù)
默認參數(shù)
不定長參數(shù)
空參數(shù)
必需參數(shù)
必需參數(shù)必須傳入函數(shù)。調(diào)用時的數(shù)量必須和聲明時的一樣。
如果不傳參數(shù),會報錯。門需要鑰匙開門,沒帶鑰匙怎么可以打開。
默認參數(shù)
調(diào)用函數(shù)時,如果沒有傳遞參數(shù),則會使用默認參數(shù)。
輸出結果:參數(shù)num,str='求平方的值',調(diào)用函數(shù)只傳一個參數(shù)5,其實程序自己把默認值str='求平方的值'也傳入了,我們看不到而已。
調(diào)用函數(shù)時,修改默認值。
輸出結果:
不定長參數(shù)
定義出這個函數(shù),我們必須確定輸入的參數(shù)。由于參數(shù)個數(shù)不確定,你可能需要一個函數(shù)能處理比當初聲明時更多的參數(shù)。這些參數(shù)叫做不定長參數(shù),和上述 2 種參數(shù)不同,聲明時不會命名。
加了星號*的參數(shù)會以元組(tuple)的形式導入,存放所有未命名的變量參數(shù)。
如果在函數(shù)調(diào)用時沒有指定參數(shù),它就是一個空元組。我們也可以不向函數(shù)傳遞未命名的變量。
輸出結果:
傳入多個參數(shù)輸出結果:
函數(shù)一個必須參數(shù)和一個可變的元組參數(shù)。傳入3個參數(shù)減去一個必須參數(shù),剩下的2個參數(shù)都放到可變的元組參數(shù)中,所以不定長參數(shù)有兩個元素。
加了兩個星號**的參數(shù)會以字典的形式導入。
如果在函數(shù)調(diào)用時沒有指定參數(shù),它就是一個空字典。我們也可以不向函數(shù)傳遞未命名的變量。
輸出結果:
傳入?yún)?shù)輸出結果:
兩個星號**的參數(shù)會把賦值形式的參數(shù)變?yōu)樽值湫问健?/p>
組合參數(shù):
參數(shù)定義的順序必須是:必選參數(shù)、默認參數(shù)、可變參數(shù)。
輸出結果:
change('名字',12,'元組',sex='男',ad='地址'),一個必須參數(shù)name對應名字,默認參數(shù)值1被傳遞的第二個參數(shù)12替換。第三個參數(shù)歸類到一個星號的元組參數(shù),如果沒有碰到sex='男'這樣的參數(shù),后面的參數(shù)都會歸類到一個星號的元組參數(shù)。
直到碰到類似sex='男'這樣的賦值語句,它才會歸類到兩個星號的字典參數(shù)。例子:
輸出結果:看到這里又有疑問{'a':1,'b':'c'}不是字典,怎么會歸類到元組。
要記住一個原則,碰到賦值形式的語句才歸類到兩個星號的字典參數(shù)。把{'a':1,'b':'c'}改一下。
輸出結果:把{'a':1,'b':'c'}賦值給dict。
return語句
return語句用于退出函數(shù),選擇性地向調(diào)用方返回一個表達式。沒有return語句默認返回None。
函數(shù)返回多個值,是以元組的形式,注意用逗號隔開。
輸出結果:
匿名函數(shù):python 使用 lambda 來創(chuàng)建匿名函數(shù)。
所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函數(shù)。
lambda 只是一個表達式,函數(shù)體比 def 簡單很多。
lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
lambda 函數(shù)的語法只包含一個語句: