Débutant: Pourquoi les opérations ne sont-elles pas contenues dans les commandes de sortie?

23

Je passe par un livre de programmation d'introduction et il répertorie un exemple simple en pseudocode:

Start
  input myNumber
  set myAnswer = myNumber * 2
  output myAnswer
Stop

Pourquoi ne pouvons-nous pas omettre de créer une autre variable appelée myAnsweret simplement mettre l'opération dans la commande de sortie, comme ceci:

Start
  input myNumber
  output myNumber * 2
Stop

Pourquoi la première est correcte et la seconde non?

user1475207
la source
39
Le livre dit-il que vous ne pouvez pas?
Tulains Córdova
2
Le livre ne dit pas que je ne peux pas; il n'en dit rien.
user1475207
5
Je pense qu'il est tout à fait raisonnable de commencer avec le deuxième bloc le plus court, puis de le convertir en premier si vous en avez besoin.
Mateen Ulhaq
13
Réponse courte: vous le pouvez, l'auteur ne fait que cela (dans une tentative) pour le rendre plus clair (même si honnêtement, cela ne le rend probablement pas du tout plus clair ...).
Jules
1
Les deux méthodes fonctionnent. Avec plus d'expérience, vous constaterez que pour une codification sérieuse, la lisibilité est beaucoup plus importante que la simplicité ou l'originalité du code. Votre code devrait être facilement lisible par de nombreuses autres personnes qui le maintiennent.
Frantisek Kossuth

Réponses:

36

Vous pouvez, mais l'autre est si vous voyez ce qui se passe et que vous pouvez utiliser myAnswerplus tard dans le programme. Si vous utilisez votre deuxième, vous ne pouvez pas réutiliser myAnswer.

Donc plus tard dans le programme, vous voudrez peut-être:

myAnswer + 5
myAnswer + 1
etc.

Vous pouvez avoir différentes opérations pour lesquelles vous souhaitez l'utiliser.

Pensez à échanger des numéros:

Start
  input myNumber
  set myAnswerA = myNumber * 2
  output myAnswerA
  set myAnswerB = myNumber * 3
  output myAnswerB
  set temp = myAnswerA
  set myAnswerA = myAnswerB
  set myAnswerA = temp
  output myAnswerA
  output myAnswerB
Stop

Ce serait difficile sans variables. Les livres informatiques commencent vraiment basiques, et la plupart des programmes sont faciles jusqu'à ce que vous voyiez de la complexité. La plupart des choses sont triviales dans les didacticiels, et ce n'est que dans la complexité que vous voyez où les choses ont ou n'ont pas de sens.

johnny
la source
1
C'est donc une logique valide mais ce n'est pas la meilleure pratique car cela ne me permet pas de réutiliser l'opération dans d'autres parties du programme?
user1475207
@ user1475207 Voir ma modification. Dans ce petit programme, cela n'a pas d'importance. L'auteur sait que vous ferez bien plus que de sortir la valeur plus tard. Ce n'est que dans la complexité que vous pouvez voir cela. Restez avec lui.
johnny
ah ok, je vois. Je vais continuer à parcourir le livre dans cet esprit. Merci.
user1475207
29
@ user1475207 Les deux façons ont leur place. Parfois, vous devrez peut-être utiliser la variable supplémentaire. Parfois, il se peut que vous n'ayez pas besoin de la variable supplémentaire, mais que vous souhaitiez quand même l'utiliser parce que dans certaines situations, le simple fait de donner un nom bien pensé le rend beaucoup plus clair. Parfois, vous ne voulez pas utiliser la variable supplémentaire, car cela ne fait qu'ajouter du bruit. Et plusieurs fois, la différence n'a pas vraiment d'importance.
8bittree
3
Je pense qu'il est valable de retourner le résultat d'une opération sans l'affecter à une variable au préalable. Mais j'ai pris l'habitude de créer une resultvariable même pour des fonctions courtes, pour que le débogage par ajout print(result)soit vraiment rapide. C'est plus par commodité que par les bonnes pratiques.
Jambe droite
33

Une autre raison, l'affectation set myAnswer = myNumber * 2donne un nom à la valeur résultante . Une personne qui lit la version à deux lignes de votre code sait seulement qu'il imprime la valeur de myNumber * 2. Une personne lisant la version à trois lignes peut voir que myNumber * 2c'est la réponse .

Il peut ne pas sembler important dans un tel exemple trivial, mais parfois, l' attribution d' une valeur de résultat à une variable avec un nom significatif peut le rendre beaucoup plus facile pour les autres programmeurs de lire et de comprendre votre code.

Solomon Slow
la source
10
+1, bien que cela ne s'applique que lorsque le nom a un sens. L'utilisation de variables temporaires comme celle-ci nommée i, resultou d'un autre identifiant vide de sens ne fait rien pour améliorer la clarté, et ne fait qu'encombrer le code
Alexander - Reinstate Monica
7
@Alexander: Les noms sans signification peuvent toujours avoir un sens. ivaut mieux être un index de tableau. S'il y a un result, la fonction doit se terminer par return resultou l'équivalent moral. Et ainsi de suite ...
Kevin
6
@Kevin "Les noms dénués de sens peuvent toujours avoir un sens" euhhh ... tu es sûr? lol
Alexander - Reinstate Monica
3
@Kevin Si vous allez return result, alors vous pouvez aussi bien vous contenter de retourner tout ce que vous assigniez au résultat. Nous pouvons voir que c'est un résultat. Vous le retournez, nous l'obtenons.
Alexander - Reinstate Monica
5
@Alexander: Évidemment, vous pouvez incorporer le retour s'il s'agit d'une expression simple, mais que faire si vous avez besoin de le construire sur plusieurs instructions? L'utilisation d'un schéma de dénomination cohérent indique clairement ce que vous faites dans ces cas.
Kevin
14

C'est du pseudocode. Il n'est pas supposé être un langage implémenté particulier.

Certains langages de programmation ne prennent pas en charge l'évaluation d'une expression, puis la sortie du résultat dans la même ligne de code. Par exemple, la plupart des assembleurs ne prennent pas en charge cela. Peut-être que l'auteur du livre voulait montrer les choses de façon modeste.

Tulains Córdova
la source
2
Et certaines langues (par exemple C) autorisent les deux en même temps - vous pouvez écrire des choses comme "sortie (réponse = réponse * 2)" si vous le voulez vraiment! (mais attention à "output (answer == answer * 2)" signifie quelque chose de très différent ...
alephzero
9

D'autres réponses ont abordé les détails mécaniques spécifiques et des exemples de cas où l'une ou l'autre forme serait meilleure, mais je veux mentionner un peu plus de contexte, en quelque sorte philosophique:

Vous apprenez une langue.

Une langue est quelque chose dans laquelle les idées peuvent être exprimées et comprises (communiquées). Un langage de programmation informatique a la propriété supplémentaire de pouvoir être analysé mécaniquement par une machine conçue pour agir (exécuter) sur la base d'idées (décisions) qui sont spécifiées et alimentées en utilisant ce langage.

Dans N'IMPORTE QUELLE langue qui est utile, il y a plus d'une façon d'exprimer presque n'importe quelle idée exprimable dans cette langue.


Considérez la grande variété de nuances disponibles dans la langue anglaise. Même une simple phrase, comme

Le chat sauta sur la boîte.

peut être varié pour exprimer des idées légèrement différentes ou mettre l'accent sur différentes parties de la scène tout en se référant à la même action physique exacte de l'univers.

Il y a d'abord les variations grammaticales:

Le chat a sauté sur la boîte.

Sur la boîte sauta le chat.

Viennent ensuite des variations de plus en plus larges, faisant toujours référence à la même action physique:

La boîte a tremblé sous l'impact du chat.

Le chat est descendu avec un bruit sourd sur le dessus de la boîte.

Le félin sauta légèrement en l'air et atterrit proprement sur une boîte voisine.

Il suffit de regarder les implications du mot "à proximité" dans cette dernière phrase. Son inclusion véhicule une toute nouvelle gamme de concepts qui ne sont pas autrement présents.


Il y a toujours plus d'une façon de le faire, Python Zen au contraire.


Bien sûr, il y aura UNE manière qui exprime parfaitement votre intention et est la plus appropriée, tout comme vous ne choisiriez qu'une seule des phrases anglaises ci-dessus en fonction de ce que vous souhaitez communiquer. C'est à cela que sert le Zen of Python.

Mais dans un cours de programmation d'introduction ou un cours d'introduction à l'anglais, vous devez d'abord apprendre les différentes façons (libellés, extraits de code) par lesquels vous pouvez formuler une idée avant de développer le jugement pour choisir celui qui convient le mieux.

Caractère générique
la source
3
Bien sûr, Python enfreint sa propre règle. Vous avez des lambdas et des fonctions imbriquées; boucles, listes de compréhension et expressions de générateur; flotteurs, décimales et fractions; et __init__et __new__, pour n'en nommer que quelques-uns. Le fait est que chacun est approprié à un problème subtilement différent. Vous ne choisiriez pas une de ces phrases anglaises au hasard, ni ne choisiriez l'une de ces fonctionnalités du langage Python au hasard.
Kevin
1
@Kevin, oui, d'accord. Le fait est que pour quelqu'un qui est totalement novice en programmation, l'exactitude de la syntaxe requise peut donner l'impression qu'il n'y a qu'une seule façon de faire quoi que ce soit, c'est-à-dire copier le code exact du didacticiel mot pour mot, semblable à la façon dont les problèmes mathématiques au collège (573 x 247) n'ont qu'une seule bonne réponse. Voir aussi des questions comme "Quel est le programme pour réduire les fichiers?" Si vous lisez ma réponse, je ne dis pas de faire quoi que ce soit au hasard; Je dis que vous êtes toujours faire des choix lors de la programmation.
Wildcard
1
C'est certainement juste. Je pense que le problème est que vous simplifiez / déformez un peu le Zen de Python. Le fait est que ces décisions sont finalement dictées par les contours de votre problème, et non par des choix que vous pouvez faire librement. Vous devrez peut-être passer par beaucoup d'itérations et de refactorisation pour trouver la seule façon de le faire, celle qui correspond parfaitement à vos besoins, qui est lisible, concise, voire élégante. Mais pour tout problème donné, il devrait y avoir une telle solution idéale, et un langage bien conçu vous guidera doucement vers celui-ci. Voilà ce que signifie le Zen.
Kevin
4
Un cynique pourrait dire 'En Python, il n'y a qu'une seule façon de le faire, mais chaque nouvelle version de Python applique la fonction "et maintenant pour quelque chose de complètement différent" à la façon dont la version précédente le faisait';)
alephzero
3
citation de PEP20: "Il devrait y avoir une - et de préférence une seule - façon évidente de le faire.
vaxquis
5

Vous ne demandez que la myAnswervariable qui semble redondante. D'autres réponses expliquaient déjà pourquoi et quand il serait logique de l'omettre ou de l'utiliser, mais en voici une autre: qu'en est-il?

Start
  output input * 2
Stop

ou même ça

Start output input * 2 Stop

Dans la plupart des langues, cela fonctionnerait toujours, mais pouvez-vous le lire? C'est difficile, donc nous utilisons souvent des variables d' aide car les ordinateurs ne sont pas les seuls à lire le code. Nous devons le maintenir et le comprendre en quelques mois et il est encore plus difficile d'écrire du code que vous pouvez encore comprendre plus tard que celui qui fonctionne ... généralement après seulement quelques jours, vous ne saurez pas pourquoi vous avez fait quelque chose d'une manière spécifique .

t3chb0t
la source
2
... ou même juste (*2). Je objecterais cependant que l'exécution d'une entrée ne peut pas nécessairement être exprimée en toute sécurité comme simplement accéder à une variable / effectuer une opération arithmétique: elle peut avoir des effets secondaires observables.
leftaroundabout
2

Vous pouvez faire les deux variantes (dans ce cas simple), mais la première variante devient plus lisible et structurée pour les cas plus complexes. La première variante montre le modèle IPO avec une ligne pour chaque étape (deux de ceux déjà avec le bon nom):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
Raidri soutient Monica
la source