2012-08-25 149 views
3

Zed Shaw的「Python學習困難的方式」經常要求你「用英語寫出」腳本的每一行都做了什麼。我正在努力做到這一點,因爲我不知道如何命名代碼的某些部分。哎呀,我甚至不知道要調用argv - 一個函數?一個命令?變量?我知道這是一個模塊。但是回到正軌:Python術語:「= argv」左邊的東西學習Python困難的方式練習13

下面是從exercise 13代碼:

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 

捷思銳指出「‘argv的’是‘參數變量’我的問題是,是什麼的東西的名稱。在第三行的等號的左邊?

通俗地說,我的呼籲是要叫「腳本」,「第一」等變量本身 - 但這看起來不正確,因爲根據Zed argv是「參數變量」。

我不認爲把他們稱爲「論點」是正確的;我只根據命令行參數讀取「參數」。

「參數」似乎很可能,因爲它是在練習的標題中提到的,但是使用「等號」,「=」,「python」,「argv」,「定義」等組合進行網絡搜索並不是很有啓發性。當你不知道他們叫什麼的時候,搜索東西非常困難。

我很清楚在這個腳本中發生了什麼,我只是不清楚它的一部分名稱。當我回答這個問題時,我很確定我會打我的前額。

+0

相關文檔:http://docs.python.org/release/1.5.1p1/tut/tuples.html Python語法特徵「tuple unpacking」適用於列表和元組,並且我通常聽說過這個語法叫做「tuple unpacking」。在上面的例子中,它實際上是列表解包,但是在關於python語法的問題上,我認爲使用元組對標籤進行標記是有幫助的。你可以想象它有一個「從列表到元組的安靜演員」,因爲它被解開,這有助於理解操作。 –

回答

3

"="左邊的東西是變量從右邊的變量得到他們

考慮:

script, first, second, third = argv 

argv是在這種情況下包含4項串的列表。這些字符串「解包」並分配給=左側的四個變量。

argv得到當Python程序從命令行調用,這樣它的值是:

test.py this is sure cool 

在這種情況下argv將包含['test.py', 'this', 'is', 'sure', 'cool']。命令後面的這些字符串被稱爲「命令行參數」(請參閱​​此tutorial)和腳本的名稱,並且任何參數都存儲在argv中。這是在啓動時向腳本發送信息的一種方法。

在這種情況下,變量得到以下值:

script is set to "this.py" # the string is in argv[0] 
    first to "is"  # argv[1] 
    second to "sure" # argv[2] 

third to "cool" # argv[3] 

所以:

script, first, second, third = argv 

是真的等同於:

script = argv[0] 
    first = argv[1] 
    second = argv[2] 
    third = argv[3] 

只有Python可以讓你在一次漂亮的一舉之間完成這項任務。

請注意,您可以使用適當的索引值以任何順序提取命令行參數。

此機制用於將信息傳遞給Python腳本。你可以設想運行一個需要輸入文件和輸出文件的程序。您可以在命令行上提供它們,而不是在腳本中對其進行硬編碼。例如,

computeData.py input.txt result.txt 
+0

>這些字符串「解包」並分配給= 左側的四個變量所以技術術語是值?在閱讀了艱難學習Python的幾章後,我看到Zed將這些變量稱爲「價值」。這聽起來是否正確,或者我會更好地稱他們爲變量,參數或列表值? – ecs

+1

這些是我會用到的術語:''=「'的左邊有4 *個變量*。在右邊你有一個*列表*的字符串。這些字符串分別分配給4個變量的每一個。也就是說,每個變量都從'argv'的一個元素中獲得它的*值*(一個字符串)。這有幫助嗎? – Levon

+1

@ eric.christopher.scott它們當然不是值 - 在這個上下文中的值是'='右邊的*(在這種情況下,由於解包,你可能會說'argv'的內容比'argv'本身)。它們只是變量 - 它只是一個幻想,你可以一次賦予多個變量,以項目的方式。除此之外,它的操作與'script = argv [0]'相同,所以術語應該相同(腳本是一個變量,argv [0]是一個值)。 – lvc

0

要回答你的第一個問題,argvsys模塊的屬性。至於你的第二個問題,Python的文檔沒有爲賦值表達式的右邊指定一個名字,但scriptfirst等可以在這個上下文中被稱爲變量。

1

有時只需在交互式Python提示符中鍵入一些代碼,並查看這些工作是如何工作就會更容易。

雖然sys.argv是一個由Python自己爲您定義的列表,但它與您自己定義的任何列表或元組(可變和不可變類型的Python類型)沒有任何區別。因此,請嘗試自己定義一個並與之一起玩。你已經聲明瞭一個名爲argv = ['123','456','789']變量,它是一個列表類型後,嘗試將其分配給另一名:

anothername = argv 

注意,什麼都不會發生。現在發現,如果你不是試圖給三個不同的變量會發生什麼:

v1,v2,v3 = argv 

第一個(在技術上,「第零」)argv中元素存儲在V1,ARGV的第二個元素存儲在v2和等等。

我相信我會打電話給v1,v2,v3一個「變量列表,這些變量將包含過去是列表argv中的元素,但是我希望在他們自己的地方解包並存儲的元素」。

+0

>「變量列表打算舉行的東西,以前是在列表中的argv的元素,但我希望在自己的地方來解壓縮和存儲」 哈哈!我喜歡它,它有一個戒指。 經過進一步審查學習Python的艱難之路,我開始認爲技術術語(如果有的話)是**值**。 – ecs

+0

+1有時更容易與交互式解釋器一起玩。但是對於挑剔 - 'argv'是一個列表(不是一個數組),'v1,v2,v3'更像是一個元組而不是一個列表(儘管它也不是一個元組,因爲'a =(a1,a2, a3); a = sys.argv'不會解包)。 – lvc

+0

正確。本機類型名稱是列表。我認爲,即使X是一個列表,語法「a,b,c = x」也被稱爲「元組解包」。我可能不夠精確,但在我看來,「元組和列表是允許逐項訪問的子類型」,因此我將它們(不精確)稱爲數組。我希望我編輯過的感覺更清晰。 –

相關問題