Встроенная в Python функция диапазона и значения переменных

#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 (аргументы) в вашем коде прямо перед этим блоком) и какой результат вы ожидаете от этого?