комбинация while for loop не может завершиться во время цикла

#python #for-loop #while-loop #break #continue

#python #для цикла #while-цикл #перерыв #продолжить

Вопрос:

Я разрабатываю скрипт для проверки, превышает ли сумма столбцов фрейма данных три с определенным интервалом.

 loc_number = 10 # start loc image number with 10
k = 2
while k < 3: 
    for i in range(0, int(len(target_df.index)/loc_number), loc_number):
        print(range(0, int(len(target_df.index)/loc_number), loc_number))
        print(loc_number, i)
        loc_target_df = target_df.loc[i: i loc_number].sum(skipna=True, axis=0)
        print(loc_target_df)
        if any(x < 3 for x in loc_target_df):
            loc_number  = 1
            print('heloo')
            break
        else:
            print('here')
            pass
    print('probably')
    continue
  

Кажется, что в начале он переходит к «if» и некоторое время выводит «heloo», что означает, что сумма значений определенного столбца не превышает трех. Хорошо. это то, что я хотел.

Однако, когда он переходит к else, что означает, что сумма cloumn превышает три, он должен перейти к следующему «циклу for», а не «while». но он снова и снова переходит в цикл while, поэтому распечатайте так:

 here
probablay
range(0, 14, 322)
322 0
10.000000     272
26.400000     210
31.680000     106
38.016000     113
45.619200     215
54.743040     146
65.691648     224
78.829978     255
94.595973     321
113.515168    308
136.218201    356
163.461842    270
196.154210    190
235.385052     97
282.462062     47
338.954475     32
406.745370      6
488.094443      3
dtype: int64
here
probablay
range(0, 14, 322)
322 0
10.000000     272
26.400000     210
31.680000     106
38.016000     113
45.619200     215
54.743040     146
65.691648     224
78.829978     255
94.595973     321
113.515168    308
136.218201    356
163.461842    270
196.154210    190
235.385052     97
282.462062     47
338.954475     32
406.745370      6
488.094443      3
dtype: int64
here
probablay
range(0, 14, 322)
322 0
10.000000     272
26.400000     210
31.680000     106
38.016000     113
45.619200     215
54.743040     146
65.691648     224
78.829978     255
94.595973     321
113.515168    308
136.218201    356
163.461842    270
196.154210    190
235.385052     97
282.462062     47
338.954475     32
406.745370      6
488.094443      3
dtype: int64
here
probablay
range(0, 14, 322)
322 0
  

в чем проблема моего цикла while for?? и как заставить цикл for работать?

Комментарии:

1. Вы нигде не меняетесь k внутри цикла while

2. Что вы хотите, чтобы произошло?

3. @Jasmijn что я хочу сделать, так это продолжать запускать ‘for loop’ при условии else.

4. Это уже происходит. Вам даже не нужно pass там, потому что оно буквально ничего не делает.

Ответ №1:

Я отвечу на первый вопрос, может быть, вы могли бы предоставить немного более подробную информацию о том, что он должен делать, как только он пройдет else then . У меня такое чувство, что вы хотите, чтобы код делал что-то совершенно иное, чем то, что он делает прямо сейчас.

Я надеюсь, что это поможет, хотя это довольно большой текст.

Давайте посмотрим на выполнение:

  • вы определяете свои переменные loc_number = 10, k = 2 .
  • код проверяет, является ли k < 3 это true.
  • вы определяете диапазон от 0 до int(len(target_df.index)/loc_number) = 450 в шагах loc_number = 10 , который является итератором, который будет установлен i = 0 на первой итерации
  • Теперь i = 0 , когда код печатается 10 0 , и вы вычисляете сумму всех элементов фрейма данных от строки 0 к строке i loc_number = 0 10 = 10 . Это возвращает значение для каждого столбца, которое снова печатается.
  • Теперь вы проверяете, не меньше ли какое-либо из этих значений, чем 3 ( x < 3 ) , и если это так, вы увеличиваете loc_number на 1 ( loc_number = 11) , печатаете 'heloo' и выходите из for цикла.
  • Код печатает 'probably'
  • Поскольку k < 3 == True вы инициализируете новый цикл for с range(0, 409, 11) помощью (начиная от 0 to 14 с шагом 11 ), который снова будет установлен i = 0 на первой итерации.
  • Теперь i = 0 , когда код печатается 11 0 , и вы вычисляете сумму всех элементов фрейма данных от строки 0 к строке i loc_number = 0 11 = 11 . Это возвращает значение для каждого столбца, которое снова проверяется, если какое-либо из них меньше 3.
  • Поскольку это так loc_number = 1 = 12 , он печатает 'heloo' , и вы снова выходите из цикла for. Код печатает 'probably'
  • Это повторяется до тех пор, пока loc_number = 322 . Теперь range(0, 14, 322) возвращается only 0 , поэтому for цикл только устанавливается i = 0 , и вы суммируете от строки 0 до строки 322, код печатается 322 0
  • Теперь ни одно значение не меньше 3, поэтому any(x < 3) вычисляется False и else вызывается. Там loc_number остается прежним, и код печатается 'here' .
  • Поскольку for цикл не находит другой элемент в range() итераторе, for цикл завершается и печатается код 'probably' .
  • Теперь вы инициализируете for цикл с неизмененным range(0, 14, 322) , который выполняется так же, как и раньше, ни одно значение не меньше 3.
  • Этот круг никогда не прерывается, поскольку while утверждение всегда истинно.

Возможно, одна из причин путаницы заключается в том, что for в python поведение похоже foreach на другие языки.

Кроме того, я бы посоветовал запустить следующий фрагмент кода, чтобы лучше понять range(start, stop, step) функцию, поскольку я думаю, что это также ведет себя иначе, чем вы предполагали:

 for i in range(0, 5, 2):
    print(i)

for k in range(0, 5, 10):
    print(k)
  

Комментарии:

1. Ах да, я понял, что была проблема с диапазоном. Я установил более высокое значение шага, чем значение остановки. Спасибо!!!