Я помітив, що наступний код є законним в Python. Моє запитання, чому? Чи є конкретна причина?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
after:
.
Я помітив, що наступний код є законним в Python. Моє запитання, чому? Чи є конкретна причина?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
after:
.
Відповіді:
else
Положення виконується тільки , коли ваше while
стан стає хибним. Якщо ви break
вийшли з циклу, або якщо винято виняток, він не буде виконаний.
Один із способів подумати про це - як конструкція if / else щодо умови:
if condition:
handle_true()
else:
handle_false()
є аналогом контурної конструкції:
while condition:
handle_true()
else:
# condition is false now, handle and go on with the rest of the program
handle_false()
Приклад може бути таким:
while value < threshold:
if not process_acceptable_value(value):
# something went wrong, exit the loop; don't pass go, don't collect 200
break
value = update(value)
else:
# value >= threshold; pass go, collect 200
handle_threshold_reached()
while {} something
за винятком того, що something
буде пропущено, якщо ви break
перебуваєте в while
циклі.
else
Пункт виконується , якщо ви виходите з блоку зазвичай, натиснувши умова циклу або впасти на дно спробувати блоку. Це НЕ виконується , якщо ви break
або return
з блоку, або викликати виключення. Він працює не тільки в той час, як і в циклі, але також пробує блоки.
Зазвичай ви знаходите його в місцях, де зазвичай ви виходите з циклу рано, а вибіг з кінця циклу - несподіваний / незвичний випадок. Наприклад, якщо ви переглядаєте список, шукаючи значення:
for value in values:
if value == 5:
print "Found it!"
break
else:
print "Nowhere to be found. :-("
found_it=False
цикл на початку, а потім зробіть, якщо перевірити found_it
в кінці
У відповідь на Is there a specific reason?
це одне цікаве додаток: виривання декількох рівнів циклічного циклу.
Ось як це працює: зовнішній цикл має розрив на кінці, тому він би виконувався лише один раз. Однак, якщо внутрішній цикл завершується (не знаходить дільника), він доходить до оператора else і зовнішній розрив ніколи не досягається. Таким чином, розрив внутрішньої петлі вирветься з обох петель, а не лише з однієї.
for k in [2, 3, 5, 7, 11, 13, 17, 25]:
for m in range(2, 10):
if k == m:
continue
print 'trying %s %% %s' % (k, m)
if k % m == 0:
print 'found a divisor: %d %% %d; breaking out of loop' % (k, m)
break
else:
continue
print 'breaking another level of loop'
break
else:
print 'no divisor could be found!'
Для обох while
і for
циклів else
оператор виконується в кінці, якщо break
він не був використаний.
У більшості випадків є кращі способи зробити це (перетворивши його на функцію або збільшивши виняток), але це працює!
Задача else виконується, коли умова while оцінюється як хибна.
З документації :
Оператор while використовується для повторного виконання, доки істинний вираз:
while_stmt ::= "while" expression ":" suite ["else" ":" suite]
Це неодноразово перевіряє вираз і, якщо це правда, виконує перший набір; якщо вираз хибний (що може бути вперше його перевірити), набір
else
пункту, якщо він присутній, виконується і цикл закінчується.
break
Заява виконується в першому набору завершує цикл без виконанняelse
набору Пункту в.continue
Заява виконується в першому пакету пропускає решту пакету і повертається до перевірки вираження.
Моя відповідь буде зосереджена на тому, КОГО ми можемо використовувати час / для іншого.
На перший погляд, здається, немає нічого різного при використанні
while CONDITION:
EXPRESSIONS
print 'ELSE'
print 'The next statement'
і
while CONDITION:
EXPRESSIONS
else:
print 'ELSE'
print 'The next statement'
Тому що print 'ELSE'
оператор, здається, завжди виконується в обох випадках (і тоді, коли while
цикл закінчується чи не працює).
Тоді, інше лише тоді, коли заява print 'ELSE'
не буде виконана. Це коли знаходиться break
всередині блоку коду підwhile
In [17]: i = 0
In [18]: while i < 5:
print i
if i == 2:
break
i = i +1
else:
print 'ELSE'
print 'The next statement'
....:
0
1
2
The next statement
Якщо відрізняються:
In [19]: i = 0
In [20]: while i < 5:
print i
if i == 2:
break
i = i +1
print 'ELSE'
print 'The next statement'
....:
0
1
2
ELSE
The next statement
return
не входить до цієї категорії, оскільки це робить однаковий ефект для двох вищезазначених випадків.
Підвищення винятку також не викликає різниці, тому що коли він піднімається, де наступний код буде виконуватися в обробнику винятків (крім блоку), код у else
пункті чи відразу після цього while
пункту не буде виконаний.
Я знаю, це старе питання, але ...
Як сказав Реймонд Хеттінгер, його слід називати while/no_break
замість while/else
.
Я легко підкреслюю, якщо ви подивитеся на цей фрагмент.
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
if n == 0:
print n
Тепер замість того, щоб перевіряти стан після циклу, поки ми можемо поміняти його else
і позбутися цієї перевірки.
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
else: # read it as "no_break"
print n
Я завжди читаю це, while/no_break
щоб зрозуміти код, і цей синтаксис має для мене набагато більше сенсу.
Інше застереження виконується лише тоді, коли умова while стає хибною.
Ось кілька прикладів:
Приклад 1: Спочатку умова не відповідає дійсності, тому виконується умова .
i = 99999999
while i < 5:
print(i)
i += 1
else:
print('this')
ВИХІД:
this
Приклад 2: поки умова i < 5
Герасимчука помилковим , оскільки i == 3
перерви цикл, тому ще придаткових не був виконаний.
i = 0
while i < 5:
print(i)
if i == 3:
break
i += 1
else:
print('this')
ВИХІД:
0
1
2
3
Приклад 3: У той час, коли умова i < 5
ставала помилковою, коли i
було 5
, тому інше було виконано.
i = 0
while i < 5:
print(i)
i += 1
else:
print('this')
ВИХІД:
0
1
2
3
4
this
Оператор else:
виконується, коли і лише тоді, коли цикл while більше не відповідає його умові (у вашому прикладі, коли n != 0
false).
Отже, вихід буде таким:
5
4
3
2
1
what the...
Else виконується, якщо цикл не розірвався.
Мені подобається думати про це з метафорою "бігуна".
"Інше" - це як перетинання фінішної лінії, незалежно від того, розпочали ви на початку чи в кінці траси. "else" не виконується лише в тому випадку, якщо ви зламаєте десь посередині.
runner_at = 0 # or 10 makes no difference, if unlucky_sector is not 0-10
unlucky_sector = 6
while runner_at < 10:
print("Runner at: ", runner_at)
if runner_at == unlucky_sector:
print("Runner fell and broke his foot. Will not reach finish.")
break
runner_at += 1
else:
print("Runner has finished the race!") # Not executed if runner broke his foot.
Основні випадки використання - це виривання вкладених циклів або якщо ви хочете запустити деякі оператори, лише якщо цикл десь не прорвався (думайте, що зламати незвичну ситуацію).
Наприклад, нижче є механізмом того, як вийти з внутрішнього циклу без використання змінних або спробувати / catch:
for i in [1,2,3]:
for j in ['a', 'unlucky', 'c']:
print(i, j)
if j == 'unlucky':
break
else:
continue # Only executed if inner loop didn't break.
break # This is only reached if inner loop 'breaked' out since continue didn't run.
print("Finished")
# 1 a
# 1 b
# Finished
Краще використовувати 'while: else:' побудова в Python має бути, якщо цикл не виконується в 'while', тоді виконується оператор 'else'. Те, як він працює сьогодні, не має сенсу, оскільки ви можете використовувати код нижче з тими ж результатами ...
n = 5
while n != 0:
print n
n -= 1
print "what the..."
else
блок не буде виконуватися, якщо ви залишаєте цикл за допомогою break
або return
ключового слова. У вашому прикладі print
буде виконуватися також, якщо цикл закінчився break
командою.
Це корисно для соціальної взаємодії.
while (Date != "January 1st"):
time.sleep(1)
else:
print("Happy new year!")
else
тут? Код робить точно так само без нього.
break
під час відліку часу, його використання else
не змусить вас сказати "З новим роком!" миттєво, що не має сенсу.
break
"? У break
коді немає.
else
для цього використання був надзвичайно поганою ідеєю, і що вони більше цього не роблять.