3

Zed Shaw 的“Learn Python the Hard Way”经常要求您“用英语写出”脚本的每一行的作用。我正在努力使用与函数(命令?)argv相关的一些东西来做到这一点,因为我不知道如何命名代码的某些部分。哎呀,我什至不知道如何调用 argv——一个函数?命令?多变的?我知道这是一个模块。但回到正轨:

这是练习 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

Zed 声明“‘argv’是‘参数变量’。我的问题是,第三行等号左边的东西的名称是什么?

通俗地说,我的冲动是自己称“脚本”、“第一”等词为变量——但这似乎不对,因为根据 Zed argv 是“参数变量”。

我也不认为称它们为“论点”是正确的。我只在命令行参数方面阅读了“参数”。

“参数”似乎很可能,因为它在练习的标题中被提及,但是使用“等号”、“=”、“python”、“argv”、“定义”等的组合进行网络搜索却不是很有启发性。当你不知道它们叫什么时,搜索东西是非常困难的。

我很清楚这个脚本中发生了什么,只是不清楚其中一部分的名称。我很确定,当我回答这个问题时,我会拍拍我的额头。

4

3 回答 3

3

左边的东西是从右边的"="变量获取的变量。

鉴于:

script, first, second, third = argv

argv是一个字符串列表,在这种情况下包含 4 个项目。这些字符串被“解包”并分配给=.

argv获取它的值是从命令行调用 Python 程序时,如下所示:

test.py this is sure cool

在这种情况下argv将包含 ['test.py', 'this', 'is', 'sure', 'cool']. 命令后的这些字符串称为“命令行参数”(参见本教程)和脚本的名称,任何参数都存储在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
于 2012-08-25T02:53:35.510 回答
1

有时在交互式 python 提示符中输入一些代码会更容易,看看这些东西是如何工作的。

虽然 sys.argv 是一个由 Python 本身为您定义的列表,但它与您自己定义的任何列表或元组(Python 的可变和非可变数组类类型)没有什么不同。因此,尝试自己定义一个并使用它。在您声明了一个名为argv = ['123','456','789']列表类型的变量后,请尝试将其分配给另一个名称:

  anothername = argv

请注意,没有什么特别的事情发生。现在请注意,如果您尝试分配三个不同的变量会发生什么:

  v1,v2,v3 = argv

argv 中的第一个(技术上是“zeroeth”)元素存储在 v1 中,argv 的第二个元素存储在 v2 中,依此类推。

我相信我会将 v1,v2,v3 称为“变量列表,这些变量将包含曾经是列表 argv 中的元素的内容,但我希望将其解包并存储在自己的位置”。

于 2012-08-25T02:57:19.903 回答
0

回答你的第一个问题,是模块argv的一个属性sys。至于您的第二个问题,Python 的文档没有为赋值表达式的右侧指定名称,但是script,first等在这种情况下可以称为变量。

于 2012-08-25T02:56:57.033 回答