0
def CardsAssignment():
      Cards+=1
      print (Cards)
      return break      

while True:
      CardsAssignment()

はい、できないことはわかっていreturn breakます。しかし、def 関数で while ループを破るにはどうすればよいでしょうか。それとも私の概念が間違っていますか?

4

7 に答える 7

9

いいえ、できません。次のようにします。

def CardsAssignment():
  Cards+=1
  print (Cards)
  if want_to_break_while_loop:
    return False      
  else:
    return True

while True:
  if not CardsAssignment():
    break
于 2012-07-29T12:50:06.600 に答える
5

これを行う非常に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関数を使用することです。Truenext()

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.
于 2012-07-29T15:23:37.410 に答える
4

(続行する)または(停止する)にCardsAssignment戻ってから、TrueFalse

if not CardsAssignment():
    break

または実際に単にループする

while CardsAssignment():
于 2012-07-29T12:51:49.160 に答える
3

forの代わりにループを使用すると、 ingwhileによってループを早期に中断させることができます。これは、ループが終了する通常の合図であり、例外として、必要なだけ深く関数内にネストすることができ、外側に伝播します。捕まるまで。これは、何かを繰り返し処理する必要があることを意味します。そのため、おそらく関数をジェネレーターに変更する必要があります。raiseStopIterationfor

def cards_assignment():
     cards += 1
     yield cards

for card in cards_assignment():
    print(card)

、この場合、実行する代わりに、ジェネレーターからraise StopIterationだけでループが終了します。returnただし、これ (およびループ条件でテストするフラグを関数が返すオプション) は、使用とは微妙に異なることに注意してください。ループで句breakを使用する場合、ジェネレーターからの ing はそれをトリガーしますが、ループ本体はしません。elsereturnbreak

于 2012-07-29T14:31:35.933 に答える
0
def CardsAssignment():
      Cards+=1
      print (Cards)
      if (break_it):
          return False      
      else:
          return True      

while CardsAssignment():
    pass
于 2012-07-29T12:52:54.217 に答える
0

次のようにリファクタリングしたくなるでしょう。

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
于 2012-07-29T13:09:04.067 に答える