Python 术语:Learn Python the Hard Way 练习 13 中“= argv”左边的东西

Posted

技术标签:

【中文标题】Python 术语:Learn Python the Hard Way 练习 13 中“= argv”左边的东西【英文标题】:Python terminology: things to left of "= argv" in Learn Python the Hard Way exercise 13 【发布时间】:2012-08-20 13:40:43 【问题描述】:

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

这是来自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

Zed 声明“'argv' 是“参数变量”。我的问题是,第三行等号左侧的事物的名称是什么?

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

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

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

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

【问题讨论】:

相关文档:docs.python.org/release/1.5.1p1/tut/tuples.html Python 语法特性“元组解包”适用于列表和元组,我经常听到称为“元组解包”的语法。在上面的例子中,它实际上是列表解包,但就有关 python 语法的问题而言,我认为用元组解包标记事物是有帮助的。您可以认为在解包时存在“从列表到元组的安静转换”,这有时有助于理解操作。 【参考方案1】:

"=" 左边的东西是变量,它们从右边的变量中获取它们的

给定:

script, first, second, third = argv

argv 是一个 list 字符串,在这种情况下包含 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

【讨论】:

> 这些字符串被“解包”并赋值给=左边的四个变量所以技术术语是值?回顾《Learning Python the Hard way》的几章后,我看到 Zed 将这些变量称为“值”。这听起来对吗,或者我最好将它们称为变量、参数或列表值? 这些是我将使用的术语:在"=" 的左侧,您有 4 个变量。在右侧,您有一个 list 字符串。这些字符串分别分配给 4 个变量中的每一个。即,每个变量都从argv 的元素中获取其(字符串)。这有帮助吗? @eric.christopher.scott 它们当然不是值 - 在这种情况下的值是 =右侧 (在这种情况下,因为解包,您可能会说这是argv 的内容,而不是argv 本身)。它们只是变量——它只是有点花哨,你可以一次分配给多个变量,逐项。除此之外,它与script = argv[0]的操作相同,所以术语应该是相同的(脚本是一个变量,argv[0]是一个值)。 @lvc 谢谢,这完全简洁地回答了我的问题。 Levon,你加深了我的理解。 @Ivc 很好的说我必须同意 OP【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

  anothername = argv

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

  v1,v2,v3 = argv

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

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

【讨论】:

> "变量列表,这些变量将保存以前是列表 argv 中的元素,但我希望将其解包并存储在自己的位置" 哈哈!我喜欢它,它有一个戒指。在进一步回顾 Learning Python the Hard Way 之后,我开始认为技术术语(如果有的话)是 value +1 有时更容易使用交互式解释器。但要挑剔 - argv 是一个列表(不是数组),v1, v2, v3 更像是一个元组而不是一个列表(尽管它也不是一个真正的元组,因为 a = (a1, a2, a3); a = sys.argv 不做拆包)。跨度> 正确。本机类型名称是列表。而且我认为即使 X 是一个列表,语法“a,b,c = x”也被称为“元组解包”。我可能不够精确,但在我看来“元组和列表是允许逐项访问的子类型”,因此我将它们都(不准确地)称为数组。我希望我已经进行了编辑以使意义更清晰。

以上是关于Python 术语:Learn Python the Hard Way 练习 13 中“= argv”左边的东西的主要内容,如果未能解决你的问题,请参考以下文章

吴裕雄 python深度学习与实践

在 scikit-learn 中获取每个亲和传播集群的***术语

如何在 scikit-learn 中的 tfidf 之后查看术语文档矩阵的前 n 个条目

使用 python 的朴素贝叶斯分类器

Learn Python 007: Lists

Learn Python 005: Random