#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
внутри цикла while2. Что вы хотите, чтобы произошло?
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
to14
с шагом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)
возвращается only0
, поэтому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. Ах да, я понял, что была проблема с диапазоном. Я установил более высокое значение шага, чем значение остановки. Спасибо!!!