Списки и индексы Python sys.argv
В приведенном ниже коде я понимаю, что 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]
Ответы
Ответ 1
скажем, в командной строке:
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 элемента в списке sys.argv
?
Ответ 2
sys.argv
- список аргументов, переданных программе Python. Первый аргумент, sys.argv[0]
, на самом деле является именем программы при ее вызове. Это не вещь Python, а то, как работают большинство операционных систем. Причина sys.argv[0]
заключается в том, что вы можете изменить поведение своей программы в зависимости от того, как она была вызвана. sys.argv[1]
- это, таким образом, первый аргумент, который вы фактически передаете программе.
Поскольку списки (как и большинство последовательностей) в Python начинают индексировать в 0, а потому, что индексирование за конец списка является ошибкой, вам нужно проверить, имеет ли список длину 2 или больше, прежде чем вы сможете получить доступ к sys.argv[1]
.
Ответ 3
Вкратце, sys.argv
- это список слов, которые появляются в команде, используемой для запуска программы. Первое слово (первый элемент списка) - это имя программы, а остальные элементы списка - любые аргументы. На большинстве языков программирования (включая Python) списки индексируются с нуля, что означает, что первый элемент в списке (в данном случае - имя программы) равен sys.argv[0]
, а второй элемент (первый аргумент, если он есть) sys.argv[1]
и т.д.
Тест len(sys.argv) >= 2
просто проверяет, что список имеет длину, большую или равную 2, что будет иметь место, если в программе был хотя бы один аргумент.
Ответ 4
Итак, если бы я хотел вернуть имя и фамилию, такие как: 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()
Изменить: обнаружено, что приведенный выше код работает с двумя аргументами, но с ошибкой 1. Попробовал установить len на 3, но ничего не сделал, все равно сбой (перечитайте остальные ответы и теперь поймите, почему 3 ничего не сделали). Как обойти аргументы, если введен только один? Или как будет выглядеть проверка ошибок, которая вернулась "Вы должны ввести 2 аргумента"?
Изменить 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()
Ответ 5
Как уже объяснялось в разных атрибутах, sys.argv
содержит аргументы командной строки, которые вызвали ваш Python script.
Однако Python поставляется с библиотеками, которые помогают легко анализировать аргументы командной строки. А именно, новый стандарт argparse. Использование argparse
избавит вас от необходимости писать много шаблонов.