# 練習21. 函數的返回值
你已經學過使用`=`給變量命名,將變量定義為某個數字或者字符串。接下來我們將讓你見證更多奇跡。我們要給你演示如何使用`=`以及一個新的Python關鍵字`return`來將變量設置為“一個函數的值”。有一點你需要極其注意,不過我們先來編寫下面的腳本吧:
~~~
def add(a, b):
print "ADDING %d + %d" % (a, b)
return a + b
def subtract(a, b):
print "SUBTRACTING %d - %d" % (a, b)
return a - b
def multiply(a, b):
print "MULTIPLYING %d * %d" % (a, b)
return a * b
def divide(a, b):
print "DIVIDING %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 a puzzle."
what = add(age, subtract(height, multiply(weight, divide(iq, 2))))
print "That becomes: ", what, "Can you do it by hand?"
~~~
現在我們創建了自己的加減乘除數學函數: `add`, `subtract`, `multiply`, 以及 `divide`。重要的是函數的最后一行,例如 `add` 的最后一行是 `return a + b`,它實現的功能是這樣的:
> 1. 我們調用函數時使用了兩個參數: a 和 b 。
> 1. 我們打印出這個函數的功能,這里就是計算加法(adding)
> 1. 接下來我們告訴 Python 讓它做某個回傳的動作:我們將 `a + b` 的值返回(return)。或者你可以這么說:“我將 a 和 b 加起來,再把結果返回。”
> 1. Python 將兩個數字相加,然后當函數結束的時候,它就可以將 `a + b` 的結果賦予一個變量。
和本書里的很多其他東西一樣,你要慢慢消化這些內容,一步一步執行下去,追蹤一下究竟發生了什么。為了幫助你理解,本節的附加題將讓你解決一個迷題,并且讓你學到點比較酷的東西。
## 你看到的結果
~~~
$ python ex21.py
Let's do some math with just functions!
ADDING 30 + 5
SUBTRACTING 78 - 4
MULTIPLYING 90 * 2
DIVIDING 100 / 2
Age: 35, Height: 74, Weight: 180, IQ: 50
Here is a puzzle.
DIVIDING 50 / 2
MULTIPLYING 180 * 25
SUBTRACTING 74 - 4500
ADDING 35 + -4426
That becomes: -4391 Can you do it by hand?
~~~
## 附加題
> 1. 如果你不是很確定`return`的功能,嘗試自己寫幾個函數出來,讓它們返回一些值。你可以將任何可以放在`=`右邊的東西作為一個函數的返回值。
> 1. 這個腳本的結尾是一個迷題。我將一個函數的返回值用作了另外一個函數的參數。我將它們連接一起,就像寫數學等式一樣。這樣可能有些難懂,不過運行一下你就知道結果了。你可以試試看能不能用正常的方法實現和這個表達式一樣的功能。
> 1. 一旦你解決了這個迷題,試著修改一下函數里的某些部分,然后看會有什么樣的結果。你可以有目的地修改它,讓它輸出另外一個值。
> 1. 顛倒過來再做一次。寫一個簡單的等式,使用相同的函數來計算它。
這節習題可能會讓你有些頭大,不過慢慢來,把它當做一個小游戲,解決這樣的迷題也是編程的樂趣之一。后面你還會看到類似的小謎題。
## 常見問題
### Q:為什么Python打印公式或函數是反向的?
> 它們并不是真正的反向的, it's "inside out." When you start breaking down the function into separate formulas and function calls you'll see how it works. Try to understand what I mean by "inside out" rather than "backward."
### Q: 怎樣使用`raw_input()` 輸入我自己的值?
> 還記得 `int(raw_input())`嗎? 這樣做有一個問題就是你不能輸入浮點數,不過你可以使用 `float(raw_input())`來輸入。
### Q: 你說的 "寫一個公式"是什么意思?
> 試試先寫`24 + 34 / 100 - 1023`,再用我們的函數轉化一下。現在給你的數學公式加入變量,這樣它就變成了一個公式。
- 序言
- 前言
- 簡介
- 0:安裝和準備
- 1:第一個程序
- 2:注釋和“#”井號
- 3:數字和數學計算
- 4:變量和命名
- 5:更多的變量和打印
- 6:字符串和文本
- 7:更多的打印(輸出)
- 8:打印, 打印
- 9:打印, 打印, 打印
- 10:那是什么?
- 11:提問
- 12:提示別人
- 13:參數, 解包, 變量
- 14:提示和傳遞
- 15:讀文件
- 16:讀寫文件
- 17:更多文件操作
- 18:命名, 變量, 代碼, 函數
- 19:函數和變量
- 20:函數和文件
- 21:函數的返回值
- 22:到目前為止你學到了什么?
- 23:閱讀代碼
- 24:更多的練習
- 25:更多更多的練習
- 26:恭喜你,可以進行一次考試了
- 27:記住邏輯
- 28:布爾表達式
- 29:IF 語句
- 30:Else 和 If
- 31:做出決定
- 32:循環和列表
- 33:while循環
- 34:訪問列表元素
- 35:分支和函數
- 36:設計和調試
- 37:復習符號
- 38:列表操作
- 39:字典,可愛的字典
- 40:模塊, 類和對象
- 41:學會說面向對象
- 42:對象、類、以及從屬關系
- 43:基本的面向對象的分析和設計
- 44:繼承Vs.包含
- 45:你來制作一個游戲
- 46:項目骨架
- 47:自動化測試
- 48:更復雜的用戶輸入
- 49:寫代碼語句
- 50:你的第一個網站
- 51:從瀏覽器獲取輸入
- 52:開始你的web游戲
- 來自老程序員的建議
- 下一步
- 附錄A:命令行教程
- 簡介
- 安裝和準備
- 路徑, 文件夾, 名錄 (pwd)
- 如果你迷路了
- 創建一個路徑 (mkdir)
- 改變當前路徑 (cd)
- 列出當前路徑 (ls)
- 刪除路徑 (rmdir)
- 目錄切換(pushd, popd)
- 生成一個空文件(Touch, New-Item)
- 復制文件 (cp)
- 移動文件 (mv)
- 查看文件 (less, MORE)
- 輸出文件 (cat)
- 刪除文件 (rm)
- 退出命令行 (exit)
- 下一步