Ответ 1
Ваш оператор return
находится внутри цикла for
. Как только возвращение достигнуто, функция завершается, поэтому цикл никогда не попадает во вторую итерацию. Переместите return
за пределы цикла, уменьшив отступ.
for line in file:
temps = line.split()
for i in temps:
if i > largest:
largest = i
elif largest > i > second_largest:
second_largest = i
elif second_largest > i > third_largest:
third_largest = i
return largest, second_largest, third_largest
Кроме того, ваши сравнения не будут работать, потому что line.split()
возвращает список строк, а не плавает. (Как уже указывалось, ваши данные состоят из float, а не ints. Я предполагаю, что задача состоит в том, чтобы найти самый большой float.) Итак, пусть преобразовать строки, используя float()
Ваш код все равно будет неправильным, потому что, когда вы находите новое самое большое значение, вы полностью отказываетесь от старого. Вместо этого вы должны теперь рассмотреть это второе по величине известное значение. То же правило применяется для второго и третьего по величине.
for line in file:
temps = line.split()
for temp_string in temps:
i = float(temp_string)
if i > largest:
third_largest = second_largest
second_largest = largest
largest = i
elif largest > i > second_largest:
third_largest = second_largest
second_largest = i
elif second_largest > i > third_largest:
third_largest = i
return largest, second_largest, third_largest
Теперь есть одна последняя проблема:
Вы пропускаете случаи, когда я совпадает с одним из самых больших значений. В таком случае i > largest
будет ложным, но так будет largest > i
. Вы можете изменить любое из этих сравнений на >=
, чтобы исправить это.
Вместо этого упростим предложения if
, считая, что условия elif
рассматриваются только после того, как все предыдущие условия уже были признаны ложными. Когда мы достигаем первого elif
, мы уже знаем, что i
не может быть больше, чем largest
, поэтому достаточно сравнить его с second largest
. То же самое касается второго elif
.
for line in file:
temps = line.split()
for temp_string in temps:
i = float(temp_string)
if i > largest:
third_largest = second_largest
second_largest = largest
largest = i
elif i > second_largest:
third_largest = second_largest
second_largest = i
elif i > third_largest:
third_largest = i
return largest, second_largest, third_largest
Таким образом, мы избегаем случайного отфильтровывания краевых случаев i == largest
и i == second_largest
.