# 習題 18: 命名、變量、代碼、函數
標題包含的內容夠多的吧?接下來我要教你“函數(function)”了!咚咚鏘!說到函數,不一樣的人會對它有不一樣的理解和使用方法,不過我只會教你現在能用到的最簡單的使用方式。
函數可以做三樣事情:
1. 它們給代碼片段命名,就跟“變量”給字符串和數字命名一樣。
1. 它們可以接受參數,就跟你的腳本接受 argv 一樣。
1. 通過使用 #1 和 #2,它們可以讓你創建“微型腳本”或者“小命令”。
你可以使用 def 新建函數。我將讓你創建四個不同的函數,它們工作起來和你的腳本一樣。然后我會演示給你各個函數之間的關系。
<table class="highlighttable"><tbody><tr><td class="linenos"> <div class="linenodiv"> <pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22</pre> </div> </td> <td class="code"> <div class="highlight"> <pre># this one is like your scripts with argv
def print_two(*args):
arg1, arg2 = args
print "arg1: %r, arg2: %r" % (arg1, arg2)
# ok, that *args is actually pointless, we can just do this
def print_two_again(arg1, arg2):
print "arg1: %r, arg2: %r" % (arg1, arg2)
# this just takes one argument
def print_one(arg1):
print "arg1: %r" % arg1
# this one takes no arguments
def print_none():
print "I got nothin'."
print_two("Zed","Shaw")
print_two_again("Zed","Shaw")
print_one("First!")
print_none()
</pre> </div> </td> </tr></tbody></table>
讓我們把你一個函數 print_two 肢解一下,這個函數和你寫腳本的方式差不多,因此你看上去應該會覺著比較眼熟:
1. 首先我們告訴 Python 創建一個函數,我們使用到的命令是 def ,也就是“定義(define)”的意思。
1. 緊接著 def 的是函數的名稱。本例中它的名稱是 “print_two”,但名字可以隨便取,就叫 “peanuts” 也沒關系。但最好函數的名稱能夠體現出函數的功能來。
1. 然后我們告訴函數我們需要 *args (asterisk args),這和腳本的 argv 非常相似,參數必須放在圓括號 () 中才能正常工作。
1. 接著我們用冒號 : 結束本行,然后開始下一行縮進。
1. 冒號以下,使用 4 個空格縮進的行都是屬于 print_two 這個函數的內容。 其中第一行的作用是將參數解包,這和腳本參數解包的原理差不多。
1. 為了演示它的工作原理,我們把解包后的每個參數都打印出來,這和我們在之前腳本練習中所作的類似。
函數 print_two 的問題是:它并不是創建函數最簡單的方法。在 Python 函數中我們可以跳過整個參數解包的過程,直接使用 () 里邊的名稱作為變量名。這就是 print_two_again 實現的功能。
接下來的例子是 print_one ,它向你演示了函數如何接受單個參數。
最后一個例子是 print_none ,它向你演示了函數可以不接收任何參數。
Warning
如果你不太能看懂上面的內容也別氣餒。后面我們還有更多的練習向你展示如何創建和使用函數。現在你只要把函數理解成“迷你腳本”就可以了。
### 你應該看到的結果
運行上面的腳本會看到如下結果:
~~~
$ python ex18.py
arg1: 'Zed', arg2: 'Shaw'
arg1: 'Zed', arg2: 'Shaw'
arg1: 'First!'
I got nothin'.
$
~~~
你應該已經看出函數是怎樣工作的了。注意到函數的用法和你以前見過的 exists、 open,以及別的“命令”有點類似了吧?其實我只是為了讓你容易理解才叫它們“命令”, 它們的本質其實就是函數。也就是說,你也可以在自己的腳本中創建你自己的“命令”。
### 加分習題
為自己寫一個函數注意事項以供后續參考。你可以寫在一個索引卡片上隨時閱讀,直到你記住所有的要點為止。注意事項如下:
1. 函數定義是以 def 開始的嗎?
1. 函數名稱是以字符和下劃線 _ 組成的嗎?
1. 函數名稱是不是緊跟著括號 ( ?
1. 括號里是否包含參數?多個參數是否以逗號隔開?
1. 參數名稱是否有重復?(不能使用重復的參數名)
1. 緊跟著參數的是不是括號和冒號 ): ?
1. 緊跟著函數定義的代碼是否使用了 4 個空格的縮進 (indent)?
1. 函數結束的位置是否取消了縮進 (“dedent”)?
當你運行(或者說“使用 use”或者“調用 call”)一個函數時,記得檢查下面的要點:
1. 調運函數時是否使用了函數的名稱?
1. 函數名稱是否緊跟著 ( ?
1. 括號后有無參數?多個參數是否以逗號隔開?
1. 函數是否以 ) 結尾?
按照這兩份檢查表里的內容檢查你的練習,直到你不需要檢查表為止。
最后,將下面這句話閱讀幾遍:
“‘運行函數(run)’、‘調用函數(call)’、和 ‘使用函數(use)’是同一個意思”
- 譯者前言
- 前言:笨辦法更簡單
- 習題 0: 準備工作
- 習題 1: 第一個程序
- 習題 2: 注釋和井號
- 習題 3: 數字和數學計算
- 習題 4: 變量(variable)和命名
- 習題 5: 更多的變量和打印
- 習題 6: 字符串(string)和文本
- 習題 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: 來自 Percal 25 號行星的哥頓人(Gothons)
- 習題 42: 物以類聚
- 習題 43: 你來制作一個游戲
- 習題 44: 給你的游戲打分
- 習題 45: 對象、類、以及從屬關系
- 習題 46: 一個項目骨架
- 習題 47: 自動化測試
- 習題 48: 更復雜的用戶輸入
- 習題 49: 創建句子
- 習題 50: 你的第一個網站
- 習題 51: 從瀏覽器中獲取輸入
- 習題 52: 創建你的 web 游戲
- 下一步
- 老程序員的建議