Начинающий: почему операции не содержатся в выходных командах?

23

Я просматриваю вводную книгу по программированию, в которой приведен простой пример псевдокода:

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

Почему мы не можем опустить создание другой переменной с именем myAnswerи просто поместить операцию в выходную команду, например так:

Start
  input myNumber
  output myNumber * 2
Stop

Почему первое правильно, а второе нет?

user1475207
источник
39
Книга говорит, что ты не можешь?
Тулаинс Кордова
2
Книга не говорит, что я не могу; это ничего не говорит об этом.
user1475207
5
Я думаю, что было бы разумно начать с более короткого второго блока, а затем преобразовать в первый, если вам это нужно.
Матин Улхак,
13
Короткий ответ: вы можете, автор просто делает это (в попытке) сделать это более ясным (хотя, если честно, это, вероятно, на самом деле не делает это более ясным ...).
Жюль
1
Оба способа работают. С большим опытом вы обнаружите, что для серьезного кодирования удобочитаемость гораздо важнее, чем простота или оригинальность кода. Ваш код должен быть легко читаемым для многих других пользователей.
Франтишек

Ответы:

36

Вы можете, но с другой стороны, вы видите, что происходит, и вы можете использовать myAnswerпозже в программе. Если вы используете свой второй, вы не можете использовать повторно myAnswer.

Итак, позже в программе вы можете захотеть:

myAnswer + 5
myAnswer + 1
etc.

У вас могут быть разные операции, для которых вы хотите его использовать.

Рассмотрим обмен номерами:

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

Это было бы трудно без переменных. Компьютерные книги начинаются с базовых знаний, и большинство программ просты, пока вы не увидите сложность. В учебниках почти все тривиально, и только в сложности вы видите, где что-то происходит или нет.

Джонни
источник
1
Так что это правильная логика, но это не лучшая практика, потому что она не позволяет мне повторно использовать операцию в других частях программы?
user1475207
@ user1475207 Смотрите мои изменения. В этой крошечной программе это не имеет значения. Автор знает, что вы будете делать гораздо больше, чем выводить значение позже. Только в сложности вы можете увидеть это. Придерживаться.
джонни
ах, понятно Я продолжу читать книгу, помня об этом. Спасибо.
user1475207
29
@ user1475207 Оба способа имеют свое место. Иногда вам может понадобиться использовать дополнительную переменную. Иногда вам может не понадобиться дополнительная переменная, но вы все равно захотите ее использовать, потому что в некоторых ситуациях простое назначение хорошо продуманного имени делает это намного более понятным. Иногда вы не хотите использовать дополнительную переменную, потому что она просто добавляет шум. И много раз, разница не имеет значения.
8bittree
3
Я думаю, что это правильно, чтобы вернуть результат операции без предварительного присвоения его переменной. Но я взял привычку создавать resultпеременные даже для коротких функций, так что отладка с помощью добавления print(result)действительно быстрая. Это скорее из-за удобства, чем из хорошей практики.
Правая нога
33

Другая причина: присваивание set myAnswer = myNumber * 2дает полученному значению имя . Человек, читающий двухстрочную версию вашего кода, знает только, что он выводит значение myNumber * 2. Человек читает версию три строки можно увидеть , что myNumber * 2это ответ .

Это может показаться неважным в таком тривиальном примере, но иногда назначение значения результата переменной со значимым именем может значительно облегчить чтение и понимание вашего кода другими программистами.

Соломон Медленный
источник
10
+1, хотя это применимо только тогда, когда имя имеет смысл. Использование временных переменных, подобных этому имени i, resultили другого бессмысленного идентификатора ничего не делает для улучшения ясности, а только загромождает код
Александр - Восстановите Монику
7
@ Александр: Бессмысленные имена все еще могут быть значимыми. iлучше быть индексом массива. Если есть result, функция должна заканчиваться return resultили моральный эквивалент. И так далее ...
Кевин
6
@Kevin "Бессмысленные имена все еще могут быть значимыми" эээ ... ты уверен? LOL
Александр - Восстановить Монику
3
@Kevin Если вы собираетесь return result, то вы можете просто встроить, чтобы вернуть то, что вы назначали на результат. Мы видим, что это результат. Вы возвращаете это, мы получаем это.
Александр - Восстановить Монику
5
@Alexander: Очевидно, что вы можете встроить возвращаемое значение, если это простое выражение, но что, если вам нужно создать его из нескольких операторов? Использование согласованной схемы именования дает понять, что вы делаете в этих случаях.
Кевин
14

Это псевдокод. Это не должен быть какой-то конкретный реализованный язык.

Некоторые языки программирования не поддерживают оценку выражения, а затем вывод результата в той же строке кода. Например, большинство ассемблеров не поддерживают это. Возможно, автор книги хотел показать вещи на низком уровне.

Тулаинс Кордова
источник
2
А некоторые языки (например, C) допускают оба варианта одновременно - вы можете написать что-то вроде «output (answer = answer * 2)», если вы действительно этого хотите! (но будьте осторожны, чем «выходные данные (ответ == ответ * 2)» означает что-то совершенно другое ...
alephzero
9

Другие ответы касались конкретных деталей механики и примеров того, когда та или иная форма была бы лучше, но я хочу упомянуть немного о более глубоком, своего рода философском:

Вы изучаете язык.

Язык - это то, в чем идеи могут быть выражены и поняты (переданы). Язык компьютерного программирования имеет дополнительное свойство, заключающееся в том, что его можно механически анализировать с помощью машины, предназначенной для выполнения действий (выполнения) на основе идей (решений), которые заданы и используются в этом языке.

На ЛЮБОМ языке, который вообще полезен, есть более чем один способ выразить почти любую идею, выражаемую на этом языке.


Рассмотрим широкий спектр нюансов, доступных на английском языке. Даже простое предложение, такое как

Кот вскочил на коробку.

может быть изменен, чтобы выразить немного разные идеи или сделать акцент на разных частях сцены , обращаясь к одному и тому же действию физической вселенной.

Во-первых, грамматические варианты:

Коробку запрыгнул на кота.

На коробку прыгнул кот.

Затем все шире и шире варианты, все еще относящиеся к тому же физическому действию:

Коробка затряслась от удара кота.

Кошка с глухим стуком упала на верх коробки.

Кошачий легко прыгнул в воздух и аккуратно приземлился на ближайшую коробку.

Просто посмотрите на значение слова «рядом» в этом последнем предложении. Его включение несет в себе целый ряд новых концепций, которые иначе не присутствуют.


Существует всегда больше , чем один из способов сделать это, Python дзен наоборот.


Конечно, будет ОДИН способ, который прекрасно выражает ваше намерение и является наиболее подходящим, точно так же, как вы выбрали бы только ОДИН из предложенных выше предложений на английском языке, в зависимости от того, что именно вы хотели сообщить. Вот что такое Дзен Питона.

Но во вводном курсе по программированию или вводном курсе английского языка вы должны сначала изучить различные способы (формулировки, фрагменты кода), в которых вы можете сформулировать идею, прежде чем выработать решение о выборе наиболее подходящего варианта.

Wildcard
источник
3
Конечно, Python нарушает свое собственное правило. У вас есть лямбды и вложенные функции; циклы, списки и выражения генератора; числа с плавающей запятой, десятичные дроби и дроби; и, __init__и __new__просто назвать несколько. Дело в том, что каждый из них подходит к слегка другой проблеме. Вы не выберете одно из этих английских предложений случайно и не выберете одну из этих возможностей языка Python случайно.
Кевин
1
@ Кевин, да, согласился. Дело в том, что для кого-то совершенно нового в программировании точность требуемого синтаксиса может создать впечатление, что есть только один способ, которым можно достичь чего угодно - т.е. копирование точного кода из учебного дословного слова, аналогично тому, как математические задачи в средней школе (573 x 247) есть только один правильный ответ. Смотрите также такие вопросы , как «Что программа сжать файлы?» Если вы читаете мой ответ, я не говорю, чтобы делать что-либо наугад; Я говорю , что вы будете всегда делать выбор при программировании.
Wildcard
1
Это, безусловно, справедливо. Я думаю, проблема в том, что вы немного упрощаете / искажаете представление о дзен Python. Все дело в том, что эти решения в конечном итоге диктуются контурами вашей проблемы, а не выбором, который вы можете сделать свободно. Возможно, вам придется пройти через много итераций и рефакторинг, чтобы найти единственный способ сделать это, единственный способ, который идеально соответствует вашим требованиям, читаемый, лаконичный, даже элегантный. Но для любой конкретной проблемы должно быть такое идеальное решение, и хорошо продуманный язык будет мягко вести вас к нему. Вот что значит дзен.
Кевин
4
Циник может сказать: «В Python есть только один способ сделать это, но каждая новая версия Python применяет функцию« и теперь для чего-то совершенно другого »к тому, как это делала предыдущая версия»;)
alephzero
3
цитата из PEP20: «Должен быть один - и предпочтительно только один - очевидный способ сделать это. Хотя этот способ может быть неочевидным на первый взгляд, если вы не голландец».
vaxquis
5

Вы спрашиваете только о той myAnswerпеременной, которая кажется избыточной. Другие ответы уже объясняют некоторые причины и причины, по которым было бы целесообразно их опускать или использовать, но вот еще один: как насчет этого?

Start
  output input * 2
Stop

или даже это

Start output input * 2 Stop

На большинстве языков это все еще работает, но вы можете прочитать это? Это сложно, поэтому мы часто используем вспомогательные переменные, потому что компьютеры не единственные, кто читает код. Мы должны поддерживать его и понимать его в течение нескольких месяцев, и еще сложнее написать код, который вы все равно сможете понять позже, чем рабочий ... обычно через несколько дней вы не поймете, почему вы что-то сделали определенным образом ,

t3chb0t
источник
2
... или даже просто (*2). Однако я бы возразил, что выполнение ввода не обязательно может быть выражено безопасно как простой доступ к переменной / выполнение арифметической операции: это может иметь наблюдаемые побочные эффекты.
оставлено около
2

Вы можете сделать оба варианта (в этом простом случае), но первый вариант становится более читабельным и структурированным для более сложных случаев. Первый вариант показывает модель IPO с одной линией для каждого шага (две из них уже с правильным именем):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
Райдри поддерживает Монику
источник