def CardsAssignment():
Cards+=1
print (Cards)
return break
while True:
CardsAssignment()
はい、できないことはわかっていreturn break
ます。しかし、def 関数で while ループを破るにはどうすればよいでしょうか。それとも私の概念が間違っていますか?
def CardsAssignment():
Cards+=1
print (Cards)
return break
while True:
CardsAssignment()
はい、できないことはわかっていreturn break
ます。しかし、def 関数で while ループを破るにはどうすればよいでしょうか。それとも私の概念が間違っていますか?
いいえ、できません。次のようにします。
def CardsAssignment():
Cards+=1
print (Cards)
if want_to_break_while_loop:
return False
else:
return True
while True:
if not CardsAssignment():
break
これを行う非常にPythonicな方法は、次のような例外を使用することです。
class StopAssignments(Exception): pass # Custom Exception subclass.
def CardsAssignment():
global Cards # Declare since it's not a local variable and is assigned.
Cards += 1
print(Cards)
if time_to_quit:
raise StopAssignments
Cards = 0
time_to_quit = False
while True:
try:
CardsAssignment()
except StopAssignments:
break
もう 1 つのあまり一般的ではないアプローチは、関数の呼び出しをやめる時が来たことを示すgenerator
関数を使用することです。True
next()
def CardsAssignment():
global Cards # Declare since it's not a local variable and is assigned.
while True:
Cards += 1
print(Cards)
yield not time_to_quit
Cards = 0
time_to_quit = False
cr = CardsAssignment() # Get generator iterator object.
next(cr) # Prime it.
while next(cr):
if Cards == 4:
time_to_quit = True # Allow one more iteration.
(続行する)または(停止する)にCardsAssignment
戻ってから、True
False
if not CardsAssignment():
break
または実際に単にループする
while CardsAssignment():
for
の代わりにループを使用すると、 ingwhile
によってループを早期に中断させることができます。これは、ループが終了する通常の合図であり、例外として、必要なだけ深く関数内にネストすることができ、外側に伝播します。捕まるまで。これは、何かを繰り返し処理する必要があることを意味します。そのため、おそらく関数をジェネレーターに変更する必要があります。raise
StopIteration
for
def cards_assignment():
cards += 1
yield cards
for card in cards_assignment():
print(card)
、この場合、実行する代わりに、ジェネレーターからraise StopIteration
だけでループが終了します。return
ただし、これ (およびループ条件でテストするフラグを関数が返すオプション) は、使用とは微妙に異なることに注意してください。ループで句break
を使用する場合、ジェネレーターからの ing はそれをトリガーしますが、ループ本体はしません。else
return
break
def CardsAssignment():
Cards+=1
print (Cards)
if (break_it):
return False
else:
return True
while CardsAssignment():
pass
次のようにリファクタリングしたくなるでしょう。
def somefunc():
from random import randint
while True:
r = randint(1, 100)
if r != 42:
yield r
そして、次のようなことができます。
for cnt, something in enumerate(somefunc(), start=1):
print 'Loop {} is {}'.format(cnt, something)
somefunc()
これにより、 「do I break」フラグとして使用する代わりに、意味のある値を返すことができます。
これにより、次の構成も可能になります。
sf = somefunc()
for something in sf:
if some_condition(something):
break
# other bits of program
for something in sf: # resume...
pass