Principiante: perché le operazioni non sono contenute nei comandi di output?


23

Sto esaminando un libro di programmazione introduttiva che elenca un semplice esempio in pseudocodice:

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

Perché non possiamo omettere di creare un'altra variabile chiamata myAnswere semplicemente inserire l'operazione nel comando di output, in questo modo:

Start
  input myNumber
  output myNumber * 2
Stop

Perché il primo è corretto e il secondo no?


39
Il libro dice che non puoi?
Tulains Córdova,

2
Il libro non dice che non posso; non dice nulla al riguardo.
user1475207,

5
Penso che sia abbastanza ragionevole iniziare con il secondo blocco più corto, quindi convertirlo nel primo se ne hai bisogno.
Mateen Ulhaq,

13
Risposta breve: puoi, l'autore sta solo facendo questo (nel tentativo di renderlo più chiaro (anche se onestamente, probabilmente non lo rende affatto più chiaro ...).
Jules,

1
Entrambe le modalità funzionano. Con più esperienza scoprirai che per una seria codifica la leggibilità è molto più importante della semplicità o dell'originalità del codice. Il tuo codice dovrebbe essere facilmente leggibile da molti altri che lo mantengono.
Frantisek Kossuth,

Risposte:


36

Potresti ma l'altro è così puoi vedere cosa sta succedendo e quindi puoi usarlo myAnswerpiù avanti nel programma. Se usi il secondo, non puoi riutilizzarlo myAnswer.

Quindi più avanti nel programma potresti voler:

myAnswer + 5
myAnswer + 1
etc.

Potresti avere diverse operazioni per cui vuoi usarlo.

Prendi in considerazione lo scambio di numeri:

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

Sarebbe difficile senza variabili. I libri di computer iniziano davvero di base e la maggior parte della programmazione è facile fino a quando non si vede la complessità. Quasi tutto è banale nei tutorial, ed è solo nella complessità vedi dove le cose fanno o non hanno senso.


1
Quindi è una logica valida ma non è la migliore pratica perché non mi consente di riutilizzare l'operazione in altre parti del programma?
user1475207

@ user1475207 Vedi la mia modifica. In questo piccolo programma non importa. L'autore sa che farai molto di più che presentare il valore in seguito. È solo nella complessità che puoi vedere questo. Insisti.
johnny,

ah ok, capisco. Continuerò attraverso il libro con questo in mente. Grazie.
user1475207

29
@ user1475207 Entrambi i modi hanno il loro posto. A volte potrebbe essere necessario utilizzare la variabile aggiuntiva. A volte potresti non aver bisogno della variabile extra ma vuoi usarla comunque perché in alcune situazioni, dare a qualcosa un nome ben congegnato rende molto più chiaro. A volte non si desidera utilizzare la variabile aggiuntiva perché è solo un rumore aggiunto. E molte volte, la differenza non ha molta importanza.
8bittree,

3
Penso che sia valido restituire il risultato di un'operazione senza assegnarlo in anticipo a una variabile. Ma ho preso l'abitudine di creare una resultvariabile anche per funzioni brevi, in modo che il debug con l'aggiunta print(result)sia molto veloce. Tuttavia, è più per convenienza che per buona pratica.
Gamba destra,

33

Un'altra ragione, l'assegnazione set myAnswer = myNumber * 2dà un nome al valore risultante . Una persona che legge la versione a due righe del codice sa solo che stampa il valore di myNumber * 2. Una persona che legge la versione a tre righe può vedere che myNumber * 2è la risposta .

Potrebbe non sembrare importante in un esempio così banale, ma a volte assegnare un valore di risultato a una variabile con un nome significativo può rendere molto più facile agli altri programmatori la lettura e la comprensione del codice.


10
+1, anche se questo vale solo quando il nome è significativo. L'utilizzo di variabili temporanee come questo chiamato i, resulto di qualche altro identificatore insignificante non fa nulla per migliorare la chiarezza e ingombra solo il codice
Alexander - Reinstate Monica,

7
@Alexander: i nomi senza significato possono ancora essere significativi. isarebbe meglio essere un indice di array. Se c'è un result, la funzione dovrebbe finire con return resulto l'equivalente morale. E così via ...
Kevin,

6
@Kevin "I nomi senza significato possono ancora essere significativi" uhhh ... sei sicuro? lol
Alexander - Ripristina Monica l'

3
@Kevin Se hai intenzione di farlo return result, allora puoi anche in linea per restituire qualsiasi cosa tu stia assegnando al risultato. Possiamo vedere che è un risultato. Lo stai restituendo, lo capiamo.
Alexander - Ripristina Monica l'

5
@Alexander: Ovviamente puoi includere il ritorno se si tratta di un'espressione semplice, ma cosa succede se è necessario crearlo su più istruzioni? L'uso di uno schema di denominazione coerente chiarisce cosa stai facendo in questi casi.
Kevin,

14

Questo è pseudocodice. Non si suppone che sia un linguaggio implementato in particolare.

Alcuni linguaggi di programmazione non supportano la valutazione di un'espressione e quindi l'output del risultato nella stessa riga di codice. Ad esempio la maggior parte degli assemblatori non lo supporta. Forse l'autore del libro ha voluto mostrare le cose in un modo di basso livello.


2
E alcune lingue (ad esempio C) consentono entrambe allo stesso tempo - puoi scrivere cose come "output (answer = answer * 2)" se vuoi davvero! (ma attenzione a "output (answer == answer * 2)" significa qualcosa di molto diverso ...
alephzero,

9

Altre risposte hanno affrontato i dettagli meccanici specifici e gli esempi di quando l'una o l'altra forma sarebbe migliore, ma voglio menzionare un po 'più di fondo, una sorta di filosofico:

Stai imparando una lingua.

Una lingua è qualcosa in cui le idee possono essere espresse e comprese (comunicate). Un linguaggio di programmazione per computer ha la proprietà aggiuntiva di poter essere analizzato meccanicamente da una macchina progettata per agire (eseguire) sulla base di idee (decisioni) che sono specificate e alimentate usando quel linguaggio.

In QUALSIASI linguaggio utile, esiste più di un modo per esprimere quasi ogni idea esprimibile in quel linguaggio.


Considera l'ampia varietà di sfumature disponibili in lingua inglese. Anche una frase semplice, come ad esempio

Il gatto saltò sulla scatola.

può essere variato per esprimere idee leggermente diverse o porre enfasi su diverse parti della scena facendo riferimento alla stessa azione esatta dell'universo fisico.

Innanzitutto sono le variazioni grammaticali:

La scatola fu saltata sopra dal gatto.

Sulla scatola saltò il gatto.

Quindi ci sono variazioni sempre più ampie, facendo ancora riferimento alla stessa azione fisica:

La scatola tremò sotto l'impatto del gatto.

Il gatto scese con un tonfo sulla cima della scatola.

Il felino balzò leggermente in aria e atterrò ordinatamente su una scatola vicina.

Guarda le implicazioni della parola "vicino" in quest'ultima frase. La sua inclusione trasmette una gamma completamente nuova di concetti non altrimenti presenti.


C'è sempre più di un modo per farlo, Python Zen al contrario.


Naturalmente, ci sarà UN SOLO modo che esprime perfettamente la tua intenzione ed è più adatto, proprio come sceglieresti UNA SOLO delle frasi inglesi sopra a seconda di ciò che desideri comunicare. Questo è lo Zen di Python.

Ma in un corso introduttivo di programmazione o in un corso introduttivo di inglese, devi prima imparare i vari modi (formulazioni, frammenti di codice) in cui puoi esprimere un'idea prima di sviluppare il giudizio per scegliere quello che si adatta perfettamente.


3
Naturalmente, Python infrange la propria regola. Hai lambda e funzioni nidificate; loop, comprensione dell'elenco ed espressioni generatrici; galleggianti, decimali e frazioni; e __init__e __new__, solo per citarne alcuni. Il punto è che ognuno è appropriato per un problema leggermente diverso. Non sceglieresti una di quelle frasi inglesi a caso, né sceglieresti una di queste funzionalità del linguaggio Python a caso.
Kevin,

1
@ Kevin, sì, d'accordo. Il punto è che per una persona totalmente nuova alla programmazione, l'esattezza della sintassi richiesta può far sembrare che ci sia un solo modo in cui tutto può essere realizzato, ovvero copiare il codice esatto dal tutorial alla lettera, simile a come i problemi di matematica della scuola media (573 x 247) hanno solo una risposta giusta. Vedi anche domande come "Qual è il programma per ridurre i file?" Se leggi la mia risposta, non sto dicendo di fare nulla a caso; Sto dicendo che si sta sempre facendo scelte quando si programma.
Wildcard l'

1
Questo è certamente giusto. Penso che il problema sia che stai semplificando / travisando un po 'lo Zen di Python. Il punto è che queste decisioni sono in ultima analisi dettate dai contorni del tuo problema e non dalle scelte che puoi fare liberamente. Potrebbe essere necessario eseguire molte iterazioni e refactoring per trovare l' unico modo per farlo, l'unico modo che si adatta perfettamente alle tue esigenze, è leggibile, conciso, persino elegante. Ma per ogni dato problema, dovrebbe esserci una soluzione così ideale e un linguaggio ben progettato ti guiderà delicatamente verso di esso. Questo è ciò che significa lo Zen.
Kevin,

4
Un cinico potrebbe dire 'In Python esiste un solo modo per farlo, ma ogni nuova versione di Python applica la funzione "e ora per qualcosa di completamente diverso" al modo in cui lo ha fatto la versione precedente';)
alephzero

3
citazione da PEP20: "Dovrebbe esserci un modo - e preferibilmente solo uno - ovvio per farlo. Anche se in quel modo all'inizio potrebbe non essere ovvio a meno che tu non sia olandese."
vaxquis,

5

Stai chiedendo solo della myAnswervariabile che sembra essere ridondante. Altre risposte spiegano già alcuni dei perché e quando avrebbe senso ometterlo o usarlo, ma eccone uno in più: che ne dici di questo?

Start
  output input * 2
Stop

o anche quello

Start output input * 2 Stop

Nella maggior parte delle lingue funzionerebbe ancora, ma riesci a leggerlo? È difficile, quindi spesso usiamo le variabili helper perché i computer non sono i soli a leggere il codice. Dobbiamo mantenerlo e capirlo in pochi mesi ed è ancora più difficile scrivere il codice che puoi ancora capire più tardi di quello funzionante ... di solito dopo pochi giorni non capirai perché hai fatto qualcosa in un modo specifico .


2
... o anche solo (*2). Vorrei tuttavia obiettare che l'esecuzione dell'input non può essere necessariamente espressa in modo sicuro semplicemente accedendo a una variabile / eseguendo un'operazione aritmetica: può avere effetti collaterali osservabili.
lasciato circa l'

2

Puoi fare entrambe le varianti (in questo caso semplice), ma la prima variante diventa più leggibile e strutturata per casi più complessi. La prima variante mostra il modello IPO con una riga per ogni passaggio (due di quelli già con il nome giusto):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.