2017-01-06 1 views
0

Ma question concerne le code d'exécution court. Dites, étant donné un code qui doit retourner Vrai ou faux, et deux codes sont les suivants:Pour un code d'exécution court, mieux vaut sortir tôt ou avoir un code plus court?

 **Type 1:** 
    bool = False 
    for item in items: 
     if item (condition1): 
      if item (condition2): 
       bool = True 
      else: 
       bool = False 
    return bool 



    **Type 2:** 
    bool = False 
    for item in items: 
     if item (condition1): 
      if item (condition2): 
       bool = True 
      else: 
       bool = False 
       break 
     else: 
      bool = False 
      break 
    return bool 

Si les deux codes sont similaires à l'exécution, dont le code est considéré comme « meilleur » ou « plus standard »? Le premier fait naturellement le même travail que le second, mais itère sur l'ensemble des 'objets' de l'objet. La seconde quitte la boucle dès qu'une condition n'est pas remplie, et effectue donc le même travail dans plus de lignes de code mais moins d'étapes complétées par l'ordinateur. Ceci est un exemple simple, mais je demande également des codes plus complexes où la question est toujours la même: "Est-ce que je laisse le processus finir en boucle ou est-ce que je casse des boucles (éventuellement multiples)?"

+0

Aucune des deux versions ne semble correcte. – user2357112

+0

@ user2357112 J'ai deux codes exactement dans ce format que les deux travaillent ... ce ne sont que des squelettes –

+0

Eh bien, entre autres problèmes, la première version 'return's immédiatement à la première itération. Il est également douteux que vous initialisiez 'bool = False' pour ce qui ressemble plus à un contrôle" tout "qu'à un contrôle" tout ". C'est généralement la mauvaise chose à faire. – user2357112

Répondre

1

La sortie est toujours meilleure - vous gagnez du temps et évitez les itérations inutiles.

Toutefois, vous pouvez ajouter return à la fin de la fonction - pour vous assurer qu'il renvoie la valeur falsy (ou truthy) lorsqu'il se termine, et renvoie uniquement lorsqu'une condition est remplie - sinon vous retourneriez la valeur à la première itération, comme l'exemple numéro 1.

Vous devriez également éviter d'utiliser else s où ils n'ajoutent aucune valeur - ils ne sont pas obligatoires, juste là pour vous aider. En outre, les conditions de groupe si vous n'avez pas d'autre branchement - vous n'avez pas besoin de trop compliquer les conditions qui doivent être remplies ensemble.

Voici comment j'aller avec cette tâche:

def foo (items): 
    for item in items: 
     if not item (condition1) or not item (condition2): 
      return False 
    return True 
+0

Notez comment votre code s'arrête sur un 'True', alors que le type de question 2 s'arrête sur un' False'. Cela peut ou peut ne pas être le comportement correct; Je ne ferais confiance à aucun code de la question pour être correct. – user2357112

+0

@ user2357112 On ne sait pas très bien ce que OP voulait dire, donc j'ai juste fait un exemple générique comme le sien. mais fixé de toute façon, merci – Uriel

0

Une façon de penser est de peser ce qui est plus important pour un projet particulier: le temps du développeur, ou le temps de l'ordinateur?

Le second choix est (légèrement) plus compliqué à écrire, légèrement plus compliqué à raisonner, et potentiellement plus difficile à déboguer. Vous ne voulez probablement que le faire si vous en avez besoin. Ma règle générale consiste à écrire le code le plus simplement possible (ce qui minimise le temps de développement et réduit le nombre de bogues). Si le code est trop lent, alors je regarde les moyens de changer le code pour améliorer les performances.

2

Votre code peut être condensé à un simple appel all, qui court-circuite (similaire à la version avec break):

return items and all(condition1 and condition2 for item in items) 

Le premier items assure que le itérables n'est pas vide, comme, selon à votre code, un iterable vide renverrait False.