Dive into python 3 Loop abbruch

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Liebes Forum, ich lese das Kapitel zu "Closures & Generators" in Dive into Python 3. Das folgende Beispiel ist von dort:

Code: Alles auswählen

#!/usr/local/bin/python3

import re


def match_sxz(noun):
    return re.search('[sxz]$', noun)
    
def apply_sxz(noun):
    return re.sub('$', 'es', noun)
    
def match_h(noun):
    # 'fish' would match, 'match' would match.
    return re.search('[^aeioudgkprt]h$', noun)
    
def apply_h(noun):
    return re.sub('$', 'es', noun)
    
def match_y(noun):
    return re.search('[^aeiou]y$', noun)
    
def apply_y(noun):
    return re.sub('y$', 'ies', noun)
    
def match_default(noun):
    return True
    
def apply_default(noun):
    return noun + 's'
    
# Rules data structure.
rules = ((match_sxz, apply_sxz),
         (match_y, apply_y),
         (match_h, apply_h),
         (match_default, apply_default)
        )
        
def plural(noun):
    for matches_rule, apply_rule in rules:
        print("Checking:", matches_rule)
        if matches_rule(noun):
            return apply_rule(noun)
            
print(plural("vacancy"))
Was ich nicht verstehe ist, wieso der for-loop der plural() Funktion unterbrochen wird, nachdem eine Regel gefunden wurde die passt. Also im Sinne von

Code: Alles auswählen

>>> a=4
4
>>> for i in range(10):
...     print a==i
... 
False
False
False
False
True
False
False
False
False
False
>>> 
Hier setzt der Loop ja auch fort.. Ist nicht ganz das gleiche, aber so was hätte ich erwartet.
Stattdessen

Code: Alles auswählen

Checking: <function match_sxz at 0x61bdb0>
Checking: <function match_y at 0x633150>
vacancies
[url=http://www.proandkon.com]proandkon.com[/url]
deets

Weil return immer aus einer Funktion herausspringt in die aufrufende Ebene. Dein Code kann das natuerlich nicht, weil du gar keinen Aufruf hast.

Alternativ kann man auch noch break nehmen, um Schleifen zu verlassen, aber dann mit dem Block danach weiter zu machen.

Code: Alles auswählen

def test():
      for i in xrange(10):
           print i == 4
           if i == 4: return

for i in xrange(10):
      print i
      if i == 4: break

mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

aha, ja stimmt. Bisschen den Wald nicht mehr gesehen... Danke.
[url=http://www.proandkon.com]proandkon.com[/url]
Antworten