python 參數(shù), 解包, 變量

2021-09-15 14:46 更新

練習(xí)13.參數(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)用什么。這樣可以讓你的程序更加精簡(jiǎn),而后面的程序員看到你的代碼的時(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。這也許看上去有些奇怪,不過”解包”可能是最好的描述方式了。它的含義很簡(jiǎn)單:“把 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_inputargv 一起使用,讓你的腳本從用戶手上得到更多的輸入。
  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:argvraw_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: 我不知道怎樣把argvraw_input()結(jié)合起來使用.

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

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

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

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)