초보자 : 왜 작업이 출력 명령에 포함되지 않습니까?


23

입문 프로그래밍 책을 살펴보고 의사 코드에 간단한 예제를 나열합니다.

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

다음 myAnswer과 같이 호출 된 다른 변수를 생략 하고 작업을 출력 명령에 넣을 수없는 이유

Start
  input myNumber
  output myNumber * 2
Stop

전자가 왜 정확하고 후자가 아닌가?


39
책은 당신이 할 수 없다고 말합니까?
Tulains Córdova

2
이 책은 내가 할 수 없다고 말하지 않습니다. 그것에 대해 아무 말도하지 않습니다.
user1475207

5
짧은 두 번째 블록으로 시작한 다음 필요한 경우 첫 번째 블록으로 변환하는 것이 합리적이라고 생각합니다.
Mateen Ulhaq

13
짧은 대답 : 당신은 할 수 있습니다, 저자는 단지 그것을 시도하기 위해 이것을 명확하게하기 위해 노력하고 있습니다 (그러나 솔직히 말하면 실제로 실제로 그것을 명확하게하지는 않습니다 ...).
Jules

1
두 가지 방법 모두 작동합니다. 경험이 많을수록 코드의 단순성이나 독창성보다 심각한 코딩 가독성이 훨씬 중요하다는 것을 알게 될 것입니다. 많은 다른 사람들이 코드를 쉽게 읽을 수 있어야합니다.
Frantisek Kossuth

답변:


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 내 편집 내용을 참조하십시오. 이 작은 프로그램에서는 중요하지 않습니다. 저자는 나중에 값을 출력하는 것보다 훨씬 더 많은 일을 할 것임을 알고 있습니다. 이것을 보는 것은 복잡합니다. 그것에 충실하십시오.
johnny

아 알 겠어. 이 점을 염두에두고이 책을 계속 살펴 보겠습니다. 감사.
user1475207

29
@ user1475207 두 가지 방법이 있습니다. 때로는 추가 변수를 사용해야 할 수도 있습니다. 때로는 추가 변수가 필요하지 않지만 어쨌든 사용하려고 할 수도 있습니다. 어떤 상황에서는 잘 생각한 이름을 지정하면 훨씬 명확 해지 기 때문입니다. 때로는 노이즈가 추가되어 추가 변수를 사용하지 않으려는 경우가 있습니다. 그리고 여러 번 차이가 실제로 중요하지 않습니다.
비트 트리

3
미리 변수에 할당하지 않고 연산 결과를 반환하는 것이 유효하다고 생각합니다. 그러나 result짧은 함수조차도 변수 를 만드는 습관을 들였 으므로 추가하여 디버깅하는 print(result)것이 정말 빠릅니다. 그래도 좋은 연습보다 편리하지 않습니다.
오른쪽 다리

33

또 다른 이유로, 할당 set myAnswer = myNumber * 2은 결과 값에 name을 제공합니다 . 코드의 두 줄 버전을 읽는 사람은이 값을 인쇄한다는 사실 만 알고 myNumber * 2있습니다. 세 줄 버전을 읽는 사람 myNumber * 2은 그 답을 볼 수 있습니다 .

그러한 사소한 예에서는 중요하지 않은 것처럼 보이지만 때로는 의미있는 이름을 가진 변수에 결과 값을 할당하면 다른 프로그래머가 코드를 읽고 이해하기가 훨씬 쉬워 질 수 있습니다.


10
이름이 의미있는 경우 에만 적용 되지만 +1 입니다. 이름이 같은 임시 바르를 사용하여 i, result또는 다른 의미 식별자는 명확성을 개선하기 위해 아무것도하지 않는다,하고 코드를 클러
알렉산더 - 분석 재개 모니카

7
@Alexander : 의미없는 이름은 여전히 ​​의미가 있습니다. i배열 인덱스가 더 좋았습니다. 이 있으면 result함수가 끝나 return result거나 도덕적으로 동등한 것이 어야합니다 . 그리고 등등 ...
Kevin

6
@Kevin "의미없는 이름은 여전히 ​​의미가 있습니다" lol
Alexander-복직 모니카

3
@Kevin 당신이 가고 있다면 return result, 결과에 할당 한 것을 반환하기 위해 인라인 할 수도 있습니다. 결과임을 알 수 있습니다. 당신은 그것을 반환, 우리는 그것을 얻을.
Alexander-복원 모니카

5
@Alexander : 분명히 간단한 표현이라면 리턴을 인라인 할 수 있지만 여러 명령문을 통해 빌드 해야하는 경우 어떻게해야합니까? 일관된 이름 지정 체계를 사용하면 이러한 경우에 수행중인 작업이 명확 해집니다.
Kevin

14

그것은 의사 코드입니다. 특정 구현 언어로 가정하지는 않습니다.

일부 프로그래밍 언어는 식을 평가 한 다음 동일한 코드 줄로 결과를 출력하는 것을 지원하지 않습니다. 예를 들어 대부분의 어셈블러는이를 지원하지 않습니다. 아마도이 책의 저자는 사물을 저수준으로 보여주기를 원했을 것입니다.


2
그리고 일부 언어 (예 : C)는 동시에 두 언어를 모두 허용합니다. 정말로 원한다면 "output (answer = answer * 2)"와 같은 것을 쓸 수 있습니다! (그러나 "output (answer == answer * 2)"보다주의해야 할 점은 상당히 다릅니다.
alephzero

9

다른 답변은 특정 기계식 세부 사항과 하나 또는 다른 형태가 더 나은시기에 대한 예를 다루었지만 철학적 인 약간의 배경을 더 언급하고 싶습니다.

당신은 언어를 배우고 있습니다.

언어는 아이디어를 표현하고 이해 (통신) 할 수있는 언어입니다. 컴퓨터 프로그래밍 언어는 해당 언어를 사용하여 지정되고 제공되는 아이디어 (결정)에 따라 조치 (실행)를 수행하도록 설계된 기계에 의해 기계적으로 구문 분석 될 수있는 추가 특성을 갖습니다.

전혀 유용한 모든 언어에는 그 언어로 표현할 수있는 거의 모든 아이디어를 표현할 수있는 여러 가지 방법이 있습니다.


영어로 제공되는 다양한 뉘앙스를 고려하십시오. 간단한 문장도

고양이가 상자 위로 뛰어 올랐다.

동일한 실제 물리적 우주 행동을 언급하면서 약간 다른 아이디어를 표현하거나 장면의 다른 부분에 중점을 두도록 다양 할 수 있습니다 .

먼저 문법 변형입니다.

고양이가 상자를 뛰어 넘었다.

상자에 고양이가 뛰어 올랐다.

그런 다음 여전히 동일한 물리적 동작을 참조하는 더 넓고 넓은 변형이 있습니다.

상자는 고양이의 충격으로 흔들렸다.

고양이는 상자의 상단에 멍청이와 함께 내려왔다.

고양이는 가볍게 공중으로 뛰어 들어 근처 상자에 깔끔하게 착륙했습니다.

마지막 문장에서 "인근"이라는 단어의 의미를 살펴보십시오. 그것의 포함은 달리 존재하지 않는 완전히 새로운 개념의 범위를 전달합니다.


파이썬 젠 항상 한 가지 이상의 방법이 있습니다 .


물론 의사 소통하고자하는 내용에 따라 위의 영어 문장 중 하나만 선택하는 것처럼 의도를 완벽하게 표현하고 가장 적합한 한 가지 방법이 있습니다 . 그것이 파이썬의 선에 관한 것입니다.

그러나 입문 프로그래밍 과정 또는 입문 영어 과정에서는 먼저 가장 완벽한 방법 을 선택할 수있는 판단을 내리기 전에 아이디어 를 취할 수 있는 다양한 방법 (단어, 코드 스 니펫)을 배워야합니다 .


3
물론 파이썬은 자체 규칙을 어 깁니다. 람다와 중첩 함수가 있습니다. 루프,리스트 이해 및 생성기 표현; 수레, 소수 및 분수; 그리고 __init__, __new__몇 가지만 말하면됩니다. 요점은 각각 미묘하게 다른 문제에 적합하다는 것입니다. 이 영어 문장 중 하나를 임의로 선택하거나이 파이썬 언어 기능 중 하나를 임의로 선택하지도 않습니다.
Kevin

1
@Kevin, 그렇습니다. 요점은 사람이다 완전히 새로운 프로그래밍에 필요한 구문의 정확성 를 만들어 한 방향으로 만 아무것도 성취 - 즉 수의 복사가 보일 정확한 에서 코드를 튜토리얼 그대로, 어떻게 중학교 수학 문제와 유사 (573 x 247)에는 정답이 하나뿐입니다. " 파일을 축소 하는 프로그램 이란 무엇입니까 ?" 와 같은 질문도 참조하십시오. 당신이 내 대답을 읽는다면, 나는 아무 것도하지 말라고 말하지 않습니다. 나는 당신 프로그래밍 할 때 항상 선택하고 있다고 말하고 있습니다.
와일드 카드

1
확실히 공평합니다. 문제는 당신이 파이썬의 젠을 약간 단순화하고 잘못 표현하고 있다는 것입니다. 요점은 이러한 결정이 궁극적으로 문제의 윤곽에 의해 결정되며 자유롭게 선택할 수있는 것이 아니라는 것입니다. 당신은 반복의 많은 일을 가서 찾을 리팩토링해야 할 을 할 수있는 방법을 완벽하게 사용자의 요구 사항에 맞는하는 한 가지 방법은 읽기, 간결하고도 우아한. 그러나 어떤 주어진 문제에 대해서도 그러한 이상적인 해결책이 있어야하며 잘 디자인 된 언어로 부드럽게 안내해 줄 것입니다. 그것이 Zen이 의미하는 바입니다.
Kevin

4
cynic은 "Python에는 한 가지 방법이 있지만 모든 새로운 버전의 Python은"이제 완전히 다른 방식으로 "기능을 이전 버전의 방식에 적용합니다.;)
alephzero

3
PEP20의 인용문 : "한 가지 확실한 방법이 있어야합니다. 네덜란드 인이 아니라면 처음에는 그 방법이 명확하지 않을 수 있습니다."
vaxquis

5

myAnswer중복으로 보이는 변수에 대해서만 묻습니다 . 다른 답변은 이미 그 이유와시기를 생략하거나 사용하는 것이 합리적이라고 설명했지만 여기에 하나 더 있습니다. 어떻게?

Start
  output input * 2
Stop

또는 심지어

Start output input * 2 Stop

대부분의 언어에서 이것은 여전히 ​​작동하지만 읽을 수 있습니까? 컴퓨터가 코드를 읽는 유일한 컴퓨터가 아니기 때문에 도우미 변수를 자주 사용하기가 어렵습니다 . 우리는 그것을 유지하고 몇 개월 만에 그것을 이해해야하며 나중에 여전히 작동하는 코드를 이해할 수없는 코드를 작성하는 것이 더 어렵습니다 ... 일반적으로 며칠 만에 특정 방식으로 무언가를 한 이유를 알지 못합니다 .


2
... 또는 심지어 (*2). 그러나 입력을 수행하는 것이 변수에 액세스 / 산술 연산을 수행하는 것만으로 안전하게 표현 될 수는 없다고 반박합니다. 부작용을 관찰 할 수 있습니다.
leftaroundabout

2

두 가지 변형 (이 간단한 경우)을 모두 수행 할 수 있지만 첫 번째 변형은 더 복잡한 경우에 대해 더 읽기 쉽고 구조화됩니다. 첫 번째 변형은 각 단계마다 한 줄씩 (오른쪽 이름을 가진 두 줄) IPO 모델 을 보여줍니다 .

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.