2012-08-25 148 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”也被称为“元组解包”。我可能不够精确,但在我看来,“元组和列表是允许逐项访问的子类型”,因此我将它们(不精确)称为数组。我希望我编辑过的感觉更清晰。 –

相关问题