題目
前面的函數練習中,我們給函數撰寫了 print()
語句使函數可以把運行後的結果打印出來。不過我們並不總是需要把結果打印出來,在實際編寫程序的時候我們更多的是需要使用函數的結果做其他事情(而不是打印出來)。
這就是本題的一個重點 return
的使用。先看個小栗子,並且簡單說明一下:
def my_add(a, b):
"""
其實這裏可以用 三引號 寫函數的說明文檔的。但是也要遵循縮進規則
就像我們用 help 或者 pydoc 擦看的內容一樣。
這個函數實現了兩個數字相加的功能
"""
return a + b
# 接下來調用看看
my_add(2, 3)
# 打印函數看看
print(my_add(2, 3))
刪掉三行註釋之後這個函數只有兩行內容,第一行我們比較熟悉了:定義了一個擁有兩個參數函數 my_add
。我們來看第二行代碼:
- 我們調用了函數的兩個參數:
a
和b
。 - 然後我們讓兩個函數執行了加法運算
a + b
。 - 最後 python 會執行返回
return
,把a + b
的結果返回出來
python 在執行這個函數的時候會把合法的兩個參數做相加,並把結果返回。這裏有個問題,返回到哪了?看一下兩次調用的結果。
可以看到,我們明明調用了 my_add
兩次,應該有兩次 return
,但是屏幕上卻只有一個結果被打印了。事實上 return
的結果是在內存中的,如果沒人使用這個返回的結果,則這個結果將被 python 的垃圾回收機制清除掉來騰出可用內存。所以通常情況下,我們會爲結果賦值,用一個變量表示結果並等待被使用;或者如本例直接使一個函數被另一個當作參數來用。
加分練習
- 如果不是很確定
return
的功能,試着自己寫幾個函數,讓他們返回一些值,你可以將任何可以放在=
右邊的東西作爲一個函數的返回值。 - 這個腳本的結尾是一個迷題。我將一個函數的返回值用作了另外一個函數的參數。我將它們鏈接到了一起,就跟寫數學等式一樣。這樣可能有些難讀,不過運行一下你就知道結果了。接下來,你需要試試看能不能用正常的方法實現和這個表達式一樣的功能。
- 一旦你解決了這個迷題,試着修改一下函數裏的某些部分,然後看會有什麼樣的結果。你可以有目的地修改它,讓它輸出另外一個值。
- 最後,顛倒過來做一次。寫一個簡單的等式,使用一樣的函數來計算它。
我的答案
21.0 基礎練習
def add(a, b):
print("ADDING %d + %d" % (a, b))
return a + b
def subtract(a, b):
print("SUBTRACT %d - %d" % (a, b))
return a - b
def multiply(a, b):
print("MULTIPLY %d * %d" % (a, b))
return a * b
def divide(a, b):
print("DIVIDE %d / %d" % (a, b))
return a / b
print("Let's do some math with just functions!")
age = add(30, 5)
height = subtract(78, 4)
weight = multiply(90, 2)
iq = divide(100, 2)
print("Age: %d, Height: %d, Weight: %d, IQ: %d" % (age, height, weight, iq))
# A puzzle for the extra credit, type it in anyway.
print("Here is puzzle.")
what = add(age, subtract(height, multiply(weight, divide(iq, 2))))
print("That becomes: ", what, "Can you do it by hand?")
21.2 結尾的謎題
這個謎題其實只是一個多層嵌套引用函數的語句,由一個函數的結果作爲另一個函數的參數,而這個函數的結果又是其他函數的參考。看起來比較亂,但拆開步驟的話和前面的麼什麼區別。
通過前面第一輪的函數調用後我們首先獲得了四個數字變量:
age = add(30, 5)
height = subtract(78, 4)
weight = multiply(90, 2)
iq = divide(100, 2)
# 調用後它們的值變爲:
age = 35
height = 74
weight = 180
iq = 50.0
# iq是除法得到的,在 Py3 中實際值是浮點數,但是打印的時候由於格式化變爲了整數
再來看一下謎題部分
what = add(age, subtract(height, multiply(weight, divide(iq, 2))))
# 變量 what 可以由內到外把嵌套的結構逐步拆分爲
x1 = divide(iq, 2)
x2 = multiply(weight, x1)
x3 = subtract(height, x2)
x4 = add(age, x3)
what = x4
# 然後把前邊變量的數值代入進去可得到
x1 = divide(50.0, 2)
x2 = multiply(180, x1)
x3 = subtract(74, x2)
x4 = add(35, x3)
怎麼樣,這樣看這個謎題也沒什麼吧?
在打印出 That becomes: -4391.0 Can you do it by hand?
之前有四行信息,麼有人麼想明白的?結合上面 x1-x4 的推導過程以及函數的內容看看呢?