Heim >Backend-Entwicklung >Python-Tutorial >Detaillierte Einführung in else in Python
Wir alle wissen, dass die grundlegende Verwendung von else in Python if...elif...else... in bedingten Steueranweisungen ist, aber else hat zwei weitere Verwendungszwecke, eine für das Ende einer Schleife und die andere wird bei der Fehlerbehandlung try verwendet. Dies war ursprünglich die Standardsyntax von Python, aber da sie sich von den Gewohnheiten der meisten anderen Programmiersprachen unterscheidet, haben die Leute diese Verwendungen absichtlich oder unabsichtlich ignoriert. Darüber hinaus gibt es viele Kontroversen darüber, ob diese Verwendungen mit den Prinzipien von 0×00 The Zen of Python vereinbar sind und ob sie weit verbreitet sein sollten. Beispielsweise hatten die beiden Autoren in den beiden Büchern, die ich gesehen habe (Effective Python VS Write Idiomatic Python), völlig unterschiedliche Einstellungen dazu.
Die else-Anweisung in der Schleife
Die else-Anweisung nach der Schleife wird nur ausgeführt, wenn die Schleife nicht unterbrochen ist, d. h. wenn die normale Schleife abgeschlossen ist. Schauen wir uns zunächst ein Beispiel für die Einfügungssortierung an:
from random import randrange def insertion_sort(seq): if len(seq) 1: return seq _sorted = seq[:1] for i in seq[1:]: inserted = False for j in range(len(_sorted)): if i _sorted[j]: _sorted = [*_sorted[:j], i, *_sorted[j:]] inserted = True break if not inserted: _sorted.append(i) return _sorted print(insertion_sort([randrange(1, 100) for i in range(10)])) [8, 12, 12, 34, 38, 68, 72, 78, 84, 90]
In diesem Beispiel werden die sortierten _sorted-Elemente nacheinander mit i verglichen. Wenn i größer als alle Elemente in der sortierten Liste ist, kann es nur am Ende der sortierten Liste platziert werden. Zu diesem Zeitpunkt müssen wir eine zusätzliche Statusvariable einfügen, um zu markieren, ob die Durchlaufschleife abgeschlossen ist oder auf halbem Weg unterbrochen wird. In diesem Fall können wir diese Statusvariable durch else ersetzen:
def insertion_sort(seq): if len(seq) 1: return seq _sorted = seq[:1] for i in seq[1:]: for j in range(len(_sorted)): if i _sorted[j]: _sorted = [*_sorted[:j], i, *_sorted[j:]] break else: _sorted.append(i) return _sorted print(insertion_sort([randrange(1, 100) for i in range(10)])) [1, 10, 27, 32, 32, 43, 50, 55, 80, 94]
Ich finde, das ist ein wirklich cooler Ansatz! Es ist jedoch zu beachten, dass zusätzlich zu break die nachfolgende else-Anweisung ausgelöst werden kann, wenn keine Schleife vorhanden ist:
while False: print("Will never print!") else: print("Loop failed!") Loop failed!
else
try...exclusive...else...finally Flusskontrollsyntax wird verwendet, um mögliche Ausnahmen abzufangen und entsprechend zu behandeln, wobei excel zum Abfangen von Fehlern verwendet wird, die in try-Anweisungen auftreten, und else dazu verwendet wird Behandeln Sie die Situation, in der kein Fehler auftritt. Schließlich ist er für die „Nachsorge“ der try-Anweisung verantwortlich und wird trotzdem ausgeführt. Dies kann anhand eines einfachen Beispiels demonstriert werden:def pide(x, y): try: result = x / y except ZeropisionError: print("pision by 0!") else: print("result = {}".format(result)) finally: print("pide finished!") pide(5,2) print("*"*20) pide(5,0)
result = 2.5 pide finished! ******************** pision by 0! pide finished!Natürlich können Sie Zustandsvariablen auch verwenden, um else zu ersetzen:
def pide(x, y): result = None try: result = x / y except ZeropisionError: print("pision by 0!") if result is not None: print("result = {}".format(result)) print("pide finished!") pide(5,2) print("*"*20) pide(5,0)
result = 2.5 pide finished! ******************** pision by 0! pide finished!ZusammenfassungManche Leute denken, dass diese Verwendung von else eher kontraintuitiv oder implizit als explizit ist und es nicht wert ist, gefördert zu werden. Ich denke jedoch, dass dieses „Urteil“ vom jeweiligen Anwendungsszenario und unserem Verständnis von Python abhängt. Es muss nicht unbedingt eine einsteigerfreundliche Syntax sein, um explizit zu sein. Natürlich wird nicht empfohlen, diese Syntax überall zu verwenden. Der größte Nachteil von for/while...else besteht darin, dass else mit for/file abgeglichen werden muss. Es ist sehr unangenehm, wenn es mehrere Verschachtelungsebenen oder eine Schleife gibt Der Körper ist zu lang. Er eignet sich für eine andere Verwendung (erinnern Sie sich nur an die Geschichte des Messschiebers :P). Nur in einigen kurzen Schleifensteuerungsanweisungen verwenden wir else, um einige umständliche Zustandsvariablen zu entfernen. Dies ist das pythonischste Anwendungsszenario! Eine ausführlichere Einführung in else in Python und verwandte Artikel finden Sie auf der chinesischen PHP-Website!