第017講:函式 - Python的樂高積木
目錄
1. 都是重複一段程式碼,為什麼我要使用函式(而不使用簡單的拷貝黏貼)呢?
0. 編寫一個函式power()模擬內建函式pow(),即power(x, y)為計算並返回x的y次冪的值。
1. 編寫一個函式,利用歐幾里得演算法(腦補連結)求最大公約數,例如gcd(x, y)返回值為引數x和引數y的最大公約數。
2. 編寫一個將十進位制轉換為二進位制的函式,要求採用“除2取餘”(腦補連結)的方式,結果與呼叫bin()一樣返回字串形式。
3. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!
測試題
0. 你有聽說過DRY嗎?
DRY是程式設計師們公認的指導原則:Don't Repeat Yourself.
快快武裝你的思維吧,拿起函式,不要再去重複拷貝一段程式碼了!
1. 都是重複一段程式碼,為什麼我要使用函式(而不使用簡單的拷貝黏貼)呢?
使用函式:
0) 可以降低程式碼量(呼叫函式只需要一行,而拷貝黏貼需要N倍程式碼)
1) 可以降低維護成本(函式只需修改def部分內容,而拷貝黏貼則需要每一處出現的地方都作修改)
2) 使序更容易閱讀(沒有人會希望看到一個程式重複一萬行“I love FishC.com”)
2. 函式可以有多個引數嗎?
可以的,理論上你想要有多少個就可以有多少個,只不過如果函式的引數過多,在呼叫的時候出錯的機率就會大大提高,因而寫這個函式的程式設計師也會被相應的問候祖宗,所以,儘量精簡吧,在Python的世界裡,精簡才是王道!
3. 建立函式使用什麼關鍵字,要注意什麼?
使用“def”關鍵字,要注意函式名後邊要加上小括號“()”,然後小括號後邊是冒號“:”,然後縮排部分均屬於函式體的內容,例如:
def MyFun():
# 我是函式體
# 我也是函式體
# 我們都屬於函式MyFun()
# 噢,我不屬於MyFun()函式的了
4. 請問這個函式有多少個引數?
def MyFun((x, y), (a, b)):
return x * y - a * b
如果你回答兩個,那麼恭喜你錯啦,答案是0,因為類似於這樣的寫法是錯誤的!
我們分析下,函式的引數需要的是變數,而這裡你試圖用“元祖”的形式來傳遞是不可行的。
我想你如果這麼寫,你應該是要表達這麼個意思:
>>> def MyFun(x, y):
return x[0] * x[1] - y[0] * y[1]
>>> MyFun((3, 4), (1, 2))
10
5. 請問呼叫以下這個函式會列印什麼內容?
>>> def hello():
print('Hello World!')
return
print('Welcome To FishC.com!')
會列印:
>>> hello()
Hello World!
因為當Python執行到return語句的時候,Python認為函式到此結束,需要返回了(儘管沒有任何返回值)。
動動手
0. 編寫一個函式power()模擬內建函式pow(),即power(x, y)為計算並返回x的y次冪的值。
def power(x, y):
result = 1
for i in range(y):
result *= x
return result
print(power(2, 3))
>>> def power(x, y):
return(x**y)
1. 編寫一個函式,利用歐幾里得演算法(腦補連結)求最大公約數,例如gcd(x, y)返回值為引數x和引數y的最大公約數。
小甲魚的答案:
def gcd(x, y):
while y:
t = x % y
x = y
y = t
return x
print(gcd(4, 6))
我的答案:
>>> def gcd(x, y):
while y:
x, y = y, x%y
return x
2. 編寫一個將十進位制轉換為二進位制的函式,要求採用“除2取餘”(腦補連結)的方式,結果與呼叫bin()一樣返回字串形式。
小甲魚的答案:
def Dec2Bin(dec):
temp = []
result = ''
while dec:
quo = dec % 2
dec = dec // 2
temp.append(quo)
while temp:
result += str(temp.pop())
return result
print(Dec2Bin(62))
我的答案:
>>> def ten2two(num):
two = ""
while num:
num = num//2
yu = num%2
two= two + str(yu)
return('0b'+two[::-1])
3. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!
(1)函式的引數
函式的引數可以是0個,1個或多個,定義時在括號內用逗號隔開,可以對某些引數進行初始值定義,定義了初始值的引數必須放在括號裡的前面的位置,也就是說,沒有定義初始值的引數要放在定義了初始值的引數的後面。
在程式設計中出現 non-default parameter follows default parameter 這種錯誤原因是將沒有預設值的引數在定義時放在了有預設值的引數的後面,如下所示:
def test(self,a=1,b):
self.a=a
self.b=b
>>SyntaxError: non-default argument follows default argument
調換以上定義引數的順序即可解決此問題:
def test(self,b,a=1):
self.a=a
self.b=b
>>Process finished with exit code 0
(2)函式的返回值
關鍵字:return