Principiante: ¿Por qué las operaciones no están contenidas en los comandos de salida?

23

Estoy leyendo un libro de programación introductorio y enumera un ejemplo simple en pseudocódigo:

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

¿Por qué no podemos omitir la creación de otra variable llamada myAnswery simplemente poner la operación en el comando de salida, así:

Start
  input myNumber
  output myNumber * 2
Stop

¿Por qué el primero es correcto y el segundo no?

usuario1475207
fuente
39
¿El libro dice que no puedes?
Tulains Córdova
2
El libro no dice que no puedo; No dice nada al respecto.
user1475207
55
Creo que es bastante razonable comenzar con el segundo bloque más corto, luego convertirlo al primero si lo necesita.
Mateen Ulhaq
13
Respuesta corta: puedes, el autor solo está haciendo esto (en un intento) para aclararlo (aunque, sinceramente, probablemente no lo aclare en absoluto ...).
Julio
1
Ambas formas funcionan. Con más experiencia encontrará, que para la codificación seria la legibilidad es mucho más importante que la simplicidad u originalidad del código. Su código debe ser fácilmente legible por muchos otros que lo mantienen.
Frantisek Kossuth

Respuestas:

36

Podría hacerlo, pero lo otro es para que vea lo que está sucediendo y para que pueda usarlo myAnswermás adelante en el programa. Si usa el segundo, no puede reutilizarlo myAnswer.

Entonces, más adelante en el programa, es posible que desee:

myAnswer + 5
myAnswer + 1
etc.

Es posible que tenga diferentes operaciones para las que quiera usarlo.

Considere intercambiar 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

Eso sería difícil sin variables. Los libros de computadora comienzan a ser realmente básicos, y la mayoría de la programación es fácil hasta que vea complejidad. Casi todo es trivial en los tutoriales, y solo en la complejidad se ve dónde las cosas tienen sentido o no.

johnny
fuente
1
Entonces, ¿es una lógica válida pero no es la mejor práctica porque no me permite reutilizar la operación en otras partes del programa?
user1475207
@ user1475207 Ver mi edición. En este pequeño programa no importa. El autor sabe que hará mucho más que generar el valor más adelante. Es solo en complejidad que puedes ver esto. Quedarse con eso.
johnny
ah ok, ya veo. Continuaré con el libro con esto en mente. Gracias.
user1475207
29
@ user1475207 Ambas formas tienen su lugar. A veces puede que tenga que usar la variable adicional. A veces, es posible que no necesite la variable adicional, pero quiera usarla de todos modos porque en algunas situaciones, simplemente dar un nombre bien pensado a las cosas lo hace mucho más claro. A veces no desea usar la variable adicional porque es solo ruido agregado. Y muchas veces, la diferencia realmente no importa.
8bittree
3
Creo que es válido devolver el resultado de una operación sin asignarlo previamente a una variable. Pero tomé el hábito de crear una resultvariable incluso para funciones cortas, de modo que la depuración agregando print(result)es realmente rápida. Sin embargo, es más por conveniencia que por una buena práctica.
Pierna derecha el
33

Otra razón, la asignación set myAnswer = myNumber * 2le da un nombre al valor resultante . Una persona que lee la versión de dos líneas de su código solo sabe que imprime el valor de myNumber * 2. Una persona que lee la versión de tres líneas puede ver que esa myNumber * 2es la respuesta .

Puede que no parezca importante en un ejemplo tan trivial, pero a veces, asignar un valor de resultado a una variable con un nombre significativo puede hacer que sea mucho más fácil para otros programadores leer y comprender su código.

Salomón lento
fuente
10
+1, aunque esto solo se aplica cuando el nombre es significativo. El uso de variables temporales como este llamado i, resulto algún otro identificador sin sentido no hace nada para mejorar la claridad, y solo satura el código
Alexander - Restablece a Monica el
77
@Alexander: los nombres sin sentido aún pueden ser significativos. iSerá mejor que sea un índice de matriz. Si hay un result, la función debería terminar con return resulto el equivalente moral. Y así sucesivamente ...
Kevin
66
@ Kevin "Los nombres sin sentido todavía pueden ser significativos" uhhh ... ¿estás seguro? jajaja
Alexander - Restablecer Monica
3
@Kevin Si vas a hacerlo return result, entonces también puedes alinearte para devolver lo que fueras a asignar como resultado. Podemos ver que es un resultado. Lo estás devolviendo, lo entendemos.
Alexander - Restablece a Mónica el
55
@Alexander: Obviamente, puede incluir el retorno en línea si es una expresión simple, pero ¿y si necesita construirlo en varias declaraciones? El uso de un esquema de nombres coherente deja en claro lo que está haciendo en estos casos.
Kevin
14

Eso es seudocódigo. No se supone que sea un lenguaje implementado en particular.

Algunos lenguajes de programación no admiten evaluar una expresión y luego superar el resultado en la misma línea de código. Por ejemplo, la mayoría de los ensambladores no lo admiten. Quizás el autor del libro quería mostrar las cosas de una manera de bajo nivel.

Tulains Córdova
fuente
2
Y algunos lenguajes (por ejemplo, C) permiten ambos al mismo tiempo: ¡puede escribir cosas como "salida (respuesta = respuesta * 2)" si realmente lo desea! (pero cuidado con "salida (respuesta == respuesta * 2)" significa algo muy diferente ...)
alephzero
9

Otras respuestas han abordado los detalles mecánicos específicos y ejemplos de cuándo una u otra forma sería mejor, pero quiero mencionar un poco más de antecedentes, algo filosófico:

Estás aprendiendo un idioma.

Un lenguaje es algo en el que las ideas pueden expresarse y entenderse (comunicarse). Un lenguaje de programación de computadora tiene la propiedad adicional de que puede ser analizado mecánicamente por una máquina diseñada para actuar (ejecutar) en base a ideas (decisiones) que se especifican y se alimentan al usar ese lenguaje.

En CUALQUIER lenguaje que sea útil, hay más de una forma de expresar casi cualquier idea expresable en ese idioma.


Considere la gran variedad de matices disponibles en el idioma inglés. Incluso una oración simple, como

El gato saltó a la caja.

se puede variar para expresar ideas ligeramente diferentes o poner énfasis en diferentes partes de la escena mientras se refiere a la misma acción exacta del universo físico.

Primero están las variaciones gramaticales:

El gato saltó a la caja.

Sobre la caja saltó el gato.

Luego hay variaciones cada vez más amplias, que aún se refieren a la misma acción física:

La caja se sacudió bajo el impacto del gato.

El gato cayó con un ruido sordo en la parte superior de la caja.

El felino saltó ligeramente en el aire y aterrizó cuidadosamente en una caja cercana.

Basta con mirar las implicaciones de la palabra "cerca" en esa última oración. Su inclusión transmite una gama completamente nueva de conceptos no presentes de otra manera.


Hay siempre más de una manera de hacerlo, Python Zen en sentido contrario.


Por supuesto, habrá UNA forma que exprese perfectamente su intención y sea la más adecuada, al igual que elegiría UNA de las oraciones en inglés anteriores, dependiendo exactamente de lo que desea comunicar. De eso se trata el Zen de Python.

Pero en un curso introductorio de programación o un curso introductorio de inglés, primero debe aprender las diversas formas (redacción, fragmentos de código) en las que puede expresar una idea antes de desarrollar el juicio para elegir cuál es el más adecuado.

Comodín
fuente
3
Por supuesto, Python rompe su propia regla. Tienes lambdas y funciones anidadas; bucles, comprensiones de listas y expresiones generadoras; flotadores, decimales y fracciones; y __init__y __new__, sólo para nombrar unos pocos. El punto es que cada uno es apropiado para un problema sutilmente diferente. No elegiría una de esas oraciones en inglés al azar, ni elegiría una de estas características del lenguaje Python al azar.
Kevin
1
@ Kevin, sí, estuvo de acuerdo. El punto es que para alguien totalmente nuevo en la programación, la exactitud de la sintaxis requerida puede hacer que parezca que solo se puede lograr algo, es decir, copiar el código exacto del tutorial literalmente, similar a cómo los problemas de matemáticas de la escuela intermedia (573 x 247) tienen solo una respuesta correcta. Consulte también preguntas como "¿Cuál es el programa para reducir archivos?" Si lees mi respuesta, no estoy diciendo que hagas nada al azar; Estoy diciendo que usted está siempre tomando decisiones cuando se programa.
Comodín
1
Eso es ciertamente justo. Creo que el problema es que estás simplificando / tergiversando un poco el Zen de Python. El punto es que esas decisiones están dictadas en última instancia por los contornos de su problema y no por las elecciones que puede tomar libremente. Es posible que tenga que pasar por muchas iteraciones y refactorizaciones para encontrar la única forma de hacerlo, la única que se ajusta perfectamente a sus requisitos, es legible, concisa e incluso elegante. Pero para cualquier problema, debe haber una solución ideal, y un lenguaje bien diseñado lo guiará suavemente hacia él. Eso es lo que significa el zen.
Kevin
44
Un cínico podría decir 'En Python solo hay una forma de hacerlo, pero cada nueva versión de Python aplica la función "y ahora por algo completamente diferente" a la versión anterior ";)
alephzero
3
cita de PEP20: "Debería haber una, y preferiblemente solo una, forma obvia de hacerlo. Aunque esa forma puede no ser obvia al principio a menos que seas holandés".
vaxquis
5

Solo pregunta sobre la myAnswervariable que parece ser redundante. Otras respuestas ya explican algunos de los por qué y cuándo tendría sentido omitirlo o usarlo, pero aquí hay uno más: ¿qué tal esto?

Start
  output input * 2
Stop

o incluso eso

Start output input * 2 Stop

En la mayoría de los idiomas, esto todavía funcionaría, pero ¿puedes leerlo? Es difícil, por lo que a menudo usamos variables auxiliares porque las computadoras no son las únicas que leen el código. Necesitamos mantenerlo y comprenderlo en pocos meses y es aún más difícil escribir código que aún pueda entender más tarde que uno que funcione ... por lo general, después de unos pocos días, no sabrá por qué hizo algo de una manera específica .

t3chb0t
fuente
2
... o incluso solo (*2). Sin embargo, objetaría que realizar una entrada no necesariamente puede expresarse de manera segura como simplemente acceder a una variable / realizar una operación aritmética: puede tener efectos secundarios observables.
Leftaroundabout
2

Puede hacer ambas variantes (en este caso simple), pero la primera variante se vuelve más legible y estructurada para casos más complejos. La primera variante muestra el modelo IPO con una línea para cada paso (dos de los que ya tienen el nombre correcto):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
Raidri apoya a Monica
fuente