【问题标题】:Why does argv not work with my function?为什么 argv 不适用于我的函数?
【发布时间】:2015-08-18 18:47:25
【问题描述】:

这是我的代码

from sys import argv

a,b = argv

def gcd(a,b):
    while a:
        a,b = b%a, a
    print b

现在如果我用这个从命令行运行它

python euclidian_algorithm.py 40, 48

我收到此错误

Traceback (most recent call last):
File "euclidian_algorithm.py", line 3, in <module>
a,b = argv
ValueError: too many values to unpack

但是,如果我随后删除两个输入之间的空格,就像这样

python euclidian_algorithm.py 40,48

然后我根本没有输出。

首先,当我只输入两个参数时,我不明白为什么要解压缩的值太多。 其次,为什么我在第二种情况下没有输出?

【问题讨论】:

  • argv 包含字符串,而不是数字。
  • 另外,它包含脚本名称作为第一个参数(所以在第二种情况下,a == 'euclidian_algorithm.py'b == '40,48')。此外,您从未真正调用过您的函数。
  • 你的论点之间的逗号也会把事情搞砸。另外,argv 包含程序名称作为其第一个参数,因此您的argv 在第一种情况下看起来像['euclidian_algorithm.py' '40,', 48']
  • 如果您在程序中乱扔print 语句,您可能很容易发现自己。

标签: python python-2.7 argv


【解决方案1】:

引用sys.argv 文档,

传递给 Python 脚本的命令行参数列表。 argv[0] 是脚本名称(它是否为完整路径名取决于操作系统)。

因此,argv 的第一个值将是当前脚本名称。在第一种情况下,您试图将三个值解压缩到两个变量上。这就是它失败的原因。

在第二种情况下,您将当前脚本名称分配给a,将48,40 分配给b

您可以通过打印argvab来确认这一点,像这样

➜  Desktop  cat Test.py
from sys import argv

print argv
a, b = argv
print a, b


def gcd(a, b):
    while a:
        a, b = b % a, a
    print b
➜  Desktop  python Test.py 40, 48
['Test.py', '40,', '48']           # Note that argv has three items and first is the file name
Traceback (most recent call last):
  File "Test.py", line 4, in <module>
    a, b = argv
ValueError: too many values to unpack
➜  Desktop  python Test.py 40,48 
['Test.py', '40,48']
Test.py 40,48

其次,为什么我在第二种情况下没有输出?

那是因为函数gcd根本没有被调用。


要解决这个问题,因为您只期望两个项目,我会简单地像这样分配它们

a = int(argv[1])
b = int(argv[2])

然后像这样调用函数

gcd(a, b)

我们需要将值转换为整数,因为参数将是字符串。

注意:另外,传递的参数需要用空格字符分隔,而不是逗号。所以,你会像这样执行程序

from sys import argv

def gcd(a, b):
    while a:
        a, b = b % a, a
    print b

a = int(argv[1])
b = int(argv[2])

gcd(a, b)

➜  Desktop  python Test.py 40 48
8

【讨论】:

  • 感谢您的帮助,您可以猜到我对 Python 还比较陌生!
  • @Ali 我们曾经都是初学者 ;-) 继续学习,我建议阅读 Python 文档。
【解决方案2】:

文件名 euclidian_algorithm.py 也是参数之一。此外,像您的示例中那样解压缩参数是一种非常糟糕的做法。

【讨论】:

  • 那我应该怎么解压呢?
  • “像您的示例中那样解压缩参数是一种非常糟糕的做法” - 谁说的?对于像这样的简单脚本,使用例如argparse 好像有点没必要。
【解决方案3】:

尝试使用“a,b = argv[1:]”,因为文件名是第一个返回的值。

【讨论】:

    【解决方案4】:

    首先,不要用逗号分隔参数,否则这些逗号将显示在sys.argv 中。其次,sys.argv中的第一个元素是脚本的名称;所以在你的情况下,sys.argv == ['euclidian_algorithm.py', '40,', '48']

    python euclidian_algorithm.py 40,48 没有输出的原因是a,b = argv 中没有错误,因为argv 中只有两项(脚本名称和参数), 因为你实际上并没有调用gcd(),只是定义它。

    如果你运行它,你会得到一个错误,因为argv 包含字符串,而你将ab 视为int 的。

    这是你应该做的:

    from sys import argv
    
    a, b = [int(x) for x in argv[1:3]]
    
    def gcd(a, b):
        while a:
            a,b = b%a, a
        return b
    
    print gcd(a, b)
    

    【讨论】:

    • @jonrsharpe,想详细说明一下吗? :)
    • 为什么不运行它并找出答案?
    • 啊,你的意思是str's vs int's。 :)
    • @jonrsharpe,没什么大不了的,但您可以用更少的字符而不是含糊不清地说出问题所在:)。
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多