Новачок: Чому операції не містяться у вихідних командах?


23

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

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

Чому ми не можемо опустити створення іншої змінної, яка називається, myAnswerі просто помістити операцію у вихідну команду, як це:

Start
  input myNumber
  output myNumber * 2
Stop

Чому перший правильний, а другий - ні?


39
Чи говорить книга, що ви не можете?
Tulains Córdova

2
У книзі не сказано, що я не можу; це нічого не говорить про це.
користувач1475207

5
Я думаю, що цілком розумно починати з коротшого другого блоку, а потім перетворювати на перший, якщо вам це потрібно.
Mateen Ulhaq

13
Коротка відповідь: ви можете, автор саме робить це (намагаючись) зробити це зрозумілішим (хоча, чесно кажучи, це, мабуть, насправді зовсім не стає зрозумілішим ...).
Jules

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
Отже, це дійсна логіка, але це не найкраща практика, оскільки це не дозволяє мені повторно використовувати операцію в інших частинах програми?
користувач1475207

@ user1475207 Дивіться мою редагування. У цій крихітній програмі це не має значення. Автор знає, що ви будете робити набагато більше, ніж пізніше виводити значення. Це ви можете побачити лише в складності. Дотримуйтесь його.
Johnny

ах добре, я бачу. Я продовжую книгу, маючи це на увазі. Спасибі.
користувач1475207

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 "Безглузді імена все ще можуть бути значущими" uhhh ... Ви впевнені? lol
Олександр - Відновити Моніку

3
@Kevin Якщо ти збираєшся return result, то можеш просто просто надати повернути все, що ти призначив для результату. Ми можемо бачити, що це результат. Ви повертаєте це, ми отримуємо це.
Олександр - Відновіть Моніку

5
@Alexander: Очевидно, ви можете вбудувати повернення, якщо це простий вираз, але що робити, якщо вам потрібно створити його на кількох висловлюваннях? Використання послідовної схеми іменування дає зрозуміти, що ви робите в цих випадках.
Кевін

14

Це псевдокод. Це не може бути якоюсь реалізованою мовою.

Деякі мови програмування не підтримують оцінку виразу, а потім виводять результат у той самий рядок коду. Наприклад, більшість асемблерів цього не підтримує. Можливо, автор книги хотів показати речі на низькому рівні.


2
А деякі мови (наприклад, C) дозволяють обидві одночасно - ви можете написати такі речі, як "вихід (відповідь = відповідь * 2)", якщо ви дійсно хочете! (але остерігайтеся, ніж "вихід (відповідь == відповідь * 2)" означає щось зовсім інше ...
alephzero

9

Інші відповіді стосуються конкретних механічних деталей та прикладів того, коли та чи інша форма буде кращою, але я хочу зазначити трохи подальший досвід, такий собі філософський:

Ви вивчаєте мову.

Мова - це те, в чому ідеї можна висловити та зрозуміти (донести). Мова комп’ютерного програмування має додаткове властивість, що його механічно можна розібрати на машині, призначеній для здійснення дій (виконання) на основі ідей (рішень), які визначені та подані при використанні цієї мови.

У будь-якій мові, яка взагалі корисна, існує більше ніж один спосіб висловити майже будь-яку ідею, висловлювану цією мовою.


Розглянемо широке розмаїття нюансів, доступних в англійській мові. Навіть просте речення, наприклад

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

може бути різним, щоб висловити трохи різні ідеї або акцентувати увагу на різних частинах сцени , посилаючись на однакові точні фізичні дії Всесвіту.

Спочатку граматичні варіанти:

Котик наскочив на кішку.

На коробку стрибнув кіт.

Потім є більш широкі і більш широкі варіанти, все ще посилаючись на ті ж фізичні дії:

Коробка затремтіла під ударом кота.

Кіт спустився стуком по верхній частині коробки.

Котик злегка підскочив у повітря і акуратно приземлився на сусідній ящик.

Просто подивіться на значення слова "поруч" у цьому останньому реченні. Її включення передає цілий новий спектр понять, які не є іншими.


Існує завжди більше , ніж один з способів зробити це, Python дзен навпаки.


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

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


3
Звичайно, Python порушує своє власне правило. У вас є лямбда і вкладені функції; цикли, розуміння списку та вирази генератора; поплавці, десяткові дроби та дроби; і __init__та __new__, просто назвати декілька. Справа в тому, що кожен підходить до тонко різної проблеми. Ви не вибрали б одне з цих англійських речень випадково, а також не вибрали одне з цих мов Python навмання.
Кевін

1
@Kevin, так, погодився. Справа в тому, що для когось абсолютно нового в програмуванні точність необхідного синтаксису може здатися, що існує лише один спосіб, тобто все, що можливо, тобто копіювання точного коду з підручника дословно, подібно до того, як проблеми математики середньої школи (573 х 247) мають лише одну правильну відповідь. Дивіться також такі питання , як «Що програма стиснути файли?» Якщо ви читаєте мою відповідь, я не кажу робити щось навмання; Я кажу , що ви будете завжди робити вибір при програмуванні.
Wildcard

1
Це, звичайно, справедливо. Я думаю, що проблема полягає в тому, що ви начебто спрощуєте / неправильно представляєте дзен Python. Вся справа в тому, що ці рішення в кінцевому підсумку диктуються контурами вашої проблеми, а не вибір, який ви можете робити вільно. Можливо, вам доведеться пройти безліч ітерацій та рефакторингу, щоб знайти єдиний спосіб зробити це, той спосіб, який ідеально відповідає вашим вимогам, читабельний, стислий, навіть елегантний. Але для будь-якої задачі має бути таке ідеальне рішення, і добре розроблена мова обережно буде вести вас до неї. Ось що означає Дзен.
Кевін

4
Цинік може сказати: "У Python є лише один спосіб зробити це, але кожна нова версія Python застосовує функцію" і тепер для чогось зовсім іншого "до того, як це робила попередня версія;)
alephzero

3
цитата з PEP20: "Має бути один - і бажано лише один - очевидний спосіб зробити це. Хоча цей спосіб може бути спочатку не очевидним, якщо ви не голландський".
vaxquis

5

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

Start
  output input * 2
Stop

або навіть це

Start output input * 2 Stop

У більшості мов це все ще працює, але чи можете ви це прочитати? Це важко, тому ми часто використовуємо помічникові змінні, оскільки комп'ютери - не єдині, хто читає код. Нам потрібно підтримувати його і розуміти через декілька місяців, і ще складніше написати код, який ви все ще можете зрозуміти пізніше, ніж робочий ... Зазвичай через декілька днів ви не знатимете, чому ви щось робили певним чином .


2
... або навіть просто (*2). Однак я заперечую, що виконання вводу не обов'язково може бути виражене безпечно, як лише доступ до змінної / виконання арифметичної операції: це може мати помітні побічні ефекти.
Ліворуч близько

2

Можна зробити обидва варіанти (у цьому простому випадку), але перший варіант стає більш читабельним та структурованим для більш складних випадків. Перший варіант показує модель IPO з одним рядком для кожного кроку (два з тих, що вже мають правильну назву):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.