【问题标题】:Python sys.argv lists and indexesPython sys.argv 列表和索引
【发布时间】:2018-02-18 07:58:59
【问题描述】:

在下面的代码中,我知道 sys.argv 使用列表,但是我不清楚这里如何使用索引。

def main():

  if len(sys.argv) >= 2:
    name = sys.argv[1]
  else:
    name = 'World'
  print 'Hello', name

if __name__ == '__main__':
  main()

如果我改变了

name = sys.argv[1]

name = sys.argv[0] 

并为它返回的参数输入一些内容:

Hello C:\Documents and Settings\fred\My Documents\Downloads\google-python-exercises
\google-python-exercises\hello.py

哪种有意义。

谁能解释一下 2 在这里是如何使用的:

if len(sys.argv) >= 2:

这里如何使用 1:

name = sys.argv[1] 

【问题讨论】:

    标签: python


    【解决方案1】:

    让我们在你的命令行上说:

    C:\> C:\Documents and Settings\fred\My Documents\Downloads\google-python-exercises
    \google-python-exercises\hello.py John
    

    为了便于阅读,我们将其缩短为:

    C:\> hello.py John
    

    argv 表示通过命令行输入出现的所有项目,但计数从零 (0) 而不是一 (1) 开始:在这种情况下,“hello.py”是元素 0,“@987654325 @" 是元素 1

    换句话说,sys.argv[0] == 'hello.py'sys.argv[1] == 'John' ...但是看看,这是多少个元素? 2、对!所以即使数字是 0 和 1,这里也有 2 个元素。

    len(sys.argv) >= 2 只是检查您是否输入了至少两个元素。在这种情况下,我们正好输入了 2。

    现在让我们将您的代码翻译成英文:

    define main() function:
        if there are at least 2 elements on the cmd-line:
            set 'name' to the second element located at index 1, e.g., John
        otherwise there is only 1 element... the program name, e.g., hello.py:
            set 'name' to "World" (since we did not get any useful user input)
        display 'Hello' followed by whatever i assigned to 'name'
    

    那么这是什么意思?这意味着如果你输入:

    • hello.py”,代码输出“Hello World”因为你没有给出名字
    • hello.py John”,代码输出“Hello John”,因为你这样做了
    • hello.py John Paul”,代码仍然输出“Hello John”,因为它不保存也不使用sys.argv[2],即“Paul”——在这种情况下你能看到len(sys.argv) == 3,因为有sys.argv 列表中有 3 个元素吗?

    【讨论】:

    • yvw!我看到其他人已经很好地回答了它,如果有这样的事情,我想要更专注于代码的纯“英文翻译”的替代方案。干杯!
    • 如果您需要知道位置和值,您也可以开始循环for i in range(1, len(sys.argv)-1):,然后使用sys.argv[i] 获取您的值。
    • 虽然您可以这样做,但“len()-1”的使用是非典型的 Python,尽管它是其他语言的常见模式;如果同时需要索引和值,则使用 enumerate() 更为惯用 Python。此评论也没有解决 OP 问题,该问题询问索引如何工作 - 他们确实没有询问人们将如何查询特定值或其位置。
    【解决方案2】:

    sys.argv 是传递给 Python 程序的参数列表。第一个参数sys.argv[0] 实际上是程序被调用时的名称。这不是 Python 的事情,而是大多数操作系统的工作方式。 sys.argv[0] 存在的原因是您可以根据调用方式更改程序的行为。 sys.argv[1] 因此是您实际传递给程序的第一个参数。

    因为 Python 中的列表(与大多数序列一样)从 0 开始索引,并且超出列表末尾的索引是错误的,因此您需要检查列表的长度是否为 2 或更长,然后才能访问sys.argv[1]

    【讨论】:

      【解决方案3】:

      简而言之,sys.argv 是出现在用于运行程序的命令中的单词列表。第一个词(列表的第一个元素)是程序的名称,列表的其余元素是提供的任何参数。在大多数计算机语言(包括 Python)中,列表从零开始索引,这意味着列表中的第一个元素(在本例中为程序名称)是 sys.argv[0],第二个元素(第一个参数,如果有的话)是sys.argv[1]

      测试len(sys.argv) >= 2 只是检查列表的长度是否大于或等于 2,如果有至少一个参数提供给程序,就会出现这种情况。

      【讨论】:

      • 您似乎多次使用array 来表示list。它们是不同的东西。 sys.argv 是一个列表,正如您在第一句话中提到的那样。
      • 谢谢,知道第一个元素是程序的名称,这有助于理解这一点!
      • @Thomas:好点子,我会解决这个问题...我倾向于互换使用这些术语,因为 Python 的列表通常与 C 的数组提供相同的功能(在这种情况下,区别不是特别重要)。
      【解决方案4】:

      因此,如果我想返回一个名字和姓氏,例如:Hello Fred Gerbig,我将使用下面的代码,该代码有效,但它实际上是最正确的方法吗?

      import sys
      def main():
        if len(sys.argv) >= 2:
          fname = sys.argv[1]
          lname = sys.argv[2]
        else:
          name = 'World'
        print 'Hello', fname, lname
      if __name__ == '__main__':
        main()
      

      编辑:发现上面的代码使用 2 个参数,但使用 1 崩溃。尝试将 len 设置为 3,但什么也没做,仍然崩溃(重新阅读其他答案,现在明白为什么 3 什么也没做)。如果只输入一个参数,如何绕过参数?或者返回“您必须输入 2 个参数”的错误检查看起来如何?

      编辑 2:弄明白了:

      import sys
      def main():
        if len(sys.argv) >= 2:
          name = sys.argv[1] + " " + sys.argv[2]
        else:
          name = 'World'
        print 'Hello', name
      if __name__ == '__main__':
        main()
      

      【讨论】:

      • 是的,第一个版本的崩溃可能是因为使用了未定义的标签 fname 和 lname。
      • 我不清楚未定义的标签...它们与名称标签有何不同?名字不也是未定义的吗?
      • 在第一个版本中,如果命令行参数少于 2 个,打印语句将中断,因为 'fname' 和 'lname' 未定义(即在赋值之前使用)。
      • 没有参数我得到: print 'Hello', fname, lname UnboundLocalError: local variable 'fname' referenced before assignment______________ 有一个参数我得到: lname = sys.argv[2] IndexError: list index超出范围我想我明白了....需要回到书本上,我相信它会有意义。
      【解决方案5】:

      正如已经在不同的 asnwers 中解释的那样,sys.argv 包含调用 Python 脚本的命令行参数。

      不过,Python 附带的库可以帮助您非常轻松地解析命令行参数。即新标准argparse。使用argparse 可以省去编写大量样板代码的需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-13
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        • 2017-11-12
        相关资源
        最近更新 更多