2015-08-18 55 views
0

因此,这里是我的代码为什么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 

然后我根本没有输出。

现在首先我不明白如何解开太多的值,当我只有两个参数。其次,为什么我在第二种情况下得不到输出?

+0

'argv'包含字符串,而不是数字。 – Evert

+0

另外,它包含脚本名称作为第一个参数(所以在第二种情况下,'a =='euclidian_algorithm.py''和'b == '40,48'')。另外,你永远不会真的调用你的函数。 – jonrsharpe

+0

你的论点之间的逗号也会弄乱事情。另外,'argv'包含程序名称作为它的第一个参数,所以在第一种情况下你的'argv'看起来像'['euclidian_algorithm.py''40,',48']'。 – Evert

回答

3

引用sys.argv文档,

传递给一个Python脚本命令行参数的清单。 argv[0]是脚本名称(操作系统依赖于它是否是完整路径名)。

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

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

您可以通过打印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 
+0

感谢您的帮助,您可以猜到我对Python相对较新! – Ali

+1

@Ali我们都是初学者一次;-)继续学习,我会推荐阅读Python文档。 – thefourtheye

0

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

+0

那么我应该如何解开它们呢? – Ali

+2

*“这是一个非常糟糕的做法,解压缩在你的例子中的参数”* - 说谁?对于这样的简单脚本,使用例如'argparse'似乎有点不必要。 – jonrsharpe

0

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

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

如果你已经运行它,你会得到一个错误,因为argv包含字符串,而你处理abint的。

这里是你应该做的:

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) 
+0

这只解决了OP的三个问题中的两个...... – jonrsharpe

+0

@jonrsharpe,谨慎详细说明? :) – Cyphase

+2

为什么不运行它并找出? – jonrsharpe

0

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

+0

这只解决了OP的三个问题之一...... – jonrsharpe

相关问题