Вот еще один идиоматический вариант использования помимо поиска. Допустим, вы хотели подождать, пока условие будет выполнено, например, порт, который будет открыт на удаленном сервере, а также некоторое время ожидания. Тогда вы можете использовать конструкцию while...else
следующим образом:
import socket
import time
sock = socket.socket()
timeout = time.time() + 15
while time.time() < timeout:
if sock.connect_ex(('127.0.0.1', 80)) is 0:
print('Port is open now!')
break
print('Still waiting...')
else:
raise TimeoutError()
Правильно, g.next ()
был переименован в ] g .__ следующий __ ()
. Причина этого в согласованности: все специальные методы, такие как __ init __ ()
и __ del __
, имеют двойное подчеркивание (или "dunder" в текущем жаргоне), и .next ()
было одним из немногих исключений из этого правила. Это было исправлено в Python 3.0. [*]
Но вместо вызова g .__ next __ ()
, как говорит Паоло, используйте next (g)
.
[*] Есть и другие особые атрибуты, которые получили это исправление; func_name
, теперь __ name __
и т. Д.
Попробуйте:
next(g)
Посмотрите эту аккуратную таблицу , которая показывает различия в синтаксисе между 2 и 3, когда доходит до этого.