[英]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
但是,如果我然后刪除兩個輸入之間的空間,就像這樣
python euclidian_algorithm.py 40,48
然后,我根本沒有任何輸出。
現在,首先,當我僅放置兩個參數時,我不理解要解壓縮的值太多了。 其次,為什么在第二種情況下我沒有輸出?
引用sys.argv
文檔,
傳遞給Python腳本的命令行參數列表。
argv[0]
是腳本名稱(是否為完整路徑名取決於操作系統)。
因此, 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
其次,為什么在第二種情況下我沒有輸出?
這是因為根本不調用函數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
文件名euclidian_algorithm.py也是參數之一。 另外,像示例中那樣解壓縮參數也是非常不好的做法。
首先,不要用逗號分隔參數,否則這些逗號將顯示在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:]”,因為文件名是返回的第一個值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.