Диапазон Python не работает должным образом с переменной в качестве шага - PullRequest
0 голосов
/ 13 октября 2019

У меня возникли проблемы с запуском какой-либо программы. Что мне нужно сделать, так это ввести числовые значения и сказать, увеличиваются они или уменьшаются, начиная с интервала один, что означает, что если бы список был [13,15,17,15,18], то первым набором было бы [13,15], а затем [15,17]и наконец [15,18]. Первая секция интервала работает отлично, но когда я увеличиваю a до 2, чтобы попытаться увеличить шаг функции диапазона, он выводит те же группы, что и когда a равно 1. Правильные значения при a = 2 должны быть [13,17], [17,18], [15,15]. Если я копирую, вставляю его и заменяю переменную a двумя, программа действительно запускается, однако она выдает мне неправильное число увеличений и уменьшений. Я уверен, что пропускаю что-то простое, но я так долго смотрел на эту проблему, что она стала причудливой. Я не включил весь свой код, но prod_list - это просто список целых чисел, которые больше нуля.

a = 1
for i in range(0,len(prod_list),a):
    while(i-1 < 0):
        i +=1
    while(i > len(prod_list)):
        i -= 1
    if(prev != (prod_list[i-1],prod_list[i])):
        if((prod_list[i-1] - prod_list[i]) > 0):
            decr += 1
        elif((prod_list[i-1] - prod_list[i]) < 0):
            incr += 1
        elif((prod_list[i-1] == prod_list[i]) < 0):
            same += 1
        print(prod_list[i-1],prod_list[i])
        prev = (prod_list[i-1],prod_list[i])
        a += 1

1 Ответ

0 голосов
/ 13 октября 2019

Python for является для каждого in итератором. Он не работает как стиль C int i=0; i<x; i+=a для циклов. Если вы хотите, чтобы это работало так же, как в Python, используйте while вместо этого с начальным значением выше while и обновлением i+=a внутри цикла.

Если итератором является range() объект, вы получаете целые числа из него, но сам итератор уже создан при запуске цикла. Обновление a после того, как вы уже инициализировали, объект range() не собирается изменять его состояние. Фактически, после построения диапазона, вы даже можете полностью удалить переменную a. Это ничего не изменит. a является ссылкой на неизменяемый объект int. Как только range() имеет его, изменение того, на что указывает a, не влияет на int, которое уже есть у объекта диапазона.

Использование явных целочисленных индексов, когда вы могли использовать значения непосредственно из итератора, считается непифоническим,но при переводе алгоритмов из учебника иногда нужно начинать с этого.

Можно отправить параметры обратно в функцию генератора, и это будет значением выражения yield. range() не предназначен для этого (а его атрибут step доступен только для чтения), но можно реализовать генератор, который это делает, и использует его для изменения размера шага. Но очевидная реализация этого снова будет использовать внутренний цикл while, поэтому я не уверен, насколько это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...