F37.101 컴퓨팅 기초: 처음 만나는 컴퓨팅(First Adventures in Computing)
Chapter 2. 입출력과 타입변환#
이 장에서는 변수, 주석을 처리하는 방법, 데이터를 입력하고, 출력하는 방법, 데이터 타입을 변환하는 방법에 대해 알아본다.
학습목표와 기대효과
학습목표
변수를 만들어 데이터를 저장해보고 변수의 의미를 알아보자.
주석을 달아보자.
데이터를 출력하는 print() 함수에 대해 배워보자.
데이터를 입력받는 input() 함수에 대해 배워보자.
형변환 함수에 대해 알아보자.
기대효과
데이터를 입,출력할 수 있으며 데이터의 특성을 이해하고 타입을 변환할 수 있다.
변수(Variable)#
숫자가 숫자로만 존재하거나, 문자가 문자로만 남아있다면 활용성이 떨어진다. 프로그래밍에서는 숫자, 문자 등의 값(value)를 변수에 저장해 놓으면 훨씬 활용성을 높일 수 있다.
변수란 값을 저장하기 위한 이름을 가진 저장공간이며, 대입 연산자 기호인 =를 이용하여 값을 저장한다.
r = 10
pi = 3.14
S = pi * (r**2)
print(f'반지름 {r}의 원의 넓이는 {S}입니다.')
반지름 10의 원의 넓이는 314.0입니다.
변수는 필요한 만큼 여러개를 만들어 사용할 수 있다. 단 변수명을 지을때는 몇 가지 규칙이 있다.
변수명 짓는 규칙#
대소문자를 서로 다른 변수로 구별한다.
문자, 숫자, _(under bar)로 이루어진다.
변수명에 공백이 들어갈 수 없다.
숫자로 시작할 수 없다.
예약어는 사용할 수 없다.
이미 만들어진 내장함수, 클래스 이름은 피하자.
예약어란 파이썬에서 내장되어 이미 사용하기로 정의된 키워드를 의미한다. 참고로 아래 코드를 통해 파이썬의 예약어와 개수를 확인해보자.
import keyword
print(keyword.kwlist)
print(len(keyword.kwlist))
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
35
Valid names
myvar = "Byun"
my_var = "Byun"
_my_var = "Byun"
myVar = "Byun"
MYVAR = "Byun"
myvar2 = "Byun"
Invalid names
2myvar = "Byun" #숫자로 시작할 수 없다.
my-var = "Byun" #_이외의 특수문자가 들어갈 수 없다.
my var = "Byun" # 공백이 들어갈 수 없다.
if = "Byun" #예약어는 사용할 수 없다.
파이썬에는 미리 기능을 만들어 놓은 내장함수, 클래스가 매우 많다.(예, print(), input(), str(), int(), …)
내장함수명이나 클래스명을 변수명으로 사용하지 말자. 미리 정의되어 있는 내장함수명이나 클래스명을 변수명으로 사용하면 원래 정의된 기능이 제 기능을 하지 못한다. 예를들어 아래와 같이 작성하면 기존에 정의된 기능이 동작하지 않게 된다.
print=’hello’
input=input()
str=’hello’
…
내장함수명, 클래스명을 변수명으로 만들어 실행시켰다면!
내장함수명, 클래스명을 변수명 만들어 실행시켰다면 당황하지 말고,
메뉴
런타임 >> 런타임 다시 시작을 하면 된다.런타임 다시 시작은
모든 로컬 변수를 포함한 런타임 상태가 삭제됩니다.라는 경고 문구와 같이 현재 만들어 놓은 변수 등을 초기화 시킨다는 의미이다.따라서 올바르지 않은 변수명도 초기화 되어 기존의 내장함수나 클래스의 기능이 원래대로 복구된다.
그런 다음 문제를 일으킨 변수명은 바로 삭제하자.
한글 변수명도 가능할까?
물론, 한글 변수명도 가능하다. 한글 변수명을 사용하라고 말하고 싶지만 해외 운영체제의 경우 한글이 깨질 수 있으므로 가급적 영문변수명 사용을 권장한다.
다음에서 변수명으로 사용했을때 오류나 문제가 발생하는 것을 모두 골라보자.
sum
_count
2nd_base
money$
True
King3
변수에 데이터 저장하기#
변수에 값을 저장해보자. 이를 프로그래밍에서는 변수에 값을 할당한다라고 말한다. 변수에 값을 할당하려면 대입연산자 기호인 =를 기준으로 왼쪽에는 변수명, 오른쪽에는 값 또는 표현식을 적는다.
변수 num에 정수 10000을 저장한다.
변수 won에 문자열 ‘원!’를 저장한다.
변수 num과 won을 활용하여 문자열을 출력한다.
변수에는 숫자, 문자열 모두 저장할 수 있다.
주의!
초보자의 경우, 변수명과 문자열에 익숙하지 않아 변수명에 문자열 처리를 하여 출력을 하는 실수를 범하기도 한다.
변수 name에 ‘sun’을 저장하고 출력해보자.
변수 name에 문자열 ‘young’을 저장한다.
But!! 여러분은 방금 변수의 중요한 특징 하나를 경험했다. 변수는 새로운 값을 저장하면 이전에 저장했던 값은 사라진다. 정확히 말하자면 변수가 가리키던 객체가 달라진다.
즉, 변수 name은 ‘sun’ 대신에 ‘young’을 가리키게 된다.
변수 spam에 100을 저장한다.
변수 spam에 200을 더해서 출력한다. 결과는 300이 출력된다.
현재 변수 spam에는 어떤 값이 저장되어 있을까? 당연히 100이 저장되어 있다. 우리는 spam+200의 결과를 변수 spam에 저장한 것이 아니므로 변수 spam의 값은 변화가 없다.
이번에는 변수 spam에 15를 저장한 후, spam = spam + 5를 했을 때 변수 spam에는 어떤 값이 저장될까? 연산식은 어떤 순서로 실행될까?
대입연산자(=)가 쓰인 코드의 순서는 항상 = 기호 오른쪽의 연산을 먼저 실행한 후, 그 결과를 = 기호 왼쪽의 변수에 저장한다. 따라서 spam + 5의 연산을 먼저 실행하고 그 결과를 대입연산자 왼쪽에 있는 변수 spam에 저장한다.
결과 20이 출력된다.
spam = 15
주의
print(spam = spam + 5)
위와 같이 코드를 작성하지 않도록 하자. print() 함수는 대입연산식을 수행할 수 없다.
코딩을 하다보면 에러를 자주 마주치게 된다. 에러를 두려워하지 말자. 에러메시지는 여러분에게 많은 정보를 알려준다.
아래 코드의 에러는 NameError로 주로 변수명을 정의하지 않고 사용하였을 때 발생한다.
변수에 오타가 있을때도 만나게 되는데, 변수 eggs를 정의해놓고 라인 3에서는 eggz로 사용하였다. 따라서 eggz를 정의하지 않아서 발생한 경우이다.
eggs = 20
fizz = 10
spam = fizz + eggz
spam
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-4-ba8dae9bd2c7> in <module>
1 eggs = 20
2 fizz = 10
----> 3 spam = fizz + eggz
4 spam
NameError: name 'eggz' is not defined
아래 코드에서는 변수 fizz, eggs를 정의하지 않고 사용하였는데 에러가 나오지 않는다. 그 이유는 무엇일까?
우리는 이미 앞에서 fizz와 eggs를 정의한 적이 있다. 변수를 정의해 놓으면 이 파일을 닫거나 혹은 일부러 메모리에서 변수를 지우기 전까지는 활성화되어 있어서 언제든지 활용할 수 있다.(단, 전역변수의 경우에만 해당한다. 이는 추후에 다룬다.)
fizz + eggs
print()#
print()는 문자열, 변수, 연산의 결과를 표준출력장치인 화면에 출력하는 함수이다.
출력하고자 하는 내용을 print() 함수의 소괄호안에 넣어주면 된다.
print()에 문자열을 넣어서 작성해보자.
print('Hello world')
print('How are you?')
print('Nice to meet you')
하나의 print() 괄호안에 멀티라인 스트링으로 넣어서 여러줄을 출력할 수 있다.
print("""안녕
반가워
파이썬
""")
여러개의 결과를 나열하여 출력하려면 콤마(,)로 구분한다. 콤마는 문자열과 숫자를 나열하여 출력할 때 매우 유용하다. print() 괄호안에 콤마가 있으면 콤마 자리마다 기본으로 한칸 띄어쓰기(공백)가 된다.
print('내 나이는', 20, '살이야')
한칸 띄어쓰기를 없애고 싶으면 옵션 sep을 변경하면 된다.
sep는 separation의 약자로 결과를 분리시킨다는 의미이다.
한칸 띄어쓰기 대신에 다른 구분자를 넣을때도 sep 옵션을 사용할 수 있다.
print('내 나이는', 20, '살이야', sep='')
print(2323,18549, sep='-')
print() 함수는 줄바꿈(\n) 기능이 포함되어 있다.
print()만 쓰면 줄바꿈만 이루어져서 한 줄 공백을 출력하는 효과를 가진다.
print('Hello')
print( )
print('Nice to meet you')
줄바꿈 기능을 바꾸고 싶다면 옵션 end를 변경하면 된다. \t는 일정한 간격으로 분리해주는 tab 기능이다.
print('나','너','우리', end='\t')
print('나','너','우리', end='^^;')
홑따옴표(‘)나 쌍따옴표(“)기호를 출력해야 할 때가 있다. 이럴때는 상반된 기호로 써준다.
print('그녀는 "블랙홀"이라고 말했어!')
print("그녀는 '블랙홀'이라고 생각했어!")
홑따옴표(‘)나 쌍따옴표(“)기호가 모두 들어가 있을 때에는 고민할 필요없이 멀티라인 스트링으로 써준다.
print('''그녀는 '블랙홀'이라고 생각하면서 "충치가 깊네요." 라고 말했다.''' )
실수형 데이터의 경우 소수점 자리수가 길게 나오기도 한다.
print(10/3, 50/4)
소수점 이하 원하는 자릿수까지만 표현하기 위한 두 가지 방법을 소개한다.
round(value, n)n은 자릿수이다. n을 생략하면 반올림하여 정수로 출력한다.f'{value:.nf}'n은 자릿수이며 생략할 수 없다. 정수로 출력하고 싶다면 n자리에 0을 넣는다.
print(round(3.141592, 3))
print(round(3.141592))
print(round(3.541592))
print(f'{3.141592:.0f}')
help()함수는 함수나 클래스의 옵션이나 사용방법에 도움을 주는 함수이다. help() 괄호안에 알고자 하는 함수명, 변수명, 클래스명을 넣어주면 된다.
print() 함수의 다양한 옵션과 활용방법을 알고 싶다면 help(print)를 외쳐라.
help(print)
f-string#
f-string은 문자열 포맷팅(string formatting)이다. 문자열 앞에 f를 붙이면 값, 수식, 변수를 넣어서 문자열을 만들 수 있다. f-string은 주로 print()함수와 함께 사용된다.
num = 10000
won = '원!'
#todo
a = 5
b = 10
print(f'Five plus ten is {a + b} and not {2 * (a + b)}.')
age = 20
print('10년 후의 나이는', age+10, '살이야')
print(f'10년 후의 나이는 {age+10}살이야')
연습문제#
😄문제. 이름과 나이를 변수를 활용하여 저장하고 아래와 같은 결과가 나오도록 코드를 작성해 보세요.
Output:
내 이름은 홍길동이고, 25살이야
😄문제. 다음 내용을 코드로 작성하시오.
변수 insa에 ‘Hello!’를 저장하시오.
변수 name에 본인 이름을 영어로 저장하시오.
Hello!와 본인 이름 사이에 공백을 추가해서 출력하시오. (예: Hello! Alice)
Sample Source Code#
# This program says hello and asks for my name.
print('Hello world!')
print('Input your name. ')
myName = input()
print ('Welcome, ' + myName + '.' )
샘플 코드를 실행시켜보자. 두 줄의 문장이 출력된 이후에 커서가 깜박이고 있을 것이다. 커서가 깜박이는 곳에 이름을 입력하고 엔터를 치면 Welcome, 다음에 입력한 이름이 출력된다.
방금 실행시켜 본 것이 바로 파이썬 프로그램이다. 프로그램을 만들기 위해 채워 넣는 코드를 보통 소스 코드라 부른다. 소스코드는 여러번 실행시켜도 항상 똑같이 동작한다.
컴퓨터는 동일한 소스 코드를 항상 같은 방식으로 읽는다. 여기에는 몇몇 원칙들이 적용된다.
소스 코드는 맨 윗줄부터 순서대로 읽는다.
언제나 한 줄의 코드를 다 실행한 후 다음 줄로 이동한다.
동일한 소스 코드를 항상 같은 방식으로 읽기 때문에 매 번 반복하기 번거로운 작업을 프로그램으로 만들어 두면 그 이후로는 편하게 실행 시켜서 결과를 얻을 수 있다.
comment#
주석은 프로그램 또는 소스코드의 부연 설명이다. 소스코드 한 줄을 주석으로 처리하기 위해서는 #(pound) 기호를 문장의 맨 앞에 붙인다. # 기호를 문장의 중간에 붙이면 # 기호부터 그 줄의 마지막까지 주석으로 처리된다.
주석으로 처리된 코드는 프로그램의 실행에 전혀 영향을 미치지 않으므로 소스코드의 일부를 실행시키고 싶지 않을 때도 사용한다. 또한 이 코드를 읽을 사람을 위해 붙이기도 한다.
# This program says hello and asks for my name.
#print('Hello world!')
print('Input your name. ') # Ask your name
Tip
여러줄을 한꺼번에 주석처리 하려면 주석처리 할 여러 줄을 블럭설정한 후(드래그) ctrl + /를 누른다. ctrl + /를 한번 더 누르면 주석이 해제된다.
ctrl + a를 누르면 현재 셀의 모든 코드를 한꺼번에 블럭설정 할 수 있다.
멀티라인 스트링 기호를 써서 여러 줄을 문자열로 묶어 주석처럼 사용하기도 한다.
# This program says hello and asks for my name.
print('Hello world!')
'''
print('Input your name. ')
멀티라인 스트링 기호를 써서
여러 줄을 주석으로 처리할 수도 있다.
'''
print('Welcome!!')
input()#
input() 함수는 프로그램 실행 중에 표준입력장치인 키보드로부터 데이터를 입력받는 함수이다. 프로그램 실행중에 input() 코드를 만나면 그 아래 입력박스가 생기면서 커서가 깜박이며 입력을 기다린다. 그 박스안에 데이터를 입력하고 엔터를 치면된다.
입력 받은 데이터는 일반적으로 변수에 저장한다. 만약, 변수에 저장없이 input()만 있다면 데이터는 입력 받지만 저장되지는 않는다.
아래의 내용을 코드로 만들어 실행시켜보자.
‘Input your name.’을 출력한다.
입력으로 ‘sunny’를 입력하면 변수 myName에 ‘sunny’가 저장된다.
Welcome, sunny.가 출력된다.
Input your name.
sunny
Welcome, sunny.
아래 코드를 실행시켜 ‘Alice’를 입력해보자.
Welcome, sunny.가 출력된다.
왜 컴퓨터는 Alice를 입력했는데도 sunny만 환영해줄까?
input()
print (f'Welcome, {myName}.')
사용자에게 무엇을 입력받을 때에는 다짜고짜 입력하라고 하지말고 무엇을 입력할것인지를 알려주는 것이 좋다. 즉, 질문을 주고 입력을 받아야 한다. 질문을 넣어주려면 input() 괄호안에 넣어주면 된다. 이때 입력박스는 질문 오른쪽에 생긴다.
myName = input('Input your name.')
print (f'Welcome, {myName}.')
input() 함수에는 절대 잊어서는 안될 중요한 특징 하나가 있다. 입력받은 모든 데이터를 문자열로 처리한다는 것이다. 숫자를 입력해도 문자열로 처리한다. 아래 코드에서 변수 age에는 문자열이 들어 있으므로 문자열과 변수를 더해도 에러가 발생하지 않는다.
age = input('How old are you? ')
print ('You are ' + age + ' years old.')
😄Quiz. 입력값 100을 주었다면 출력결과는?
a = input() + '5'
print (a)
a = input() + 'Hello'
print (a)
a = input() + 100
print (a)
연습문제#
😄문제. 다음과 같이 출력결과가 나오도록 코드를 작성해 보세요.
test case-1
요구르트에 김치 말아먹기 vs 라면에 초콜릿 넣기: 라면에 초콜릿 넣기
당신은 라면에 초콜릿 넣기를 선택하셨군요!
test case-2
요구르트에 김치 말아먹기 vs 라면에 초콜릿 넣기: 둘 다 싫어
당신은 둘 다 싫어를 선택하셨군요!
Data type 확인과 변환#
형 변환은 데이터의 타입을 변환하는 것으로, 형 변환이 필요한 이유는 데이터가 어떤 타입이냐에 따라 지원하는 연산도 다르기 때문이다. 예를 들어, input() 함수로 입력 받은 데이터는 문자열로 처리되는데 입력 받은 데이터와 숫자 연산을 하려면 데이터의 타입을 정수형 또는 실수형으로 변환해주어야 한다.
먼저 데이터의 타입을 확인해보자. type()함수는 데이터의 타입을 확인할 때 사용한다.
height = 180
type(height)
int
height = '180'
type(height)
str
height = 180.3
type(height)
float
int()#
파이썬에서는 다양한 형 변환 함수를 제공한다. int()는 정수로 변환해주는 함수이다.
print(int(42))
print(int(3.5))
print(int('42'))
print(int(' 42 '))
:warning
int()함수는 정수모양이 아닌 문자열은 변환하지 못한다. 예를 들어, ‘3.5’나 ‘forty-two’를 변환하려고 하면 에러를 발생시킨다.
print(int('3.5'))
print(int('forty-two'))
입력을 받은 값에 대해서 바로 형 변환을 하려면 int(input(‘체온을 입력하세요. ‘))와 같이 함수를 중첩하여 쓰면된다.
아래 예제의 경우, 체온으로 정수 35를 입력했다면 정상적으로 실행된다.
그러나 실수값 36.5를 입력했다면 input() 함수에 의해 실수값은 문자열 ‘36.5’가 되어 int()함수에 의해 에러가 발생한다.
num=int(input('체온을 입력하세요. '))
print(num)
float()#
float()은 실수형으로 변환해주는 함수이다. int()와 달리 제약이 없다.
print(float(42))
print(float(3.5))
print(float('3'))
print(float('3.6'))
str()#
str()은 문자열로 변환해주는 함수이다. 이 또한 제약이 없다.
print(str(42))
print(str(3.5))
print(str('42'))
print(str('3.5'))
참고
아래와 같이 입력받아서 변수 num에 저장한 후, 다음 라인에서 형변환을 했다. 그런 후에 type(num)을 통해 변수 num의 타입을 확인해보면 어떤 타입으로 나올까? 그리고 그 타입으로 나오는 이유가 무엇인지 생각해보자.
num = input()
int(num)
type(num)
문자열 인덱싱(Indexing)#
인덱스는 묶음데이터에서의 각 아이템의 위치를 가리키는 번호이다. 문자열에서 아이템은 한 글자이다. 즉, 한 글자에 접근하기 위해 인덱스를 사용한다.
양의 인덱스(positive index)#
positive index는 가장 왼쪽 아이템에서 0부터 시작하여 오른쪽으로 1씩 증가한다.
a='hello'
print(a[0])
print(a[1])
print(a[4])
음의 인덱스(negative index)#
negative index는 가장 오른쪽 끝 아이템에서 -1부터 시작하여 왼쪽으로 1씩 감소한다.
a='hello'
print(a[-1])
print(a[-2])
print(a[-5])
문자열 슬라이싱(Slicing)#
슬라이싱이란 원하는 범위의 데이터를 지정해 추출하는 것이다. 형식은 다음과 같다.
문자열[start:end:step]
start: 슬라이싱 시작 인덱스
end: 슬라이싱 끝 인덱스(끝 인덱스는 미포함)
step: 이동간격, 양수이면 오른쪽으로 step만큼 이동한다. 음수이면 왼쪽으로 step만큼 이동한다.
start, end, step 모두 생략 가능하다.
a = "Life is too short, You need Python"
print(a[3:7])
print(a[ :7])
print(a[3: ])
print(a[3::2])
print(a[-3: :-2])
print(a[::-1])
연습문제#
😄문제. 두 개의 정수를 입력 받아 덧셈 연산을 실행한 후에, 연산 결과를 화면에 출력하는 프로그램을 작성하시오.
Test case-1
첫 번째 정수를 입력하세요: 100
두 번째 정수를 입력하세요: 200
100+200의 결과는 300입니다.
Test case-2
첫 번째 정수를 입력하세요: 300
두 번째 정수를 입력하세요: 500
300+500의 결과는 800입니다.
😄문제. 온도를 입력받아 계산한 후 출력하는 프로그램을 작성하시오.
섭씨온도공식 = 5/9*(화씨온도-32.0)
화씨온도공식 = 9/5*섭씨온도+32.0
test case-1
온도 변환 프로그램
화씨 온도를 입력하세요: 50
섭씨 온도는 10.0 입니다.
섭씨 온도를 입력하세요: 50
화씨 온도는 122.0 입니다.
마무리#
변수는 컴퓨터 메모리 공간에 이름을 붙인 것으로 숫자나 문자열 등의 데이터를 저장하는 공간이다.
변수에 새로운 값을 저장하면 이전에 있던 값은 사라진다.
‘#’은 주석처리 기호이며, 주석은 프로그램과 소스코드에 대한 부연 설명으로 프로그램의 실행에 영향을 미치지 않는다.
print ( ) 함수는 표준출력장치인 스크린에 값을 출력하는 함수이며, 출력하고자 하는 내용을 괄호 안에 넣어주면 된다.
input( ) 함수는 프로그램 실행 중에 값을 입력 받는 함수다. 입력 받은 데이터는 모두 문자열 처리된다.
데이터 타입에 따라 지원하는 연산(기능)이 다르다. 연산을 위해 데이터 타입을 변환해야 할 수도 있다.
int ( )함수는 정수로 변환하는 함수이다.
str ( ) 함수는 문자열로 변환하는 함수이다.
float ( ) 함수는 실수타입으로 변환하는 함수이다.
F37.101 컴퓨팅 기초: 처음 만나는 컴퓨팅(First Adventures in Computing) 서울대학교 학부대학 변해선