Правильно ли делать инкрементацию после каждой проверки условия?

Подскажите, правильно ли, что после каждого if в цикле стоит i += 1 ?

from ping3 import ping

urls = ('ya.ru', '8.8.8.8', 'e1.ru', '192.168.0.99', 'google.com', '192.168.1.25', '192.168.1.26', 'ok.ru', '192.168.0.2', '192.168.0.1', '192.168.1.1', '192.168.1.2')

i=0
while i<len(urls):
    ping(urls[i])
    if ping(urls[i]) == None:
        print('None: ', urls[i])
        i += 1
    if ping(urls[i]) == False:
        print('False: ',urls[i])
        i += 1
    else:
        print('OK: ', urls[i])
        i += 1 

Код работает, но меня смущает, что в справочниках нигде так не пишут, а если так не писать - код работает некорректно. Боюсь, что в большом списке будет какая то ошибка, и в реальной задаче этого будет просто не видно.


Ответы (3 шт):

Автор решения: Эникейщик

Так неправильно. См. ответ @StanislavVolodarskiy

Вот так лучше :

else:
    print('OK: ', urls[i])
i += 1

Остальные i += 1 убрать.

Ещё лучше, поскольку идёт итерация по списку, использовать проход по списку:

for url in urls:
    ping(url)
    if ping(url) == None:
        print('None: ', url)
    if ping(url) == False:
        print('False: ',url)
    else:
        print('OK: ', url)
      

Плюс, здесь каждый адрес пингуется три раза, из которых один вообще бесполезно. Вот это уже плохо, потому что результаты могут оказаться разными. Правильно примерно так:

for url in urls:
    result = ping(url)
    if result == None:
        print('None: ', url)
    if result == False:
        print('False: ',url)
    else:
        print('OK: ', url)
→ Ссылка
Автор решения: Stanislav Volodarskiy

Выход за границу списка

Функция ping всегда возвращает None, один адрес в списке. Если в списке адресов последний адрес не ответит, скрипт упадет:

def ping(url):
    return None

urls = ('a', )

i=0
while i<len(urls):
    ping(urls[i])
    if ping(urls[i]) == None:
        print('None: ', urls[i])
        i += 1
    if ping(urls[i]) == False:
        print('False: ',urls[i])
        i += 1
    else:
        print('OK: ', urls[i])
        i += 1 
$ python temp.py
None:  a
Traceback (most recent call last):
  File "/home/sv/desk/stackoverflow/temp.py", line 12, in <module>
    if ping(urls[i]) == False:
IndexError: tuple index out of range

Ошибочный ответ

Если в списке адресов два адреса подряд не ответят, то для второго адреса код напечатает "OK". Функция ping всегда возвращает None, два адреса в списке. Я ожидаю что ответом будет

None:  a
None:  b

Запускаем:

def ping(url):
    return None


urls = ('a', 'b')

i=0
while i<len(urls):
    ping(urls[i])
    if ping(urls[i]) == None:
        print('None: ', urls[i])
        i += 1
    if ping(urls[i]) == False:
        print('False: ',urls[i])
        i += 1
    else:
        print('OK: ', urls[i])
        i += 1 

Для второго адреса печатается "OK":

None:  a
OK:  b

Рабочий вариант

for url in urls:
    r = ping(url)
    v = 'OK'
    if r is None:
        v = 'None'
    if r is False:
        v = 'False'
    print(f'{v}: {url}')
→ Ссылка
Автор решения: SergFSM

так, по идее, должно работать:

for url in urls:
    print(f'OK: {url}' if (r:=ping(url)) else f'{r}: {url}')
→ Ссылка