━━━━ ◇ ━━━━
따라하며 배우는 파이썬과 데이터 과학/PART 1. 파이썬 기초체력 다지기

Chapter 02. 값을 담아 다루어 보자

이번 시간의 목차

1. 데이터를 저장하고 싶다면 변수를 만들자!

2. 변수의 이름은 막 지어도 되는 걸까?

3. 변수를 쓰면 좋은 점이 뭘까?

4. 자료형이 무엇일까?

5. 문자열의 세계로

6. 자료형을 바꾸고 싶어!

7. 네 정보를 알려 줘! input() 함수

8. 컴퓨터가 만능인 건 아니구나?

9. 마무리

 

 

 

자, 가자! 파이썬의 세계로!


 

데이터를 저장하고 싶다면 변수를 만들자!

 

 1장에서 설명했듯, 세상에는 다양하고 방대한 데이터가 존재한다. 이러한 데이터를 쉽고 빠르게 처리하려면 데이터를 저장해서 필요할 때마다 꺼내서 사용해야 한다. 파이썬에서는 변수(Variable)에 데이터를 저장한다. 컴퓨터의 메모리(Memory) 공간에 이름을 붙여서 정수, 실수, 문자열 등의 자료값을 저장할 수 있다. 꺼내는 건 간단하다. 그냥 변수의 이름을 적어주면 된다. 한 변수에 든 자료값을 바꾸고 싶으면 언제든 정정하면 쉽게 바꿀 수 있기 때문에 하는 라는 이름이 붙었다. 

 

 예를 들어 10 km/h로 도로를 달리는 사람의 속력을 v라는 이름의 변수에 저장한다고 하자. 다음과 같이 입력하면 변수가 저장된다.

 

>>> v - 10
>>> v
10
cs

 

이렇게 v라는 변수에 10이라는 데이터가 저장되었다. 

 이때 등호(=)는 할당연산자 혹은 대입연산자라고 부르고, 좌변과 우변이 같다는 의미가 아닌 우변의 값을 좌변에 있는 v라는 변수에 저장하라는 의미를 갖는다. 

 

 변수의 값을 바꾸고 싶을 때에는 똑같이 등호를 사용하여 변수를 정정해주면 된다. 

 
>>> v - 10
>>> v = 30
>>> v 
30
cs

 

 처음에는 v에 10이라는 값을 넣어줬지만, v = 30으로 정정해주니 v에 30이라는 값이 저장되었다. 

 

 한 번에 여러 변수를 선언해서 동시에 값을 줄 수도 있다. 이때 사용된 문장은 동시 할당문이라 한다. 이렇게 설정된 변수끼리는 아래와 같이 덧셈이나 뺄셈 연산도 가능하다. 

>>> x = 150
>>> y = 180
>>> x, y
(150180)
>>> x, y = 160200     #동시에 여러 변수를 선언하고 할당할 수 있다.
>>> x, y
(160200)              #x와 y에 160과 200이라는 값이 저장된다. 
>>> z = x + y           #정수값이 저장된 변수끼리는 연산도 할 수 있다.
>>> z
360
cs

 

 

 지금까지는 변수에 숫자 데이터만 담아 봤지만, 이제는 문자열도 한 번 넣어보자. 

1장에서 언급했듯, 큰 따옴표 또는 작은따옴표로 싸인 문장은 문자열이 된다. 파이썬에서는 문자열 데이터를 객체라는 용어로 부르고, 문자열을 넣은 변수는 객체를 지칭하는 꼬리표가 되는 셈이다. 

 

>>> s1 = 'Hello Everyone!'
>>> s1
'Hello Everyone!'
>>> len(s1)                  #s1 문자열의 길이를 알려주는 함수.
15
>>> s2 = 'Hello'
>>> s3 = "Everyone!"
>>> s2 + s3                  #문자열에 + 연산자를 쓰면 두 문자열을 이어준다.
'HelloEveryone!'
>>> s4 = '100'
>>> s5 = '200'
>>> s4 + s5
'100200'                     #s4와 s5는 문자열 데이터다!
cs

 

변수의 이름은 막 지어도 되는 걸까?

 

 

 
>>> x = 2000         #오락실에서 게임을 2판 했다.
>>> y = 8500         #저녁으로 햄버거를 사 먹었다.
>>> z = 5400         #후식으로 음료를 사 마셨다.
>>> w = (x + y + z)  #이건 오늘의 지출.
>>> w
15900
cs

 

 “데이터를 저장하는 것이 변수라는 것은 이제 알겠어. 그렇다면 변수의 이름은 짓고 싶은대로 지으면 되는 거지?”

 

 아니! 그 전에 식별자(Identifier)에 대해서 먼저 알아야 한다. 변수의 이름은 식별자의 일종으로, 변수와 변수들을 구분하는 역할을 한다. 그러므로 변수의 이름을 지을 때에는 변수의 역할을 가장 잘 설명하는 이름으로 지어야 한다. 막 짓고 나서 나중에 돌아보면 코드를 짠 사람도 이해 못하는 경우가 종종 생기기 마련이다. 

 

 이때, 식별자는 다음의 규칙을 따른다. 

 

  • 식별자는 문자와 숫자, 밑줄 문자(_)로 이루어지며, 이 외의 특수문자는 쓸 수 없다.
  • 식별자의 첫 글자는 숫자가 될 수 없으며, 중간에 공백을 포함해서는 안 된다.
  • 대소문자는 구별된다. (첫 장에서 예를 들었듯, print와 PRINT는 서로 다르게 취급된다.)
  • 파이썬의 예약어(키워드)는 식별자로 쓸 수 없다

 

예약어의 종류는 아래의 31개가 있다. 

 

and as assert break class continue def del
elif  else except exec finally for from global
if import in is lambda not or pass
print raise return try while with yield  

 

위에서 설명한 규칙과 주의사항을 잘 생각해서 맨 위에서 설정한 변수를 바꾸면 아래와 같이 나타낼 수 있다.

 

>>> play = 2000               #오락실에서 게임을 2판 했다.
>>> dinner = 8500             #저녁으로 햄버거를 사 먹었다.
>>> dessert = 5400            #후식으로 음료를 사 마셨다.
>>> total = (play + dinner + dessert)  #이건 오늘의 지출.
>>> total
15900
cs

 

 


 

변수를 쓰면 좋은 점이 뭘까?

 

 변수를 쓸 때의 장점은 크게 두 가지로 나누어 볼 수 있다. 

 

  1. 이해하기 쉬우며 수정하기 쉽다.
  2. 데이터가 변경되어도 일의 방법은 바꿀 필요 없다. 

 

 BMI 계산으로 예를 들어보자. BMI는 kg 단위로 측정한 몸무게를 m 단위로 측정한 키의 제곱으로 나누면 구할 수 있다. 어떤 사람의 키가 180 cm, 78.2 kg라고 했을 때의 BMI는 이렇게 나타낼 수 있겠다. 

 

>>> 78.2 / 1.80 ** 2    #지수는 ** 연산자를 통해 나타낼 수 있다.
24.1358024691358
cs

 

 하지만 이렇게 나타내면 이 사람의 키나 몸무게가 늘고 줄었을 때 새로 BMI를 구하기가 번거롭다. 값을 일일이 바꿔 줘야하는 것은 물론이며, 지금은 간단한 계산이지만 복잡한 코드를 짤 때 어느 부분을 고쳐야 할지 헤매는 일이 생길 수 있다. 

대신 몸무게와 키, 그리고 BMI를 변수로 저장해 둔다면 어떨까?

 

>>> weight = 78.2
>>> height = 1.80
>>> BMI = weight / height ** 2
>>> BMI
24.1358024691358
 
>>> weight = 80    #몸무게와 키를 바꿔 봤다.
>>> height = 1.85
>>> BMI = weight / height ** 2
>>> BMI
23.37472607742878
cs

 

 이처럼 변수를 사용하면 가독성이 늘 뿐만 아니라 이 코드의 목적이 무엇인지 파악하기도 쉽다. 또, 몸무게와 키는 바뀌어도 BMI를 계산하는 방법은 바뀌지 않기 때문에 스크립트를 다시 실행해주기만 하면 변경된 데이터로 새 BMI를 계산해낼 수 있다.


 

자료형이 무엇일까?

 

>>> number = 10
>>> word = 'words'
>>> number + word 
cs

 

 number에는 정수 10을, word에는 문자열 'word'를 저장해봤다. 위의 코드를 입력하면 어떤 결과가 나올까?  

 

>>> number = 10
>>> word = 'words'
>>> number + word 
Traceback (most recent call last):
  File "<pyshell#27>", line 1in <module>
    10 + 'word'
TypeError: unsupported operand type(s) for +'int' and 'str'
cs

 

 어쩌면 당연하게도 오류 문구가 뜬다. 

오류 문구에서 type과 int, str에 주목하자. 두 변수끼리 + 연산자를 쓸 수 없는 이유는 바로 두 변수의 자료형(Data Type)이다르기 때문이다. 자료형은 프로그램에서 사용할 수 있는 데이터를 말하는데, 파이썬에서 다루는 가장 단순한 기본 자료형은 아래의 4가지가 있다. 

 

자료형 설명 예시
정수(int) 정수로 된 숫자. -2, -14, 0, 25, 100…
실수(float) 실수로 된 숫자. 3.14, 0.00009, 1.414…
문자열(str) 따옴표로 싸인 문자 'word', "Hello World!", '1.414', '자료형'
부울형(bool) 참과 거짓 True, False

 

 이 외에도 리스트, 튜플, 딕셔너리, 집합 등의 다양한 자료형이 있지만 후에 상세하게 다룰 것이니 지금은 생략한다. 더 자세히 알고 싶다면 이쪽(https://www.w3schools.com/python/python_datatypes.asp)을 참고하자. 

 

 다른 언어에서는 변수를 선언할 때 따로 자료형을 지정해줘야 하지만 파이썬에서는 따로 지정할 필요 없이 다양한 자료형을 저장 및 수정할 수 있다. 파이썬은 프로그램이 시작한 이후 변수에 값을 넣을 때 자료형이 정해지는 동적 형결정(Dynamic Typing)을 쓰기 때문이다. 앞에서 말했듯 자료형을 지정해주는 번거로움이 없지만, 위의 예시처럼 정수와 문자열끼리 +연산자를 사용하는 등 옳지 않은 연산을 할 경우 오류가 발생할 수 있으니 주의해야 한다. 

 

 자료형을 알고 싶다면 type() 함수를 사용하면 된다. 위의 예시에 나왔던 number와 word의 자료형을 확인해보자.

 

>>> number = 10
>>> word = 'words'
>>> type(number)
<class 'int'>    #int는 정수를 의미한다.
>>> type(word)
<class 'str'>    #str은 문자열을 의미한다.
cs

 

 이렇게 자료형을 바로바로 반환해주는 것을 볼 수 있다. 

 

 그런데, 자료형이 다른 게 무슨 의미가 있는 걸까? 아래의 예시를 잠시 살펴보자.

 

>>> print(100 + 200)
300
>>> print('100' + '200')
100200
cs

 

 정수로 된 100과 200에 + 연산자를 사용했을 때와 문자열 '100'과 '200'에 + 연산자를 사용했을 때의 결과가 다르다. 이렇게 자료형이 다르면 각종 연산의 의미가 완전히 달라지기 때문에 변수의 자료형을 잘 구분하여 사용할 필요가 있다. 

 


 

문자열의 세계로

 

 컴퓨터에서는 물론 숫자도 중요하지만, 컴퓨터를 조작하는 인간은 주로 텍스트를 사용하여 정보를 다루기 때문에 프로그래밍을 할 때 텍스트 처리도 중요한 사항 중 하나이다. 앞서 말했지만, 이 텍스트를 프로그래밍 언어로는 문자열이라고 한다. 문자열에는 'b', 'word', '안녕하십니까', '365' 등 숫자나 알파벳 등 뿐만 아니라 우리 눈에 보이지 않는 공백이나 탭(Tab), 줄바꿈 등도 문자열의 일부가 된다. 

 

 파이썬에서는 이 문자열을 아주 간단하고 직관적으로 다룰 수 있다. 이 역시도 후에 자세하게 배우게 될 테니, 우선은 문자열의 기초부터 알아보도록 하자. 

 

>>> 'Today is May 26th.'
'Today is May 26th.'
>>> now = 'Today is May 26th.'
>>> now
'Today is May 26th.'
>>> print(now)
Today is May 26th.
>>> 'Today is May 26th."
SyntaxError: EOL while scanning string literal
cs

 

 앞에서 간간이 해 봐서 알겠지만, 큰 따옴표나 작은따옴표로 감싸면 문자열로 취급한다. 문자열은 변수에 저장될 수 있으며, 저장된 문자열은 변수 이름 또는 print(변수 이름)으로 불러올 수 있다. 

 

 이때 문자열의 양 끝에 작은따옴표와 큰 따옴표를 섞어서 붙이면 위처럼 오류가 발생한다. 오류 문구 중 EOL은 End Of Line의 약자로, 'Today is May 26th."라는 문장을 작은따옴표로 시작했으므로 문자열을 끝내는 작은 따옴표를 찾아봤으나, 줄의 끝까지 찾아도 없었다는 뜻이다. 즉, 작은따옴표로 시작한 문장을 큰 따옴표로 끝낼 수 없다. 

 

 

“그런데, 이렇게 헷갈릴 거면 작은 따옴표 하나만 쓰면 안 되나?”

 

 

 분명 이런 의문이 들 테다. 그렇다면 예시를 들어보자. 

 

 

>>> myself = Hello
Traceback (most recent call last):
  File "<pyshell#49>", line 1in <module>
    myself = Hello
NameError: name 'Hello' is not defined
>>> myself = 'Hello! I'm studying Python. I'm enjoying now!'
SyntaxError: invalid syntax
cs

 

 첫 줄처럼 따옴표를 쓰지 않으면 Hello라는 이름이 정의되지 않았다는 문법 오류가 발생한다. 파이썬에서는 따옴표가 붙지 않은 단어를 변수로 취급하기 때문에 Hello라는 이름의 변수가 없다고 받아들이고 위와 같은 오류 문구를 보내는 것이다. 

 

 그래서 따옴표를 붙이긴 해야 하는데, 만약 큰 따옴표 없이 두 번째 문장처럼 작은따옴표만 사용해서 문자열을 정의하게 되면 작은따옴표로 시작해서 다음 작은따옴표가 나오는 곳까지를 문자열로 인식해서 문자열(초록 글씨) 사이의 m studying Python. I는 알 수 없는 명령어 또는 변수로 인식한다. 

 

 

>>> myself = "Hello! I'm studying Python. I'm enjoying now!"       #큰 따옴표와 작은따옴표를 번갈아 쓰면 오류가 나지 않는다.
>>> myself 
"Hello! I'm studying Python. I'm enjoying now!"
>>> print(myself)
Hello! I'm studying Python. I'm enjoying now!
>>> print('Hello! I\'m studying Python. I\'m enjoying now!')       #또는 작은따옴표 앞에 역슬래시(\)를 붙여도 된다.
Hello! I'm studying Python. I'm enjoying now!
>>> print('Hello! I\'m studying Python. \t I\'m enjoying now!')    #\t는 탭 문자를 표시한다.
Hello! I'm studying Python.      I'm enjoying now!
>>> print('Hello! I\'m studying Python. \n I\'m enjoying now!')    #\n은 줄바꿈을 표시한다.
Hello! I'm studying Python.
I'm enjoying now!
cs

 

 이를 피하려면 큰 따옴표와 작은따옴표를 번갈아가며 쓰거나, 시작한 따옴표와 같은 따옴표 앞에 역슬래시(\)를 붙여주면 오류가 나지 않는다. 역슬래시는 특수한 문자를 표기하는 데에 사용된다. 특히 \t는 탭 문자를, \n은 줄바꿈을 표시해준다. 역슬래시를 출력하려면 2개를 연속해서 써 주면 된다. 

 


 

자료형을 바꾸고 싶어!

 

 잠시 조금 전 봤던 number와 word 사이의 + 연산자 사용으로 돌아가보자.

 

>>> number = 10
>>> word = 'words'
>>> number + word
Traceback (most recent call last):
  File "<pyshell#57>", line 1in <module>
    number + word
TypeError: unsupported operand type(s) for +'int' and 'str'
cs

 

 우리는 이제 이 명령이 왜 오류를 내는지 알고 있다. 'words'를 숫자로 바꿀 수는 없으니 10을 문자열로 바꾸면 될 것 같은데… 어떻게 하면 바꿀 수 있을까? 간단하다. str() 함수를 사용하면 된다. 

 

 

>>> number_str = str(number)
>>> type(number_str)
<class 'str'>
cs

 

 str() 함수는 괄호 속에 있는 데이터(여기서는 number라는 변수에 저장된 10이다.)를 문자열로 바꿔서 반환한다. 실제로 str(number)라는 데이터를 저장한 number_str이라는 변수의 자료형을 type() 함수로 확인해 보니 'str', 즉 문자열로 바뀌어 있다. 

 

 문자열을 정수 또는 실수로 바꾸고 싶다면 int(), 그리고 float() 함수를 사용하면 된다. 아래처럼 int()는 정수로, float()는 실수로 바꿔주는 역할을 한다. 

 

>>> n1 = '1024'
>>> n2, n3 = int(n1), float(n1)
>>> print(n2, n3)
1024 1024.0
cs

 

네 정보를 알려 줘! input() 함수

 

 이때까지 다양한 변수에 데이터를 담고 연산을 해 봤는데, 계속 변수에 직접 프로그램을 짜는 사람이 값을 집어 넣으면 많은 문제가 생길 것이다. 그렇다면 필요한 값을 사용자에게 직접 물어 입력하도록 하면 어떨까? 이럴 때에 쓰는 함수가 바로 input() 함수이다. 

 

input_string = input(output_string)
cs

 

 위처럼 입력하고 실행하면 괄호 속 output_string에 담긴 문자열이 출력되고 사용자의 입력을 기다리게 된다. 입력하고 싶은 것을 입력하고 엔터키를 누르면 입력받은 문자를 하나의 문자열로 만들어 input_string에 저장하게 된다. 

 

 간단하게 예시를 들어보자. 

 

>>> name = input('당신의 이름은 무엇인가요? : ')
당신의 이름은 무엇인가요? : 손오공
>>> name
'손오공'
cs

 

 이렇게 name에 '손오공'이라는 이름이 저장되는 것을 볼 수 있다. 

조금 더 응용해서 입력받은 문자열을 정수로 바꿔 연산까지 해 보자. 

 

= int(input('첫 번째 정수를 입력하시오: '))
= int(input('두 번째 정수를 입력하시오: '))
= x + y
print(x, '과', y, '의 합은', z, '입니다.')
cs

 

입력받은 문자열을 정수로 바꾸려면 아까 배웠던 int() 함수로 input(~)을 감싸주면 된다. 실수 값으로 바꾸고 싶다면 float()로 감싸면 된다. 

 


 

컴퓨터가 만능인 건 아니구나?

 

 척 보면 컴퓨터는 사람이 손으로 일일이 계산할 시간에 일반 계산기로도 해낼 수 없는 계산을 한 번에 해내기도 한다. 하지만 이런 컴퓨터에게도 한계가 있다. 예를 들어볼까? 기약 분수 중에서도 1/3 같이 분모의 인수에 2와 5가 포함되지 않은 분수의 경우 소수로 나타낼 시 무한 소수로 나타낼 수 있다. 그렇다면 컴퓨터도 1/3을 0.33333333333… 같은 무한 소수로 나타내는 걸까? 

 

>>> 1/3
0.3333333333333333
cs

 

 답은 '아니오'이다. 컴퓨터의 저장공간은 유한하기 때문에 무한을 표현할 수는 없다. 대신 0.33333333333… 이라는 값과 비슷한 0.3333333333333333이라는 근사치를 표현한다. 한마디로 컴퓨터에서 미세한 수치오류는 불가피한 것이다. 

 

 그래서 여러가지 계산을 하다 보면 아래와 같은 황당한 상황이 일어나기도 한다. 이런 상황이 일어날 것을 항상 염두에 두고 프로그램을 작성해야 한다.

 

>>> 0.1 + 0.1 == 0.2       #이때 == 연산자는 양변을 비교하여
True                       #같으면 True, 다르면 False를 반환한다.
>>> 0.1 + 0.1 + 0.1 == 0.3
False
>>> 0.1 + 0.1 + 0.1        #우리가 아는 값과 다른 값이 나온다! 
0.30000000000000004
cs

 

 이런 오류가 있기는 하지만, 파이썬은 시스템의 메모리가 허용하는 한도 내라면 얼마든지 큰 수를 표현할 수 있다는 장점도 갖고 있다. 10의 100제곱은 손으로 쓰려면 0을 100번이나 적어야 하는 큰 수이지만, 파이썬은 이까지도 표현할 수 있다. 

 

>>> 10 ** 100  #이때 ** 연산자는 뒷 숫자를 앞  지수로 올려준다. 
1000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
cs

 

 


 

마무리

 

  이번 시간에는 변수라는 개념과 다양한 자료형에 대해 알아보았다. 

마지막으로 2장의 심화 문제 2.4, 2.5, 2.8, 2.9를 풀어보고 마치도록 하자. 해답 코드는 접은글에 적어두었다. 저번 시간에도 얘기했지만, 정답이 정해져 있는 것은 아니니, 해답 코드는 참고만 하도록 하자. 

 

2.4: width와 height라는 변수에 각각 40, 20 값을 할당한 후 이 두 변수를 이용하여 곱셈 연산자를 정용한 후 다음과 같이 삼각형의 면적(area)을 구하는 프로그램을 작성하시오. 

삼각형의 면적 : 400.0
cs

 

더보기
width, height = 4020           #동시 할당문을 사용하면 편리할 것이다.
area = width * height * 0.5      #1/2를 곱하고 싶다면 0.5 대신 (1/2)를 써도 좋다.
print('삼각형의 면적 : ', area)
cs

 

 

2.5 정사각형의 면적을 구하기 위하여 사용자로부터 밑변의 길이를 정수로 입력받아서 다음과 같이 출력하시오. (힌트: 정수값 입력을 받기 위하여 int(input('정사각형의 밑변을 입력하시오 : '))를 사용함.)

정사각형의 밑변을 입력하시오 : 40
정사각형의 면적 :  1600
cs

 

더보기
under = int(input('정사각형의 밑변을 입력하시오 : '))
area = under * under   #또는 under ** 2 도 좋다. 
print('정사각형의 면적 : ', area)
cs

 

 

2.8 섭씨온도(celsius)를 화씨온도(fahrenheit)로 변환하는 식은 다음과 같다. 

farenheit = (9/5* celsius + 32
cs

이 식을 바탕으로 섭씨온도를 0도에서 50도까지 10도 단위로 증가시키면서 이에 해당하는 화씨온도를 다음과 같이 출력하는 프로그램 cel2fah.py를 작성하시오. 

섭씨  화씨
0 32.0
10 50.0
20 68.0
30 86.0
40 104.0
50 122.0
cs
더보기
 
print('섭씨 ''화씨')
 
celsius = 0
fahrenheit = (9/5* celsius + 32
print(celsius, fahrenheit)
 
celsius = 10
fahrenheit = (9/5* celsius + 32
print(celsius, fahrenheit)
 
celsius = 20
fahrenheit = (9/5* celsius + 32
print(celsius, fahrenheit)
 
celsius = 30
fahrenheit = (9/5* celsius + 32
print(celsius, fahrenheit)
 
celsius = 40
fahrenheit = (9/5* celsius + 32
print(celsius, fahrenheit)
 
celsius = 50
fahrenheit = (9/5* celsius + 32
print(celsius, fahrenheit)
cs

 

 

2.9: 앞서 다룬 섭씨온도를 화씨온도로 변환하는 식을 바탕으로 사용자로부터 섭씨온도를 입력받아서 다음과 같이 화씨온도로 출력하시오.

섭씨온도를 입력하세요 : 30
섭씨 30 도는 화씨 86.0 도 입니다. 
cs

 

더보기
celsius = int(input('섭씨온도를 입력하세요 : '))
fahrenheit = (9/5* celsius + 32
print('섭씨 ', celsius, '도는 화씨 ', fahrenheit, '도 입니다.')
cs
COMMENT