2010-04-12 5 views
17

В приведенном ниже коде я понимаю, что sys.argv использует списки, однако я не понимаю, как здесь используются индексы.Списки и индексы Python sys.argv

def main(): 

    if len(sys.argv) >= 2: 
    name = sys.argv[1] 
    else: 
    name = 'World' 
    print 'Hello', name 

if __name__ == '__main__': 
    main() 

Если я изменяю

name = sys.argv[1] 

в

name = sys.argv[0] 

и что-нибудь для аргумента он возвращает:

Hello C:\Documents and Settings\fred\My Documents\Downloads\google-python-exercises 
\google-python-exercises\hello.py 

Какой вид имеет смысл.

Может кто-нибудь объяснить, как 2 используется здесь:

if len(sys.argv) >= 2: 

И как 1 используется здесь:

name = sys.argv[1] 

ответ

27

скажем в командной строке у вас есть:

C:\> C:\Documents and Settings\fred\My Documents\Downloads\google-python-exercises 
\google-python-exercises\hello.py John 

, чтобы сделать его легче читать, давайте просто сократить это:

C:\> hello.py John 

argv представляет все элементы, которые приходят вместе с помощью входной сигнал командной строки, но отсчет начинается с нуля (0) не один (1): в этом случае «hello.py» является элементом 0, «John» является элементом 1

, другими словами, sys.argv[0] == 'hello.py' и sys.argv[1] == 'John' ... но посмотрите, сколько элементов это? 2, правильно! так что даже если числа равны 0 и 1, здесь есть два элемента.

len(sys.argv) >= 2 только проверил, введено ли вы как минимум два элемента. в этом случае, мы вошли ровно 2.

теперь давайте перевести свой код на английском языке:

define main() function: 
    if there are at least 2 elements on the cmd-line: 
     set 'name' to the second element located at index 1, e.g., John 
    otherwise there is only 1 element... the program name, e.g., hello.py: 
     set 'name' to "World" (since we did not get any useful user input) 
    display 'Hello' followed by whatever i assigned to 'name' 

так что это значит? это означает, что если вы ввели:

  • «hello.py», то код выхода «Hello World», потому что вы не дали имя
  • «hello.py John», то код выхода «Hello John», потому что вы сделали
  • «hello.py John Paul», код по-прежнему выводит «Hello John», потому что он не сохраняет и не использует sys.argv[2], что было «Paul» - вы видите в этом случае len(sys.argv) == 3, потому что в списке есть 3 элемента?
+2

Благодарим вас за очень четкое объяснение. –

+1

yvw! я видел, что другие уже ответили на это довольно хорошо, и мне нужна была альтернатива, которая больше ориентировалась на чистый «английский перевод» кода, если есть такая вещь. ура! – wescpy

+0

Вы также можете запустить свой цикл 'for i в диапазоне (1, len (sys.argv) -1):' затем получите свое значение с помощью 'sys.argv [i]', если вам нужно знать позицию, а также стоимость. –

8

sys.argv список аргументов, передаваемых программе Python. Первый аргумент, sys.argv[0], на самом деле является именем программы, поскольку она была вызвана. Это не Python, но как работает большинство операционных систем. Причина sys.argv[0] заключается в том, что вы можете изменить поведение своей программы в зависимости от того, как она была вызвана. Таким образом, sys.argv[1] является первым аргументом, который вы фактически передаете программе.

Поскольку списки (как и большинство последовательностей) в Python начинают индексирование в 0, а потому, что индексирование за конец списка является ошибкой, вам нужно проверить, имеет ли список длину 2 или больше, прежде чем вы сможете получить доступ к sys.argv[1].

4

Вкратце, sys.argv - это список слов, которые появляются в команде, используемой для запуска программы. Первое слово (первый элемент списка) - это имя программы, а остальные элементы списка - любые аргументы. На большинстве языков программирования (включая Python) списки индексируются с нуля, что означает, что первый элемент в списке (в данном случае - имя программы) равен sys.argv[0], а второй элемент (первый аргумент, если он есть) - sys.argv[1] , и т. д.

Тест len(sys.argv) >= 2 просто проверяет, что список имеет длину, большую или равную 2, что будет иметь место, если в программе имеется хотя бы один аргумент.

+1

Вы, кажется, используете 'array', чтобы означать' list' несколько раз. Они разные. 'sys.argv' - это список, как вы упомянули в первом предложении. –

+0

Спасибо, зная, что первый элемент - это название программы, это долгий путь, помогая понять это! –

+0

@ Томас: хорошо, я исправлю это ... Я стараюсь использовать термины взаимозаменяемо, поскольку списки Python часто выполняют ту же функцию, что и массивы C (и в этом случае различие не особенно важно). –

3

Итак, если бы я хотел вернуть имя и фамилию, такие как: Hello Fred Gerbig, я бы использовал приведенный ниже код, этот код работает, но действительно ли это самый правильный способ сделать это?

import sys 
def main(): 
    if len(sys.argv) >= 2: 
    fname = sys.argv[1] 
    lname = sys.argv[2] 
    else: 
    name = 'World' 
    print 'Hello', fname, lname 
if __name__ == '__main__': 
    main() 

Edit: Найдено, что приведенный выше код работает с 2-мя аргументами, но аварий с 1. Пытался установить Len до 3, но это ничего не делал, до сих пор выходит из строя (перечитать другие ответы, а теперь понимаю, почему 3 сделал ничего). Как обойти аргументы, если введен только один? Или как будет выглядеть проверка ошибок, которая вернула «Вы должны ввести 2 аргумента»?

Edit 2: Понял выяснил:

import sys 
def main(): 
    if len(sys.argv) >= 2: 
    name = sys.argv[1] + " " + sys.argv[2] 
    else: 
    name = 'World' 
    print 'Hello', name 
if __name__ == '__main__': 
    main() 
+0

Да, авария в вашей первой версии была, вероятно, из-за использования неопределенных ярлыков fname и lname. –

+0

Я не совсем понимаю неопределенные ярлыки ... как они отличаются от названия? Не указано также имя? –

+0

В первой версии, если есть меньше двух аргументов командной строки, оператор печати будет разбит, потому что 'fname' и 'lname' не определены (т. Е. Используются перед назначением). –

2

Как объяснен в различной asnwers уже sys.argv содержит аргументы командной строки, которые называются сценарием Python.

Однако Python поставляется с библиотеками, которые очень легко анализируют аргументы командной строки. А именно, новый стандарт argparse. Использование argparse избавило бы вас от необходимости писать много шаблонов.