Program Arcade Games With Python And Pygame

Program Arcade Games
With Python And Pygame

Chapter 1: 자기만의 계산기 만들기

(아직 파이썬(Python)과 파이게임(Pygame)을 설치 하지 않았다면, “이전” 섹션으로 돌아가서 다운로드를 받고 설치 하기 바란다.)

1.1 개요

fig.trajectory

파이썬으로 만들어 볼 수 있는 간단한 예제 중 하나는 계산기 이다. 잠깐, 계산기는 게임이 아닌데 왠 계산기 냐고?? 지루하다고??

낙하하는 물체, 날아가는 총알 속도 및 거리 계산, 점수 계산 이런 작업들은 계산이 필요하다. 진정한 프로그래머라면 계산기를 진절머리나는 물건이라기 보다는 장난감으로 생각하는 자세가 필요하다. 하지만, 걱정하지 마시라. 우리는 5장에서 그래픽에 대해 배우기 시작 할 것이다.

간단한 계산기 프로그램은 사용자로 부터 정보를 입력 받아 지루한 집세 계산 부터, 여러분이 던진 공의 궤적 계산과 같은 흥미진진한 내용도 계산이 가능하다.

Figure 1.1은 게임의 물리학적 엔진의 일부로 사용 할 수 있는 일부분으로서 운동에너지를 계산하는 예를 보여 준다.

fig.kinetic_energy
Figure 1.1: 파이썬을 이용한 운동에너지 계산

보는 바와 같이 프로그램의 매력은 복잡한 방정식은 보이지 않게 숨기고, 사용자가 간단한 정보만 입력하면 이해하기 쉬운 형태로 결과를 출력해 준다는 것이다. 다른 상용 계산기 처럼 스마트폰 등에서도 실행이 가능해 어디에서나 즉석으로 쉽게 사용 할 수 있다.

1.2 출력

1.2.1 문자 출력하기

화면에 무언가를 출력하려면 어떻게 하는가? 프로그램은 간단하다. 단지 한줄만 쓰면 된다 :

print("Hello World.")
fig.printing_calculator

이 프로그램은 "Hello World"를 화면에 출력해 준다. 바로 IDLE 프롬프트로 가서 입력한 후 엔터를 쳐보라. 다른 문자들도 입력 해보라. 여러분이 입력하는 모든 내용이 맞든 틀리든 상관없이 컴퓨터는 화면에 출력 해 줄 것이다.

다른 프로그래밍 언어에서는 "Hello World"를 어떻게 코딩하는지 위키디피아에서 찾아 볼 수도 있다. 여러 종류의 프로그램 언어로 쓰여진 “Hello World”프로그램을 모아둔 곳이니 참고하길 바란다:
http://en.wikipedia.org/wiki/Hello_world_program_examples

컴퓨터 프로그래밍 언어가 얼마나 다양한지 보는 것도 재미있는 일이다. (전세계 언어가 다양하듯이..) 상대적으로 복잡해 보이는 언어, 상대적으로 쉽게 "Hello World"를 프로그램할 수 있는 언어들을 비교해 볼 수 있다.

Video: The print function

파이썬에서 출력하는 것은 매우 쉽다는 것을 기억하라. 단순히 print명령어를 괄호()와 함께 사용하면 된다. 괄호 안에 화면에 프린트할 내용을 넣으면 된다. 수학함수나 프로그램이나 괄호 안에 데이터를 입력하여 전달 하는 것은 비슷하다.

수학을 배우는 학생들은 $sin(\theta)=cos(\frac{\pi}{2}-\theta)$와 같은 표현을 위해 괄호를 사용한다 . $sin$ 과 $cos$ 은 함수 이다. 이 함수들에 전달 되는 데이터는 괄호 안에 있다. 우리의 경우와 다른 점이 있다면 우리는 텍스트로 전달 한다는 것 뿐이다.

출력할 문자열을 큰따옴표-double quotes로 둘러 싼 것에 주목하라. 만약 print 명령어가 따옴표로 둘러싼 문자열을 받는다면 컴퓨터는 그냥 쓰여진 데로 출력 할 것이다. 예를 들면, 아래 프로그램은 2+3을 출력한다:

print("2 + 3")

1.2.2 계산 결과 값 출력 하기

다음 프로그램에서는 $2+3$을 따옴표로 묶지 않았기 때문에, 수학적 표현로 간주하여 계산을 수행한다. 2+3이 아닌 5를 출력하게 된다.

print(2 + 3)

아래 코드는 에러를 발생하는데 이유는 “Hello World”를 수학적 표현으로 간주해 계산을 하려 하기 때문이다. 물론 계산이 불가하다:

print(Hello World)

위 코드는 SyntaxError: invalid syntax를 출력하는데 이는 컴퓨터가 “Hello” 와 “World” 가 무슨 의미인지 모르겠다는 것이다.

또한 '은 작은따옴표(single-quote)이고, "은 큰따옴표(double-quote)임을 기억하라. 여러분에게 큰따옴표를 입력하라고 했을 때 하는 흔한 실수가 ""를 입력 하는 것인데 이는 큰큰따옴표(?)라 할 것이다.

1.2.3 다중 아이템 출력

print 문에서는 각 각을 콤마로 구분하면 한 번에 여러 개의 아이템들을 출력 할 수 있다. 아래 코드는 Your new score is 1040를 출력 할 것이다.

print("Your new score is", 1030 + 10)

아래 코드는 Your new score is 1030+10를 출력 한다. 숫자들이 따옴표로 묶여 있기에 계산되지 않는다. 따옴표 안의 모든 것들은 텍스트로서 간주된다. 따옴표 밖의 내용은 수학적 표현이나 프로그램 코드로 간주된다.

print("Your new score is", "1030 + 10")
콤마가 따옴표 안으로? 밖으로?

다음 코드는 동작하지 않는다. 왜냐하면 따옴표와 1030+10 사이를 구분하는 콤마가 없기 때문이다. 언뜻보면 콤마가 있는 것 처럼 보이지만, 콤마가 따옴표 안에 있다. 출력 할 것들을 구분하는 콤마는 반드시 따옴표 밖에 있어야 한다. 만약 콤마를 프린트하고 싶다면 따옴표 안에 넣어야 한다:

print("Your new score is," 1030 + 10)

구분하는 콤마가 제대로 사용되었기 때문에 아래 예제는 정상적으로 동작한다 :
Your new score is, 1040 가 출력 될 것이다.
콤마 하나만 출력됨을 주목하라. 따옴표 밖의 콤마는 구분을 위한 것이고 따옴표 안의 콤마는 그냥 출력되게 된다. 첫번째 콤마는 출력되는 것이고 두번째 콤마는 각 아이템들을 구분하기 위한 것이다.

print("Your new score is,", 1030 + 10)

1.3 탈출 코드

따옴표가 출력될 문자열의 시작과 끝을 알리는 것이라면, 따옴표 자체를 출력하려면 어떻게 하여야 할까? 예를 들어:

print("I want to print a double quote " for some reason.")

fig.escape_codes

이 코드는 동작하지 않는다. 컴퓨터는 중간의 따옴표를 보고 문장의 끝이라고 생각하게 된다. 그 다음 for some reason과 따옴표를 보고 컴퓨터는 어찌 해야 할바를 모르게 된다.

컴퓨터에게 중간의 따옴표는 문자열의 끝을 의미하는 것이 아니라 출력해야 할 텍스트라고 알려 줄 필요가 있다. 방법은 쉬운데, 단순히 백슬래시만 따옴표 앞에 붙여 주면 된다. 예를 보자:

print("I want to print a double quote \" for some reason.")

이 두 조합\"탈출 코드(escape code)라고 부른다. 대부분의 프로그래밍 언어들은 탈출코드를 가지고 있다. 백슬래시가 탈출코드의 일부로서 사용되기 때문에 백슬래시 자체를 단독으로 사용하는 것은 피해야 한다. 아래 코드는 제대로 동작 하지 않는다:

print("The file is stored in C:\new folder")

왜냐하면 \n이 탈출 코드이기 때문이다. 백슬래시를 출력하고자 한다면 다음처럼 사용하라:

print("The file is stored in C:\\new folder")

몇가지 알아 둘만한 탈출코드들이 있다. 아래 표는 중요한 탈출코드들을 보여 준다:
Escape codeDescription
\'Single Quote
\"Double Quote
\tTab
\rCR: Carriage Return (move to the left)
\nLF: Linefeed (move down)

“Carriage Return”과 “Linefeed”는 무엇인가? 다음 예제를 보라:

print("This\nis\nmy\nsample.")

이 명령의 출력은 다음과 같다:

This
is
my
sample.

\n는 라인피드(linefeed)이다. 이는 컴퓨터로 하여금 한 줄 아래 출력 하도록 한다. 컴퓨터는 문자열을 한 줄로 길게 저장하게 되는데, \n를 보고 다음 줄에 인쇄해야 한다는 것을 알게 된다.

좀 더 복잡하게 들여다 보면, 운영체제가 다르면 문장을 끝낼 때 다른 기준을 사용한다.
Escape codesDescription
\r\nCR+LF: Microsoft Windows
\nLF: UNIX based systems, and newer Macs.
\rCR: Older Mac based systems

대부분의 텍스트 편집기들은 이러한 부분을 알아서 처리해 주지만, Microsoft Notepad는 그렇지 않아서 UNIX파일을 Notepad 에서 열면 문장의 끝이 계속 연결되어 있거나, 검은 박스들이 나타나 지져분하게 보일 것이다. 프로그래머들은 컴퓨터에 괜찮은 텍스트 편집기를 설치해서 사용 하는 것이 좋다. Sublime 이나 Notepad++를 추천한다.

1.4 주석(Comments)

주석은 중요하다! (비록 컴퓨터는 주석을 신경쓰지 않지만.)

프로그램 코드를 읽는 사람들에게 별도의 설명을 제공할 필요가 종종 있다. 이를 위해 우리는 코드에 “주석”을 적어 준다. 주석은 컴퓨터를 위한 것이 아니라, 코드를 읽는 사람들을 위한 것이다.

주석을 삽입하는데는 두가지 방법이 있다. 첫번째는 # 기호를 사용하는 것이다. 파이썬은 #로 시작하는 모든 구문은 실행하지 않는다. 예를 들면:

# 이 줄은 주석이다. #표시로 시작된다.
# 컴퓨터는 이 줄을 무시한다.

print("This is not a comment, the computer will")
print("run this and print it out.")

만약 따옴표 사이에 # 표시가 있다면 주석으로 처리 되지않는다. 프로그래머들은 코드라인 앞에 #를 입력하여 해당 라인이 실행되지 않게 할 수 있다. 또한 라인 끝에 주석을 다는 것도 가능하다.

print("A # sign between quotes is not a comment.")

# print("This is a comment, even if it is computer code.")

print("Hi") # This is an end-of-line comment

3개의 작은따옴표를 연속 사용하여 주석의 범위를 정해서 여러 줄을 주석으로 만드는 것도 가능하다.

print("Hi")
'''
This is
a
multi
line
comment. Nothing
Will run in between these quotes.
print("There")
'''
print("Done")

대다수의 전문 파이썬 프로그래머들은 docstrings(인라인 도움말 문자열)이라고 부르는 이런 형태의 다중라인 주석형태를 주로 사용한다. Docstring은 코드와 함께 문서화 작업이 가능하게 하고 나중에 자동적으로 출력 문서, 웹사이트, 통합개발환경(IDE)에서 빠질수 있게 된다. 일반적인 주석방식인 # 태그도 좋은 방법이다.

비록 여러분이 작성한 코드를 여러분만 본다고 하더라고, 주석을 다는 것은 시간을 절약하는데 많은 도움이 된다. 주석을 다는 것은 코드를 읽고 해석할 필요 없이 재빨리 해당 코드블록이 무슨 일을 하는지 기억하게 해준다.

1.5 할당 연산자(Assignment Operators)

Video: The Assignment Operator

게임 점수를 어떻게 저장해야 할까? 혹은 적의 에너지를 상태를 어떻게 기억해 놓을까? 이러한 작업들을 위해서 할당 연산자(assignment operator)가 필요하다.

연산자(operator)+ 또는 -와 같은 심볼이다. 할당 연산자는 = 로 표시한다. 이는 값을 변수(variable)에 저장했다가 나중에 사용할 수 있게 한다. 아래 코드는 변수 x 에 10을 할당하고 난 후, 저장된 x값을 출력할 것이다.

아래 예제를 보자. 어떻게 코드가 동작하는지 확인하기 위해 “Step” 버튼을 눌러보라.

# 변수 x를 생성하고
# 거기에 값 10을 저장한다.
x = 10

# 저장된 x값을 출력한다.
print(x)

# x에 저장된 값이 아닌 문자 x를 출력한다.
print("x")

# "x= 10" 을 출력한다.
print("x=", x)
Variables:
x=
Output:
10
x
x= 10
변수는 따옴표 밖에 사용해야 한다.

Note: 위 예제는 따옴표 안에 있는 x의 출력과 따옴표 밖의 x의 출력이 차이점을 보여 준다. x가 따옴표 안에 있다면, 컴퓨터는 x를 출력하게 된다. 만약 x가 따옴표 밖에 있다면 컴퓨터는 x의 값을 출력한다. “따옴표 안과 밖을”혼동하는 문제는 프로그램을 배우는데 있어서 흔한 현상 중 하나다.

fig.pi

할당문(= 연산자를 사용하는 코드)은 여러분이 수학에서 배웠던 대수적으로 같다 라는 것과는 다른 개념이다. 그 둘을 같다고 혼동하지 마라. 할당연산자의 왼편은 반드시 하나의 변수여야 한다. 그 밖의 다른 것들은 올 수 없다.

할당연산자(=) 오른편은 표현값(expression)이 온다. 이는 계산이 가능한 모든 것이 올 수 있다. 아래 코드를 보자.

x = x + 1

위의 코드는 대수적으로 절대 같다고 할 수 없다. 하지만 컴퓨터에서는 할당 연산자이므로 유효한 표현이 된다. 비록 변수, 숫자, equal 표시를 똑같이 가지고 있지만 수학 방정식과 할당 구문은 다르다.

위 코드에서는 현재의 x값을 취해서 거기에 1을 더한 후 그 값을 다시 x에 저장한다.

더 나아가 아래 예제의 결과는 6을 출력 할 것이다.

x = 5
x = x + 1
print(x)

구문들은 순차적으로 동작한다. 컴퓨터는 “미래의 값을 내다 보지는 않는다.” 아래 코드에서, 컴퓨터는 두번째 라인에서 5를 출력할 것이고, 네번째 라인에서는 6을 출력할 것이다. 두번째 라인에서 x에 1을 더하는 것은 아직 실행되지 않기 때문이다.

x = 5
print(x) # Prints 5
x = x + 1
print(x) # Prints 6

다음 구문은 유효하며 실행도 되지만 의미가 없다. 컴퓨터는 x에 1을 더하지만 저장되지도 출력되지도 않는다.

x + 1

아래 예제는 6이 아니라 5를 출력하게 되는데 이유는 프로그래머가 x + 1의 결과를 다시 변수 x에 저장하는 것을 빠뜨렸기 때문이다.

x = 5
x + 1
print(x)

아래 구문은 equal 표시 왼쪽에 하나의 변수 이외의 다른 값이 있어 잘못된 표현이다:

x + 1 = x

파이썬에서는 다른 형태의 할당연산자도 제공한다. 이러한 연산자들은 프로그래머들이 쉽게 변수 값들을 수정할 수 있도록 해준다. 예를 들면:

x += 1

위 구문은 아래와 같이 쓰는 것과 동일 하다:

x = x + 1

덧셈외에도 뺄셈, 나눗셈, 곱셈을 위한 할당 연산자도 제공된다.

1.6 변수(Variables)

변수는 소문자로 시작한다.

변수는 소문자로 시작하여야 한다. 변수는 대문자나 밑줄(_)로 시작할 수도 있지만, 이는 특별한 경우로 일반적인 경우는 아니다. 첫번째 소문자 뒤에는 대문자, 숫자, 소문자, 밑줄들이 포함될 수 있다. 변수는 공백(space)은 포함하지 않는다.

변수들은 대,소문자에 민감하다. 프로그래머가 이를 고려하지 않으면 혼란스러울 수 있다. 아래 코드에서 5가 아닌 6이 출력되는데 이유는 서로 다른 두변수xX가 있기 때문이다.

x = 6
X = 5
print(x)

파이썬에서 여러개의 단어로 구성된 변수명을 만드는데 권장하는 방식은 밑줄로 구분하는 것이다. 예를 들면, hairStyle보다는 hair_style을 사용하라. 개인적으로, 여러분이 내가 가르치는 학생중 한 명이라면, 나는 이러한 권장안에 대해서 크게 신경쓰지 않는데 이유는 다음에 소개하는 Java와 같은 언어에서는 정확히 반대되는 규칙을 가지고 있기 때문이다. 이 수업에서 나는 Java스타일의 규칙으로 가르치곤 했는데 파이썬 애호가들로 부터 질타의 메일을 받기 시작 했다. 이들은 내 웹사이트에 방문해서 내 스타일이 구리다(?)는 충고을 주기도 했다.

조안 리버스(Joan Rivers-미국의 전설적 여성코미디언)는 이들과 비하면 아무것도 아니다. 그래서 결국 지금은 가이드를 따르려고 노력하고 있다.

권장하는 변수명과 그렇지 않은 명수명에 대한 몇가지 예를 보자:
올바른 변수명 잘못된 변수명 권장하지 않는 변수명
first_name first name FirstName
distance 9ds firstName
ds9 %correct X

MAX_SPEED와 같이 모두 대문자로만 구성된 변수들은 변수의 값이절대 바뀌지 않는 조건에서만 사용된다. 값이 변하지 않는 변수를 상수(constant)라고 한다.

1.7 연산자-Operators

좀 더 복잡한 수학 연산을 위해, 일반적인 수학 연산자들이 제공된다. 몇가지 연산자는 일반적이지 않은 것들도 있다:
operator operation example equation example code
+ addition $3 + 2$ a = 3 + 2
- subtraction $3 - 2$ a = 3 - 2
* multiplication $3 \cdot 2$ a = 3 * 2
/ division $\frac{10}{2}$ a = 10 / 2
// floor division N/A a = 10 // 3
** power $2^3$ a = 2 ** 3
% modulus N/A a = 8 % 3

Video: Operators

“Floor division” 은 나눗셈의 결과를 소수점 아래 값은 버리고 정수 값만을 반환한다. 예를 들면, 11//2 은 5.5가 아니라 5를, 99//100는 0을 반환한다.

수학에서 일반적인 곱셈 표기는 파이썬에서 동작하지 않는다. 다음 두 라인의 코드는 동작 하지 않는다:

# These do not work
x = 5y
x = 5(3/2)

위의 코드가 동작하게 하려면 곱셈 연산자를 사용해야 한다:

# These do work
x = 5 * y
x = 5 * (3 / 2)

1.7.1 연산자 사이의 공백

연산자 앞 뒤로의 몇개의 공백이 오더라도 컴퓨터가 이해하는데는 문제가 없다. 아래 세개의 코드는 동일 하다:

x=5*(3/2)
x = 5 * (3 / 2)
x      =5     *(    3/   2)

파이썬에서 권장하는 코딩 스타일은 연산자 앞, 뒤로 공백을 하나씩 두는 것이다. (궁금하다면 PEP-8 이라고 부르는 파이썬 공식 코딩 스타일 가이드를 참고해보라: PEP-8.) 위의 3줄의 코딩에서 두번째 줄이 가장 파이썬 다운 스타일이라 할 수 있겠다.

1.8 연산 순서

파이썬에서 연산 순서는 일반적인 수학에서의 연산 순서와 동일하게 적용된다. 예를 들어 이 방정식은 제대로 평균값을 구하지 못한다:

average = 90 + 86 + 71 + 100 + 98 / 5

제일 처음 98/5가 수행 된다. 컴퓨터가 계산하는 것은 아래의 식이다:
$90+86+71+100+\frac{98}{5}$

우리가 원했던 것은 아래의 식이었다:

$\dfrac{90+86+71+100+98}{5}$

괄호를 사용하여 이와 같은 문제점을 해결 할 수 있다:

average = (90 + 86 + 71 + 100 + 98) / 5

1.9 삼각 함수

삼각함수는 사인(sine)과 코사인(cosine)값을 계산하는데 사용된다. 기본적으로 파이썬은 사인, 코사인 계산기능이 없지만, 해당 라이브러리를 적재(import)하면 가능하다. 단위는 라디안(radian)을 사용한다.

# math 라이브러리를 적재한다.
# 해당 라인은 프로그램 제일 위쪽에 
# 한번만 호출되면 된다.
from math import *

# sine 과 cosine 값을 이용해 x를 계산한다.
x = sin(0) + cos(0)

1.10 방정식 계산

10.5 갤런(gallon)으로 294마일(mile)을 주행한 자동차 연비 계산에 파이썬을 사용 할 수 있다.

m = 294 / 10.5
print(m)

이 프로그램을 변수를 사용해서 개선 해보자. 이렇게 함으로써 방정식의 수정 없이 쉽게 코드상에서 값들을 바꿀수 있다.

m = 294
g = 10.5
m2 = m / g # This uses variables instead
print(m2)
좋은 변수명을 사용하는 것이 중요하다

이 프로그램만 봐서는 바로 이해하기가 쉽지 않다. 변수mg는 별도 설명이 없다면 무엇을 의미하는지 알 수가 없다. 적절한 이름의 변수를 사용하는 것 만으로도 프로그램을 훨씬 이해하기 쉽게 만들 수 있다:

miles_driven = 294
gallons_used = 10.5
mpg = miles_driven / gallons_used
print(mpg)

이제 프로그래머가 아닌 사람이 봐도 무엇을 하는 코드인지 알 수 있을 것이다. 변수 이름을 제대로 사용한 예와 그렇지 않은 또다른 예제를 살펴 보자:

# Hard to understand
ir = 0.12
b = 12123.34
i = ir * b

# Easy to understand
interest_rate = 0.12
account_balance = 12123.34
interest_amount = interest_rate * account_balance
Video: Creating a custom calculator program

IDLE 에디터에서는 다시 타이핑 하지 않고 이전의 명령어들을 편집하는 것이 가능하다. 다시 사용하고자 하는 명령이 있는 라인으로 커서를 옮겨서 “enter” 키만 치면 된다. 그 라인이 현재 라인에 복사될 것이다.

파이썬 코드를 >>> 프롬프트에 입력하는 것은 다소 느리고 한 번에 한 줄만 수행이 된다. 또한 저장해서 다른 사람이 사용 할 수 있도록 하는 것도 불가능하다. 다행히도 파이썬 코드를 입력하는 더 나은 방법이 있다.

스크립트를 사용해서 파이썬 코드를 입력할 수 있다. 스크립트는 일련의 파이썬 코드의 모음으로 한번에 모든 코드가 실행된다. 스크립트를 생성하려면 Figure 1.2에 보이는 것 처럼 새 창(new window)을 연다.

fig.entering_a_script
Figure 1.2: Entering a script

Wing IDE 이나 PyCharm과 같은 프로그램을 사용해서 스크립트를 생성할 수도 있다. 이런 프로그램들은 기본적으로 제공되는 파이썬의 IDLE 환경보다 사용하기 쉽고 기능도 더욱 강력하다.

연비를 계산하는 프로그램을 작성하여 파일로 저장 해 보라. 작성한 파일을 플래시 드라이브, 네트워크 드라이브 또는 여러분이 선택한 공간에 저장하라. 파이썬 프로그램은 항상 .py 확장자를 붙여 저장해야 한다. Figure 1.3를 보라.

fig.saving_mpg_calculator
Figure 1.3: Saving a script

“Run” 메뉴를 클릭하고 “Run Module”을 선택하여 저장한 프로그램을 실행 시켜보라. 소비된 연료량과 주행한 거리를 다른 값으로 바꿔가면서 실행을 해보라.

주의 할 것, 흔히 하는 실수!

지금 부터는 가능한 모든 코드는 스크립트로 작성하길 바란다. IDLE >>> 프롬프트에 여러분의 프로그램을 입력하지 말라. 여기에 입력한 코드는 저장되지 않는다. 이 경우 프로그램을 닫으면 처음부터 다시 시작해야 한다. 신참 프로그래머들하는 흔한 실수이다.

이 프로그램을 사용자와의 상호작용을 통해 주행거리와 소모된 연료값을 입력 받을 수 있게 한다면 좀 더 유용하게 바꿀 수 있을 것이다. 이 부분은 input 명령을 사용하여 해결 할 수 있다. 아래 코드를 보라:

# This code almost works
miles_driven = input("Enter miles driven:")
gallons_used = input("Enter gallons used:")
mpg = miles_driven / gallons_used
print("Miles per gallon:", mpg)

이 프로그램을 실행시키면 사용자에게 주행거리(mile)와 사용한 연료량(gallon)을 입력하라고 요청한다. 하지만 Figure 1.4와 같이 이상한 에러를 출력하게 된다.

fig.mpg_program_error
Figure 1.4: MPG 프로그램 실행 시 에러

이 에러의 원인을 설명하기 위해 프로그램을 조금 바꿔 보자:

miles_driven = input("Enter miles driven:")
gallons_used = input("Enter gallons used:")
x = miles_driven + gallons_used
print("Sum of m + g:", x)

위 코드를 실행시키면 Figure 1.5와 같이 결과가 나온다.

fig.mpg_incorrect_addition
Figure 1.5: 잘못된 덧셈

두 개 숫자를 더하는 것이 아니라 단순히 처음 입력된 숫자 옆에 두번째 숫자를 붙여 출력한다. 이는 프로그램이 사용자가 숫자를 입력할 것이라는 것을 모르기 때문이다 사용자가 “Bob” 과 “Mary”를 입력할 수도 있고 이 두 변수를 함께 더해서 “BobMary”라고 출력하는 것이 좀 더 합리적일 수 있다.

입력값은 반드시 숫자로 변환되어야 한다

컴퓨터에게 입력된 것이 숫자라고 알려 주기 위해서, int( )float( )함수로 input 결과를 처리해 줄 필요가 있다. 정수형을 위해서는 int를 실수형을 위해서는 float를 사용하라.

최종 수정된 프로그램:

# Sample Python/Pygame Programs
# Simpson College Computer Science
# http://programarcadegames.com/
# http://simpson.edu/computer-science/

# Explanation video: http://youtu.be/JK5ht5_m6Mk

# Calculate Miles Per Gallon
print("This program calculates mpg.")

# Get miles driven from the user
miles_driven = input("Enter miles driven:")
# Convert text entered to a
# floating point number
miles_driven = float(miles_driven)

# Get gallons used from the user
gallons_used = input("Enter gallons used:")
# Convert text entered to a
# floating point number
gallons_used = float(gallons_used)

# Calculate and print the answer
mpg = miles_driven / gallons_used
print("Miles per gallon:", mpg)

Variables:
milesDriven=
gallonsUsed=
mpg=
Output:
This program calculates mpg.
Enter miles driven: 288
Enter gallons used: 15
Miles per gallon: 19.2

또 다른 예제로 물체의 운동에너지를 계산하는 프로그램 이다:

# Sample Python/Pygame Programs
# Simpson College Computer Science
# http://programarcadegames.com/
# http://simpson.edu/computer-science/

# Calculate Kinetic Energy

print("This program calculates the kinetic energy of a moving object.")
m_string = input("Enter the object's mass in kilograms: ")
m = float(m_string)
v_string = input("Enter the object's speed in meters per second: ")
v = float(v_string)

e = 0.5 * m * v * v
print("The object has " + str(e) + " joules of energy.")

프로그램을 간략히 하기 위해 input 구문을 float 구문으로 둘러쌓아 주는 것도 가능하다. 아래 예를 보자:

milesDriven = input("Enter miles driven:")
milesDriven = float(milesDriven)

이렇게 작성해도 똑같이 수행된다:

milesDriven = float(input("Enter miles driven:"))

이 경우 input 함수의 결과가 곧바로 float 함수 입력으로 들어간다. 어떻게 작성하든 정상적으로 동작하며 본인이 좋아하는 방식으로 사용하면 된다. 두 가지 형태를 모두 이해하는 것이 중요하다.

1.11 Review

1.11.1 Multiple Choice Quiz

Click here for a multiple-choice quiz.

1.11.2 Short Answer Worksheet

Click here for the chapter worksheet.

1.11.3 Lab

Click here for the chapter lab.


You are not logged in. Log in here and track your progress.