为什么argv无法使用我的功能?

时间:2015-08-18 10:29:48

标签: python python-2.7 argv

所以这是我的代码

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

然后我根本没有输出。

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

4 个答案:

答案 0 :(得分:3)

引用sys.argv文档,

  

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

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

在第二种情况下,您将当前脚本名称分配给a48,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

答案 1 :(得分:0)

文件名euclidian_algorithm.py也是一个参数。另外,在你的例子中解压缩参数是一种非常糟糕的做法。

答案 2 :(得分:0)

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

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

如果您已经运行它,则会出现错误,因为gcd()包含字符串,而您将argva视为b

这是你应该做的:

int

答案 3 :(得分:0)

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