# 練習13.參數, 解包, 變量
在這節練習中,我們將學到另外一種將變量傳遞給腳本的方法(腳本就是你寫的 `.py` 程序)。你已經知道,如果要運行 `ex13.py`,只要在命令行運行 `python ex13.py` 就可以了。這句命令中的 `ex13.py` 部分就是所謂的“參數(argument)”,我們現在要做的就是寫一個可以接收參數的腳本。
將下面的程序寫下來,后面你會看到詳細的解釋:
~~~
from sys import argv
script, first, second, third = argv
print "The script is called:", script
print "Your first variable is:", first
print "Your second variable is:", second
print "Your third variable is:", third
~~~
第一行代碼中,我們用到一個`import`語句,這是將Python的功能模塊加入你自己腳本的方法。Python 不會一下子將它所有的功能提供給你,而是讓你需要什么就調用什么。這樣可以讓你的程序更加精簡,而后面的程序員看到你的代碼的時候,這些“import”語句可以作為提示,讓他們明白你的代碼用到了哪些功能。
`argv`就是所謂的“參數變量(argument variable)”,它是一個非常標準的編程術語。在其他的編程語言里你也可以看到它。這個變量包含了你傳遞給 Python 的參數。通過后面的練習你將對它有更多的了解。
代碼的第3行將 `argv`進行“解包(unpack)”,與其將所有參數放到同一個變量下面,我們將每個參數賦予一個變量名: script, first, second, 以及 third。這也許看上去有些奇怪,不過”解包”可能是最好的描述方式了。它的含義很簡單:“把 argv 中的東西解包,將所有的參數依次賦予左邊的變量名”。
接下來,就是正常的打印輸出了。
## 等一下! 功能還有另外一個名字
前面我們使用`import`讓你的程序實現更多的功能,把`import`稱為“功能”。我希望你可以在沒接觸到正式術語的時候就弄懂它的功能。在繼續下去之前, 你需要知道它們的真正名稱:模塊(modules)。
從現在開始我們將把這些我們導入(import)進來的功能稱作模塊。你將看到類似這樣的說法:“你需要把sys模塊import進來。”也有人將它們稱作“庫(libraries)”,不過我們還是叫它們模塊吧。
## 你看到的結果
像下面的示例一樣將你的腳本運行起來(你必須在命令行里傳遞3個參數):
~~~
$ python ex13.py first 2nd 3rd
The script is called: ex13.py
Your first variable is: first
Your second variable is: 2nd
Your third variable is: 3rd
~~~
如果你每次輸入的參數不一樣,那你看到的輸出結果也會略有不同:
~~~
$ python ex13.py stuff things that
The script is called: ex13.py
Your first variable is: stuff
Your second variable is: things
Your third variable is: that
$
$ python ex13.py apple orange grapefruit
The script is called: ex13.py
Your first variable is: apple
Your second variable is: orange
Your third variable is: grapefruit
~~~
你可以將`first`, `2nd`, 和 `3rd` 替換成任意你喜歡的3個參數
如果你沒有運行對,你可能會看到的錯誤信息:
~~~
$ python ex13.py first 2nd
Traceback (most recent call last):
File "ex13.py", line 3, in <module>
script, first, second, third = argv
ValueError: need more than 3 values to unpack
~~~
## 附加題
> 1. 給你的腳本三個以下的參數。看看會得到什么錯誤信息。試著解釋一下。
> 1. 再寫兩個腳本,其中一個接受更少的參數,另一個接受更多的參數,在參數解包時給它們取一些有意義的變量名。
> 1. 將 `raw_input` 和 `argv` 一起使用,讓你的腳本從用戶手上得到更多的輸入。
> 1. 記住“模塊(modules)”為你提供額外功能。多讀幾遍把這個詞記住,因為我們后面還會用到它。
## 常見問題
### Q:當我運行腳本的時候,有個報錯: `need more than 1 value to unpack`.
> 一定記住,關注細節是學習編程的三要素之一。如果你仔細看了我是如何在命令行運行腳本的,你也能把你的腳本正確的運行起來。
### Q:`argv` 和 `raw_input()`有什么區別?
> 它們的不同之處在于要求用戶輸入的位置不同。如果你想讓用戶在命令行輸入你的參數,你應該使用`argv`.,如果你希望用戶在腳本執行的過程中輸入參數,那就就要用到`raw_input()`。
### Q:命令行輸入的參數是字符串嗎?
> 是的,如果你需要輸入數字,可以使用`int()`把他們轉化成整數,可以參考 `int(raw_input())`.
### Q:如何使用命令行?
> 通過這節練習,你其實已經快速的學會如何使用命令行了,如果在此階段你想深入學習的話,你可以閱讀這本書的附錄A--命令行速成教程。
### Q: 我不知道怎樣把`argv` 和 `raw_input()`結合起來使用.
> 不要想太多. 用`raw_input()`修改腳本后面的兩行代碼,然后打印輸出就行。然后試試用更多的方式來同時使用這兩種方法修改腳本。
### Q:為什么我不能這么寫`raw_input('? ') = x`?
> 因為這種寫法正好是將它正常運行方法的逆序,按照我的寫法修改,就能正常運行了。
- 序言
- 前言
- 簡介
- 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)
- 下一步