Правильно ли делать инкрементацию после каждой проверки условия?
Подскажите, правильно ли, что после каждого 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)
Выход за границу списка
Функция 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}')
так, по идее, должно работать:
for url in urls:
print(f'OK: {url}' if (r:=ping(url)) else f'{r}: {url}')