# 練習18.命名, 變量, 代碼, 函數
標題包含的內容夠多的吧?接下來我要教你“函數(function)”了!說到函數,不一樣的人會對它有不一樣的理解和使用方法,不過我只會教你現在能用到的最簡單的使用方式。
函數可以做三樣事情:
> 1. 它們給代碼片段命名,就跟“變量”給字符串和數字命名一樣。
> 1. 它們可以接受參數,就跟你的腳本接受`argv`一樣。
> 1. 通過使用 #1 和 #2,它們可以讓你創建“微型腳本”或者“小命令”。
python中你可以使用`def`新建函數。我將讓你創建四個不同的函數,它們工作起來和你的腳本一樣。然后我會演示給你各個函數之間的關系。
~~~
# 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()
~~~
讓我們把地一個函數`print_two`分解一下,這個函數和你寫腳本的方式差不多,因此你看上去應該會覺著比較眼熟:
> 1.首先我們告訴Python創建一個函數,我們使用到的命令是`def`,也就是“定義(define)”的意思。
> 1. 緊接著def的是函數的名稱。本例中它的名稱是`print_two`,但名字可以隨便取,就叫`peanuts`也沒關系。但函數名最好能夠體現出函數的功能來。
> 1. 然后我們告訴函數我們需要`*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)’是同一個意思
~~~
## 常見問題
### Q:什么字符允許用在函數名上?
> 和變量命名規則相同。不能以數字開頭,并且只能包含字母數字和下劃線。
### Q:`*args` 中的星號`*`是干嘛的?
> 它告訴python把函數的所有參數組織一個列表放在`args`里。類似你之前用過的`argv`,只不過`*args`是用在函數里的,
### Q: 這個練習讓我覺得枯燥
> 這是好事,說明你在輸入代碼方面做的越來越好,而且也能很好的明白這些代碼是做什么的,想讓練習不那么枯燥,輸入我讓你練習的代碼,然后故意出錯,檢查你的錯誤并修復它們。
- 序言
- 前言
- 簡介
- 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)
- 下一步