Давайте сначала посмотрим, что не так в вашем коде или что необходимо исправить.
i = 0
while n <= 0:
i += 1
Здесь вы использовали хороший лог c, но есть одна проблема. Ваш while
l oop работает до n<=0
, что правильно, если n - ваш текущий номер. В вашем коде вы просто обновляете i
(индекс), а не текущий номер.
Например, возьмите num=[-2,-3,4,5]
, ваша функция должна вернуть 4
. Позвольте нам dry -пробегать пока l oop. перед 1-й итерацией:
n=-2, i=0
L oop условие: n<=0
выполнено, поэтому l oop выполняется и i+=1
после 1-й итерации (что означает перед 2-й итерацией):
n=-2, i=1
Помните, мы не выполняли никаких операций с n
, поэтому он остается как есть. Снова условие L oop: n<=0
выполнено, потому что -2 <= 0 Итак, мы делаем <code>i+=1 после 2-й итерации (что означает перед 3-й итерацией):
n=-2, i=2
Вы заметили, что в этом Кстати, условие while l oop никогда не нарушится? Таким образом, ваш while l oop будет работать бесконечно без вывода.
Итак, самый большой вопрос, который приходит нам в голову, - что, черт возьми, нам тогда делать? Простой ответ - обновить n
, как показано ниже -
i = 0
while n <= 0:
i += 1
n=num[i]
Теперь, когда мы запустим это, n
(текущий элемент) будет обновляться на каждой итерации l oop. То есть для каждой итерации значения n
и i
будут следующими:
итерация 1: до этой итерации: i=0, n=-2
l oop условие: n<=0
(выполнено) после эта итерация: i=1, n=-3 (n= num[i] , that is n=num[1]=-3)
итерация 2: до: i=1, n=-3
условие: n<=0
(выполнено) после: i = 2, n = 4
итерация 3: до: i=2, n=4
условие: n<=0
(не выполнено) после: l oop не выполняется
Следовательно, после завершения l oop, мы имеем i
as 2
, который является первым индекс положительного числа.
Есть еще небольшая проблема с этим кодом.
Могу я спросить вас, что произойдет, если все элементы num будут отрицательными? То есть, когда в num array / list
отсутствует положительный элемент, условие l oop n<=0
, где n
- текущий элемент, всегда будет выполняться, поэтому i
будет обновлено до i+1
после каждой итерации.
Рассмотрим, когда i=length-1
и мы снова вводим while l oop, давайте проверим условие l oop: n=num[i]=num[length-1]
и n<=0
Итак, мы входим в l oop и выполните:
i+=1
, то есть i=(length-1)+1
, то есть i=length
, а теперь n=num[i]=num[length]
, и все мы знаем, что в python индексация начинается с 0
и заканчивается на length-1
. Как вы думаете, что произойдет, если мы попытаемся получить доступ к элементу с длиной индекса?
Tada ?, мы получим IndexError. Взгляните на приведенный ниже код для лучшего понимания.
a=[1,2,3]
print(a[0])
print(a[1])
print(a[2])
print(a[3])
Вывод:
1
2
3
Traceback (most recent call last):
File "main.py", line 5, in <module>
print(a[3])
IndexError: list index out of range
Итак, что нам делать, чтобы обработать эту ошибку в нашем while l oop? Просто поместите другое условие, что l oop должен работать до i<length
, то есть l oop теперь становится
i = 0
while i<len(num) and n <= 0:
i += 1
n=num[i]
Итак, да, теперь он завершен. Я написал полную функцию ниже. Здесь, в этой функции, вместо использования n=num[i]
, а затем n<=0
в условии l oop, я напрямую использую num[i]
в условии l oop.
def first_positive(num):
i=0 # i is the current index
while(i<len(num) and num[i]<=0): # i<len(num) means run the while loop until there are elements in the num list
i+=1
if i==len(num): # when there are no positive elements present in the list
return "No positive element found"
else:
return num[i]
print(first_positive([-2,-3,5,10])) # prints 5
print(first_positive([-2,-3,-5,10])) # prints 10
print(first_positive([-2,-3,-5,-10])) # prints No positive element found