Maison > développement back-end > Tutoriel Python > Introduction détaillée à else en Python

Introduction détaillée à else en Python

高洛峰
Libérer: 2017-03-04 16:05:28
original
2271 Les gens l'ont consulté

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]
Copier après la connexion

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]
Copier après la connexion

.

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!
Copier après la connexion

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)
Copier après la connexion


result = 2.5
pide finished!
********************
pision by 0!
pide finished!
Copier après la connexion
Copier après la connexion

Bien sûr, vous pouvez également utiliser des variables d'état pour remplacer else :

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)
Copier après la connexion


result = 2.5
pide finished!
********************
pision by 0!
pide finished!
Copier après la connexion
Copier après la connexion

Résumé

Certaines personnes pensent que ces utilisations de else sont contre-intuitives ou implicites plutôt qu'explicites, et ne valent pas la peine d'être promues. Mais je pense que ce "jugement" dépend du scénario d'application spécifique et de notre compréhension de Python. Il ne doit pas nécessairement s'agir d'une syntaxe conviviale pour les nouveaux arrivants pour être explicite. Bien sûr, il n'est pas recommandé d'utiliser cette syntaxe partout. Le plus gros inconvénient de for/while...else est que else doit être aligné avec for/file. C'est très inconfortable s'il y a plusieurs niveaux d'imbrication ou de boucle. le corps est trop long. Il convient d'utiliser autre chose (rappelez-vous simplement l'histoire du pied à coulisse :P). Seulement dans certaines instructions de contrôle de boucle courte, nous utilisons else pour nous débarrasser de certaines variables d'état encombrantes. C'est le scénario d'application le plus pythonique !

Pour une introduction plus détaillée à else en Python et des articles connexes, veuillez faire attention au site Web PHP chinois !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal