Iniciante: Por que as operações não estão contidas nos comandos de saída?

23

Estou examinando um livro de programação introdutório e ele lista um exemplo simples no pseudocódigo:

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

Por que não podemos omitir a criação de outra variável chamada myAnswere simplesmente colocar a operação no comando de saída, assim:

Start
  input myNumber
  output myNumber * 2
Stop

Por que o primeiro está correto e o segundo não?

user1475207
fonte
39
O livro diz que você não pode?
Tulains Córdova
2
O livro não diz que não posso; não diz nada sobre isso.
user1475207
5
Eu acho que é bastante razoável começar com o segundo bloco mais curto e depois converter para o primeiro, se você precisar.
Mateen Ulhaq
13
Resposta curta: você pode, o autor está apenas fazendo isso (em uma tentativa) para torná-lo mais claro (embora, honestamente, provavelmente não o torne realmente mais claro ...).
Jules
1
Os dois lados funcionam. Com mais experiência, você descobrirá que, para uma leitura séria da codificação, é muito mais importante do que a simplicidade ou originalidade do código. Seu código deve ser facilmente legível por muitos outros que o mantêm.
Frantisek Kossuth

Respostas:

36

Você poderia, mas o outro é para ver o que está acontecendo e usar myAnswermais tarde no programa. Se você usar o seu segundo, não poderá reutilizar myAnswer.

Então, mais tarde, no programa, você pode querer:

myAnswer + 5
myAnswer + 1
etc.

Você pode ter operações diferentes para as quais deseja usá-lo.

Considere trocar números:

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

Isso seria difícil sem variáveis. Os livros de computador começam realmente básicos, e a maior parte da programação é fácil até você ver a complexidade. Quase tudo é trivial nos tutoriais, e é apenas na complexidade que você vê onde as coisas fazem ou não fazem sentido.

johnny
fonte
1
Portanto, é uma lógica válida, mas não é uma prática recomendada, pois não me permite reutilizar a operação em outras partes do programa.
user1475207
@ user1475207 Veja minha edição. Neste pequeno programa, não importa. O autor sabe que você estará fazendo muito mais do que emitir o valor posteriormente. É apenas na complexidade que você consegue ver isso. Fique com ele.
johnny
ah ok, entendi. Vou continuar com o livro com isso em mente. Obrigado.
user1475207
29
@ user1475207 Ambas as formas têm seu lugar. Às vezes, você pode precisar usar a variável extra. Às vezes, você pode não precisar da variável extra, mas deseja usá-la de qualquer maneira, porque em algumas situações, apenas dar um nome bem pensado a algo torna isso muito mais claro. Às vezes, você não deseja usar a variável extra porque é apenas mais ruído. E muitas vezes, a diferença realmente não importa.
8bittree
3
Eu acho que é válido retornar o resultado de uma operação sem atribuí-lo previamente a uma variável. Mas adquiri o hábito de criar uma resultvariável mesmo para funções curtas, para que a depuração adicionando print(result)seja realmente rápida. É mais por conveniência do que por boas práticas.
Perna direita
33

Outro motivo: a atribuição set myAnswer = myNumber * 2atribui um nome ao valor resultante . Uma pessoa que lê a versão de duas linhas do seu código sabe apenas que ele imprime o valor de myNumber * 2. Uma pessoa que lê a versão de três linhas pode ver que myNumber * 2é a resposta .

Pode não parecer importante em um exemplo tão trivial, mas às vezes, atribuir um valor de resultado a uma variável com um nome significativo pode tornar muito mais fácil para outros programadores ler e entender seu código.

Salomão Lento
fonte
10
+1, embora isso se aplique quando o nome tiver significado. Usando vars temporários assim chamado i, resultou algum outro identificador sentido não faz nada para melhorar a clareza, e só tumultua o código
Alexander - Reintegrar Monica
7
@ Alexander: Nomes sem sentido ainda podem ser significativos. ié melhor que seja um índice de matriz. Se houver result, a função deve terminar com return resultou o equivalente moral. E assim por diante ...
Kevin
6
@Kevin "Nomes sem sentido ainda podem ser significativos" uhhh ... você tem certeza? lol
Alexander - Reinstate Monica
3
@ Kevin Se você estiver indo return result, também pode simplesmente fazer a fila para retornar o que estava atribuindo ao resultado. Podemos ver que é um resultado. Você está devolvendo, nós entendemos.
Alexander - Restabelecer Monica
5
@ Alexander: Obviamente, você pode incorporar o retorno se for uma expressão simples, mas e se precisar compilá-lo em várias declarações? O uso de um esquema de nomenclatura consistente deixa claro o que você está fazendo nesses casos.
Kevin
14

Isso é pseudocódigo. Não é suposto ser qualquer linguagem implementada específica.

Algumas linguagens de programação não suportam avaliar uma expressão e, em seguida, ultrapassar o resultado na mesma linha de código. Por exemplo, a maioria dos montadores não suporta isso. Talvez o autor do livro quisesse mostrar as coisas de uma maneira baixa.

Tulains Córdova
fonte
2
E alguns idiomas (por exemplo, C) permitem os dois ao mesmo tempo - você pode escrever coisas como "output (answer = answer * 2)" se você realmente quiser! (mas cuidado com o fato de que "output (answer == answer * 2)" significa algo bem diferente ...
alephzero
9

Outras respostas abordaram os detalhes mecânicos específicos e exemplos de quando uma ou outra forma seria melhor, mas quero mencionar um pouco mais de fundo, meio filosófico:

Você está aprendendo um idioma.

Uma linguagem é algo em que as idéias podem ser expressas e compreendidas (comunicadas). Uma linguagem de programação de computador tem a propriedade adicional de poder ser analisada mecanicamente por uma máquina projetada para executar ações (executar) com base em idéias (decisões) especificadas e alimentadas com o uso dessa linguagem.

Em QUALQUER idioma que seja útil, há mais de uma maneira de expressar praticamente qualquer idéia expressável nesse idioma.


Considere a grande variedade de nuances disponíveis no idioma inglês. Mesmo uma frase simples, como

O gato pulou na caixa.

pode variar para expressar idéias ligeiramente diferentes ou enfatizar diferentes partes da cena, enquanto se refere à mesma ação exata do universo físico.

Primeiro são as variações gramaticais:

A caixa foi pulada pelo gato.

Na caixa pulou o gato.

Então existem variações cada vez mais amplas, ainda se referindo à mesma ação física:

A caixa tremeu sob o impacto do gato.

O gato desceu com um baque na parte superior da caixa.

O felino saltou levemente no ar e pousou ordenadamente em uma caixa próxima.

Basta olhar para as implicações da palavra "nas proximidades" nessa última frase. Sua inclusão transmite toda uma nova gama de conceitos que não estavam presentes.


sempre mais do que uma maneira de fazer isso, Python Zen em contrário.


Obviamente, haverá uma maneira que expressa perfeitamente sua intenção e é a mais adequada, assim como você escolheria apenas uma das frases em inglês acima, dependendo exatamente do que deseja comunicar. É disso que trata o Zen do Python.

Mas em um curso introdutório de programação ou em um curso introdutório de inglês, você deve primeiro aprender as várias maneiras (palavras, trechos de código) pelas quais você pode apresentar uma ideia antes de desenvolver o julgamento para escolher qual é a mais adequada.

Curinga
fonte
3
Obviamente, o Python quebra sua própria regra. Você tem lambdas e funções aninhadas; loops, compreensão de lista e expressões geradoras; flutuadores, decimais e frações; e __init__e __new__, só para citar alguns. O ponto é que cada um é apropriado para um problema sutilmente diferente. Você não escolheria uma dessas frases em inglês aleatoriamente, nem escolheria um desses recursos da linguagem Python aleatoriamente.
Kevin
1
@ Kevin, sim, concordou. O ponto é que, para alguém totalmente novo em programação, a exatidão da sintaxe necessária pode fazer parecer que só há uma maneira de realizar alguma coisa - ou seja, copiar o código exato do tutorial literalmente, semelhante a problemas matemáticos do ensino médio (573 x 247) tem apenas uma resposta certa. Consulte também perguntas como "Qual é o programa para reduzir arquivos?" Se você ler minha resposta, não estou dizendo para fazer nada aleatoriamente; Estou dizendo que você está sempre fazendo escolhas quando programa.
Curinga
1
Isso é certamente justo. Acho que o problema é que você está simplificando / deturpando um pouco o Zen do Python. O ponto principal é que essas decisões são ditadas pelos contornos do seu problema, e não pelas escolhas que você pode fazer livremente. Você pode precisar passar por muita iteração e refatoração para encontrar a única maneira de fazê-lo, a única que se encaixa perfeitamente aos seus requisitos, é legível, concisa e até elegante. Mas, para qualquer problema, deve haver uma solução ideal e uma linguagem bem projetada o guiará gentilmente. É isso que o Zen significa.
Kevin
4
Um cínico pode dizer 'No Python, há apenas uma maneira de fazê-lo, mas toda nova versão do Python aplica a função "e agora para algo completamente diferente" à maneira como a versão anterior fazia';)
alephzero
3
citação do PEP20: "Deve haver uma - e preferencialmente apenas uma - maneira óbvia de fazê-lo. Embora esse caminho possa não ser óbvio a princípio, a menos que você seja holandês".
vaxquis 11/07
5

Você está perguntando apenas sobre a myAnswervariável que parece ser redundante. Outras respostas já explicam parte do porquê e quando faria sentido omiti-lo ou usá-lo, mas aqui está mais uma: que tal isso?

Start
  output input * 2
Stop

ou mesmo isso

Start output input * 2 Stop

Na maioria dos idiomas, isso ainda funcionaria, mas você consegue lê-lo? Como é difícil, geralmente usamos variáveis auxiliares porque os computadores não são os únicos que lêem o código. Precisamos mantê-lo e entendê-lo em alguns meses e é ainda mais difícil escrever código que você ainda possa entender mais tarde do que um código em funcionamento ... geralmente depois de alguns dias você não saberá por que fez algo de uma maneira específica .

t3chb0t
fonte
2
... ou até mesmo (*2). Eu objetaria, no entanto, que executar entradas não pode necessariamente ser expresso com segurança, como apenas acessar uma variável / executar uma operação aritmética: pode ter efeitos colaterais observáveis.
leftaroundabout
2

Você pode executar as duas variantes (neste caso simples), mas a primeira variante se torna mais legível e estruturada para casos mais complexos. A primeira variante mostra o modelo de IPO com uma linha para cada etapa (duas delas já com o nome correto):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
Raidri apoia Monica
fonte