#python #loops #range
#python #циклы #диапазон
Вопрос:
Я пишу скрипт, в котором я извлекаю аргументы командной строки с помощью getopt, уточняю предлагаемые значения, а затем использую эти значения в качестве ограничений в цикле. Фрагмент кода приведен ниже:
try:
start_pod, end_pod, topo_value = map(int, args)
except ValueError, error_msg:
if 'invalid' in str(error_msg):
err_funct('Non-integer values supplied: {%s}' % args)
else:
err_funct(error_msg)
for pod in range(start_pod, end_pod):
print 'value of pod: %s' % pod
for switch in range(1,5):
print 'value of switch: %s' % switch
Проблема, с которой я сталкиваюсь, связана с функцией ‘range’. Я думаю, что я передаю ему целые числа (функция map преобразует список строк в целые числа), и если бы я не был, мой обработчик try / except завершается с помощью функции ошибки, которую я написал, но по какой-то причине это не работает.
Если я вызову свой скрипт с правильным количеством входных данных, например ‘some_script.py 1 1 5’, скрипт ничего не возвращает.
Ответ №1:
Ваш вызов скрипта неверен:
>>> range(1,1)
[]
( start_pod
и end_pod
оба будут равны 1).
range(i,j)
Функции возвращают следующий список [i, i 1, .., j - 1]
. Или, другими словами, конечная точка всегда удаляется.
Попробуйте изменить for pod in range...
строку в:
for pod in range(start_pod, end_pod 1):
Ответ №2:
Пожалуйста, убедитесь, что вы вставили автономный пример. В вашем, очевидно, отсутствует важная часть — на что установлены аргументы?
Если я наивно предполагаю, что приведенный вами пример сопоставляется прямо с вашими аргументами и добавляется вверху:
args = ['1', '1', '5']
тогда он ведет себя так, как вы только что сказали — нет вывода.
Однако это, вероятно, не то, что вы хотите, потому что тогда start_pod и end_pod одинаковы.
Если вместо этого я делаю
args = ['1', '5', '1']
затем я получаю вывод. Какие аргументы достигают вашего кода с помощью заданной командной строки (печатайте repr (аргументы) в вашем коде прямо перед этим блоком) и какой результат вы ожидаете от этого?