为什么 argv 不适用于我的函数?

Why does argv not work with my function?

这是我的代码

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

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

python euclidian_algorithm.py 40,48

然后我完全没有输出。

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

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

引用 sys.argv 文档,

The list of command line arguments passed to a Python script. argv[0] is the script name (it is operating system dependent whether this is a full pathname or not).

因此,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

Secondly, why do I get no output in the second case?

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


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

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

然后像这样调用函数

gcd(a, b)

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

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

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

首先,不要用逗号分隔参数,否则那些逗号会出现在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)

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