2015-08-18 4 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 будет именем текущего сценария. В первом случае вы пытаетесь распаковать три значения на две переменные. Вот почему он терпит неудачу.

Во втором случае вы назначаете текущее имя сценария 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 
+0

Благодарим вас за помощь, так как вы можете догадаться, что я относительно новичок в Python! – Ali

+1

@ Али Мы все были новичками один раз ;-) Продолжайте учиться, и я бы рекомендовал прочитать документацию на 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 содержит строки, в то время как вы лечения 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) 
+0

Это решает только две из трех проблем OP ... – jonrsharpe

+0

@jonrsharpe, позаботиться о разработке? :) – Cyphase

+2

Почему бы не запустить его и не выяснить? – jonrsharpe

0

Попробуйте использовать "а, б = ARGV [1:]", потому что имя файла является первым возвращаемым значением.

+0

Это решает только одну из трех проблем OP ... – jonrsharpe

Смежные вопросы