为什么 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
。
您可以通过打印 argv
、a
和 b
来确认这一点,就像这样
➜ 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
包含字符串,而你将 a
和 b
视为 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:]",因为文件名是返回的第一个值。
这是我的代码
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
。
您可以通过打印 argv
、a
和 b
来确认这一点,就像这样
➜ 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
包含字符串,而你将 a
和 b
视为 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:]",因为文件名是返回的第一个值。