Nous savons tous que l'utilisation de base de else en Python est if...elif...else... dans les instructions de contrôle conditionnel, mais else a deux autres utilisations, l'une pour la fin d'une boucle, l'autre est utilisé dans la gestion des erreurs try. Il s’agissait à l’origine de la syntaxe standard de Python, mais comme elle est différente des habitudes de la plupart des autres langages de programmation, les utilisateurs ont ignoré ces utilisations, intentionnellement ou non. De plus, il existe de nombreuses controverses quant à savoir si ces utilisations sont cohérentes avec les principes de 0×00 The Zen of Python et si elles devraient être largement utilisées. Par exemple, dans les deux livres que j'ai vus (Effective Python VS Write Idiomatic Python), les deux auteurs avaient des attitudes complètement différentes à son égard.
Le else dans la boucle
L'instruction else qui suit la boucle ne sera exécutée que lorsqu'il n'y a pas de rupture dans la boucle, c'est-à-dire lorsque la boucle normale est terminée. Tout d'abord, regardons un exemple de tri par insertion :
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]
Dans cet exemple, les éléments _sorted triés sont comparés à i un par un, si je est supérieur à tous les éléments de la liste triée, il ne peut être placé qu'à la fin de la liste triée. À ce stade, nous avons besoin d'une variable d'état supplémentaire insérée pour marquer si la boucle de parcours est terminée ou interrompue à mi-chemin. Dans ce cas, nous pouvons remplacer cette variable d'état par else :
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]
.
Je pense que c'est une approche vraiment cool ! Cependant, il convient de noter qu'en plus, break peut déclencher l'instruction else suivante, lorsqu'il n'y a pas de boucle :
while False: print("Will never print!") else: print("Loop failed!") Loop failed!
else<🎜 en erreur capture >
try...sauf...else...finalement la syntaxe de contrôle de flux est utilisée pour intercepter les exceptions possibles et les gérer en conséquence, où except est utilisé pour intercepter les erreurs qui se produisent dans les instructions try et else est utilisé pour ; Gère la situation dans laquelle aucune erreur ne se produit ; est enfin responsable du "suivi" de l'instruction try et sera exécuté de toute façon. Cela peut être démontré à travers un exemple simple :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!
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!