鍍金池/ 教程/ Python/ exercise13.參數(shù), 解包, 變量
附錄 A-練習(xí) 9:生成一個(gè)空文件(Touch, New-Item)
附錄 A-練習(xí) 10:復(fù)制文件 (cp)
exercise44.繼承 Vs.包含
附錄 A-練習(xí) 14:刪除文件 (rm)
附錄 A-練習(xí) 11:移動(dòng)文件 (mv)
exercise46.項(xiàng)目骨架
附錄 A-練習(xí) 3:如果你迷路了
exercise37.復(fù)習(xí)符號(hào)
exercise47.自動(dòng)化測試
exercise3.數(shù)字和數(shù)學(xué)計(jì)算
附錄 A-練習(xí) 1:安裝
exercise32.循環(huán)和列表
exercise31.做出決定
exercise42.對(duì)象、類、以及從屬關(guān)系
exercise48.更復(fù)雜的用戶輸入
下一步
簡介
附錄 A-練習(xí) 7:刪除路徑 (rmdir)
exercise49.寫代碼語句
exercise18.命名, 變量, 代碼, 函數(shù)
exercise12.提示別人
exercise14.提示和傳遞
exercise40.模塊, 類和對(duì)象
附錄 A-練習(xí) 12:查看文件 (less, MORE)
exercise9.打印, 打印, 打印
exercise13.參數(shù), 解包, 變量
exercise30. Else 和 If
exercise28. 布爾表達(dá)式
附錄 A-練習(xí) 4:創(chuàng)建一個(gè)路徑 (mkdir)
附錄 A-練習(xí) 15:退出命令行 (exit)
exercise25. 更多更多的練習(xí)
exercise6.字符串和文本
exercise2.注釋和井號(hào)“#”
exercise21. 函數(shù)的返回值
附錄 A-下一步
exercise1.第一個(gè)程序
exercise23. 閱讀代碼
附錄 A-練習(xí) 5:改變當(dāng)前路徑 (cd)
exercise17.更多文件操作
exercise24. 更多的練習(xí)
exercise19.函數(shù)和變量
exercise51.從瀏覽器獲取輸入
exercise22. 到目前為止你學(xué)到了什么?
exercise41.學(xué)會(huì)說面向?qū)ο?/span>
exercise52.開始你的 web 游戲
exercise20. 函數(shù)和文件
exercise15.讀文件
exercise45.你來制作一個(gè)游戲
exercise10.那是什么?
exercise8.打印, 打印
exercise35.分支和函數(shù)
exercise26. 恭喜你,可以進(jìn)行一次考試了
exercise33.while 循環(huán)
exercise29. IF 語句
exercise36.設(shè)計(jì)和調(diào)試
exercise0.安裝和準(zhǔn)備
exercise50.你的第一個(gè)網(wǎng)站
附錄 A-練習(xí) 2:路徑, 文件夾, 名錄 (pwd)
exercise38.列表操作
附錄 A-練習(xí) 6:列出當(dāng)前路徑 (ls)
exercise16.讀寫文件
exercise4.變量和命名
exercise34.訪問列表元素
exercise11.提問
exercise43.基本的面向?qū)ο蟮姆治龊驮O(shè)計(jì)
附錄 A-簡介
附錄 A-練習(xí) 8:目錄切換(pushd, popd)
來自老程序員的建議
exercise27. 記住邏輯
exercise5.更多的變量和打印
exercise7.更多的打印(輸出)
附錄 A-練習(xí) 13:輸出文件 (cat)
exercise39.字典,可愛的字典

exercise13.參數(shù), 解包, 變量

在這節(jié)練習(xí)中,我們將學(xué)到另外一種將變量傳遞給腳本的方法(腳本就是你寫的 .py 程序)。你已經(jīng)知道,如果要運(yùn)行 ex13.py,只要在命令行運(yùn)行 python ex13.py 就可以了。這句命令中的 ex13.py 部分就是所謂的“參數(shù)(argument)”,我們現(xiàn)在要做的就是寫一個(gè)可以接收參數(shù)的腳本。

將下面的程序?qū)懴聛?,后面你?huì)看到詳細(xì)的解釋:

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

第一行代碼中,我們用到一個(gè) import 語句,這是將 Python 的功能模塊加入你自己腳本的方法。Python 不會(huì)一下子將它所有的功能提供給你,而是讓你需要什么就調(diào)用什么。這樣可以讓你的程序更加精簡,而后面的程序員看到你的代碼的時(shí)候,這些“import”語句可以作為提示,讓他們明白你的代碼用到了哪些功能。

argv 就是所謂的“參數(shù)變量(argument variable)”,它是一個(gè)非常標(biāo)準(zhǔn)的編程術(shù)語。在其他的編程語言里你也可以看到它。這個(gè)變量包含了你傳遞給 Python 的參數(shù)。通過后面的練習(xí)你將對(duì)它有更多的了解。

代碼的第 3 行將 argv 進(jìn)行“解包(unpack)”,與其將所有參數(shù)放到同一個(gè)變量下面,我們將每個(gè)參數(shù)賦予一個(gè)變量名: script, first, second, 以及 third。這也許看上去有些奇怪,不過”解包”可能是最好的描述方式了。它的含義很簡單:“把 argv 中的東西解包,將所有的參數(shù)依次賦予左邊的變量名”。

接下來,就是正常的打印輸出了。

等一下! 功能還有另外一個(gè)名字

前面我們使用 import 讓你的程序?qū)崿F(xiàn)更多的功能,把 import 稱為“功能”。我希望你可以在沒接觸到正式術(shù)語的時(shí)候就弄懂它的功能。在繼續(xù)下去之前, 你需要知道它們的真正名稱:模塊(modules)。

從現(xiàn)在開始我們將把這些我們導(dǎo)入(import)進(jìn)來的功能稱作模塊。你將看到類似這樣的說法:“你需要把 sys 模塊 import 進(jìn)來?!币灿腥藢⑺鼈兎Q作“庫(libraries)”,不過我們還是叫它們模塊吧。

你看到的結(jié)果

像下面的示例一樣將你的腳本運(yùn)行起來(你必須在命令行里傳遞 3 個(gè)參數(shù)):

$ 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

如果你每次輸入的參數(shù)不一樣,那你看到的輸出結(jié)果也會(huì)略有不同:

$ 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 個(gè)參數(shù)

如果你沒有運(yùn)行對(duì),你可能會(huì)看到的錯(cuò)誤信息:

$ 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.給你的腳本三個(gè)以下的參數(shù)。看看會(huì)得到什么錯(cuò)誤信息。試著解釋一下。 2.再寫兩個(gè)腳本,其中一個(gè)接受更少的參數(shù),另一個(gè)接受更多的參數(shù),在參數(shù)解包時(shí)給它們?nèi)∫恍┯幸饬x的變量名。 3.將 raw_input 和 argv 一起使用,讓你的腳本從用戶手上得到更多的輸入。 4.記住“模塊(modules)”為你提供額外功能。多讀幾遍把這個(gè)詞記住,因?yàn)槲覀兒竺孢€會(huì)用到它。

常見問題

Q:當(dāng)我運(yùn)行腳本的時(shí)候,有個(gè)報(bào)錯(cuò): need more than 1 value to unpack.

一定記住,關(guān)注細(xì)節(jié)是學(xué)習(xí)編程的三要素之一。如果你仔細(xì)看了我是如何在命令行運(yùn)行腳本的,你也能把你的腳本正確的運(yùn)行起來。

Q:argv 和 raw_input()有什么區(qū)別?

它們的不同之處在于要求用戶輸入的位置不同。如果你想讓用戶在命令行輸入你的參數(shù),你應(yīng)該使用 argv.,如果你希望用戶在腳本執(zhí)行的過程中輸入?yún)?shù),那就就要用到 raw_input()。

Q:命令行輸入的參數(shù)是字符串嗎?

是的,如果你需要輸入數(shù)字,可以使用 int()把他們轉(zhuǎn)化成整數(shù),可以參考 int(raw_input()).

Q:如何使用命令行?

通過這節(jié)練習(xí),你其實(shí)已經(jīng)快速的學(xué)會(huì)如何使用命令行了,如果在此階段你想深入學(xué)習(xí)的話,你可以閱讀這本書的附錄 A--命令行速成教程。

Q: 我不知道怎樣把 argv 和 raw_input()結(jié)合起來使用.

不要想太多. 用 raw_input()修改腳本后面的兩行代碼,然后打印輸出就行。然后試試用更多的方式來同時(shí)使用這兩種方法修改腳本。

Q:為什么我不能這么寫 raw_input('? ') = x?

因?yàn)檫@種寫法正好是將它正常運(yùn)行方法的逆序,按照我的寫法修改,就能正常運(yùn)行了。