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】:
为了回答您的第一个问题,argv
是sys
模块的一个属性。至于你的第二个问题,Python的文档没有为赋值表达式的右侧指定名称,但script
、first
等在这种情况下可以称为变量。
【讨论】:
【参考方案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”左边的东西的主要内容,如果未能解决你的问题,请参考以下文章
在 scikit-learn 中获取每个亲和传播集群的***术语