티스토리 뷰

다음 두 문장의 출력 결과는 어떻게 될까요?

print("Python", "Java")

print("Python" + "Java")

첫 번째 문장은 콤마(,) 로 문자열들을 구분하였고 두 번째 문장은 더하기(+) 기호로 문자열들을 합쳤습니다.

 

실행시켜보면 이런 결과를 확인할 수 있습니다. 띄어쓰기가 되느냐 마느냐의 차이네요.

Python Java

PythonJava

 

사실 print() 문에는 비밀이 하나 숨겨져있는데, 바로 문자열들을 구분하는 방법을 사용자가 직접 정의할 수 있다는 것입니다. 그 비밀은 바로 sep 입니다. 분리 기호를 의미하는 separator 의 줄임말이죠.

 

코드를 이렇게 바꾸어 보겠습니다. 이제 함수를 배웠으니 어렵지 않게 이해하실 수 있을 겁니다.

print("Python", "Java", sep=",") # 값들을 콤마(,) 로 구분

각 값들을 무엇으로 구분할지를 정해서 sep= 의 값으로 설정하면 되는데 여기서는 콤마(,) 로 했습니다. 

 

실행 결과를 보면 한 눈에 차이점을 확인할 수 있죠? 앞 코드에서는 띄어쓰기로 구분이 되었는데 이제는 콤마(,) 로 구분이 됩니다.

Python,Java

조금 더 확실히 확인하기 위해서 이번에는 " vs " 라는 문자열로 구분지어보겠습니다. 이해를 돕기 위해 JavaScript 도 하나 추가해볼게요.

print("Python", "Java", "JavaScript", sep=" vs ") # 값들을 " vs " 로 구분

실행 결과는 이렇습니다.

Python vs Java vs JavaScript

 

출력을 위한 print() 문에 숨어 있는 유용한 한 가지를 더 알려드리겠습니다. 아, 사실 함수를 공부할 때 살짝 다뤘기 때문에 더 이상 비밀은 아니겠네요.

 

그렇습니다. 바로 end 입니다.

 

print() 는 기본적으로 문장이 끝날때마다 줄바꿈을 하기 때문에 연속적으로 2개 이상의 print() 를 이용하면 각각의 줄에 내용이 출력됩니다. 하지만 이를 한 줄에 모두 엮어서 출력하려면 end=" " 와 같이 하면 되지요.

 

코드를 이렇게 적고 실행하면 출력 결과는 어떻게 될까요?

print("Python", "Java", sep=",", end="?")
print("무엇이 더 재밌을까요?")

 

정답은 이렇습니다.

Python,Java?무엇이 더 재밌을까요?

Python 과 Java 라는 각각의 문자열을 sep="," 을 통해서 콤마(,) 로 구분하고, end="?" 를 통해서 print() 문의 마지막을 물음표(?) 로 하였기 때문에 두 번째로 나오는 문장은 연이어서 한 줄에 출력되는 것이죠.

 

만약 end= 를 적지 않았다면 결과는 이렇게 될 겁니다.

Python,Java

무엇이 더 재밌을까요?

 

 

 

새로운 코드를 하나 적어보겠습니다.

import sys # sys 모듈을 가져와서 사용하겠다는 의미
print("Python", "Java", file=sys.stdout) # 표준 출력
print("Python", "Java", file=sys.stderr) # 표준 에러

이렇게 적고 실행을 했을 때 출력 결과는 다음과 같습니다.

Python Java
Python Java

아무런 차이가 없죠? 

 

file= 에 sys.stdout (Standard Output, 표준 출력) 와 sys.stderr (Standard Error, 표준 에러) 를 각각 넣었는데, 출력결과는 크게 달라보이지 않습니다. 머지 않은 미래에 보다 큰 규모의 파이썬 프로젝트를 진행하게 되면 필요해질텐데, stdout 과 stderr 은 사용하는 용도가 조금 다릅니다.

 

보통 프로그램 수행 과정에서 몇 시에 어떤 작업을 어떤 식으로 수행하고 있으며 그 결과는 어떠한지 등의 정보를 가지는 로그를 남길 때 stdout 은 일반적인 내용을, stderr 는 에러 발생 시 관련 내용을 출력하기 위해 사용할 수 있습니다. 이렇게 구분지어주면 프로그램이 의도치 않은 동작을 하는 경우에 에러 로그만 확인하면 보다 빠르게 상황 파악 및 조치가 가능해집니다.

 

파이썬 기본편을 공부하는 시점에서는 이런 게 있구나 정도로만 이해하고 넘어가셔도 좋습니다.

 

 

 

 

자료구조 단원에서 배웠던 사전를 활용한 새로운 예제를 보겠습니다.

학교에서 시험 성적을 받는 상황으로 가정하고, 총 3과목에 대한 성적 정보를 각각 과목명(key)과 점수(value)로 하여 scores 에 저장하겠습니다. 그리고 for 반복문을 이용하여 반복 대상을 scores.items() 로 입력하면, scores 에 있는 각 성적 정보들이 과목명(key) 과 점수(value) 의 쌍으로, 튜플형태로 넘어와서 subject 와 score 에 각각 저장됩니다.

scores = {"수학":0, "영어":50, "코딩":100}

for subject, score in scores.items(): # key, value
    print(subject, score)

실행 결과는 이렇게 되네요.

수학 0
영어 50
코딩 100

 

그런데 모양이 조금 마음에 안듭니다. 과목명과 점수를 조금 띄울 수는 없을까요? 그리고 점수는 최대 3자리인데 오른쪽 정렬을 시킬 수는 없을까요?

 

이럴 때 우리는 ljust() 와 rjust() 라는 것을 이용할 수 있습니다. l 과 r 은 각각 왼쪽(left) 과 오른쪽(right) 을 의미하며, 함께 전달하는 숫자값 만큼 미리 공간을 확보하고 나서 그 공간에 왼쪽 정렬 또는 오른쪽 정렬을 해주는 동작을 합니다. 이 때 값은 문자열 형태여야 합니다.

 

앞의 코드를 바꿔보겠습니다.

scores = {"수학":0, "영어":50, "코딩":100}

for subject, score in scores.items():
    print(subject.ljust(8), str(score).rjust(4), sep=":")

먼저 실행 결과를 볼까요?

수학      :   0

영어      :  50

코딩      : 100

훨씬 보기가 좋아졌습니다.

 

print() 문에서 바뀐 부분을 살펴보면, 먼저 subject 를 ljust(8) 로 출력해줍니다. 8이라는 숫자에 의해서 총 8칸의 공간을 확보하고, ljust 의 l 이 왼쪽을 의미한다고 했으니 왼쪽 정렬을 해줍니다. 

 

표로 나타내면 이렇게 되겠네요. 수학을 제외한 나머지 공간은 빈 칸으로 있게 됩니다.

           

 

그리고 점수 부분은 일단 score 가 정수형이기 때문에 문자열로 바꿔주기 위해서 str() 로 감싸준 후에 rjust(4) 로 출력해줍니다. 4칸의 공간을 확보하고 r 이므로 오른쪽 정렬을 해주는 것이죠.

      0

만약 코딩 과목이었다면 100점이므로 이렇게 표시할 수 있겠습니다.

  1 0 0

그리고 이들을 sep=":" 를 통해 콜론(:) 으로 구분지어줬습니다. 다시 한 번 실행 결과를 보면서 설명을 이해해봅시다.

수학      :   0

영어      :  50

코딩      : 100

 

 

 

 

비슷하면서 다른 zfill() 이란 것도 있습니다.

우리가 은행에 가면 대기 번호표를 뽑는데요. 필자가 방문한 은행은 번호가 3자리로 표시되어 있었고, 번호 0 이 붙어서 001, 002, 003, ... 이런 식으로 적혀 있었습니다.

우선은 0 을 고려하지 않고 20번까지 대기번호를 출력해보겠습니다.

for num in range(1, 21): # 1~20 까지의 숫자
    print("대기번호 : " + str(num))

 

실행 결과는 이렇습니다.

대기번호 : 1
대기번호 : 2
대기번호 : 3

... 생략 ...

대기번호 : 18
대기번호 : 19
대기번호 : 20

 

오른쪽에 표시되는 숫자 정보가 자릿수가 바뀌면서 모양이 조금 이상하게 되었습니다. 이를 실제 은행의 대기 번호표와 같이 바꿔보겠습니다. 여기서 사용할 zfill() 은 함께 전달해주는 숫자만큼의 공간을 확보하고 그 공간을 zero 로, 즉 0 으로 채워주는(fill) 동작을 합니다.

for num in range(1, 21): # 1~20 까지의 숫자
    print("대기번호 : " + str(num).zfill(3))

실행 결과는 훨씬 모양새가 좋습니다.

대기번호 : 001
대기번호 : 002
대기번호 : 003

... 생략 ...

대기번호 : 018
대기번호 : 019
대기번호 : 020

 

 

 

 

이번에는 표준 입력에 대해 공부해보겠습니다.

이미 앞에서 여러 번 사용했기 때문에 크게 어려운 부분은 없습니다. 바로 코드를 작성해보죠.

answer = input("아무 값이나 입력하세요 : ")
print("입력하신 값은 " + answer + "입니다.")

이렇게 적고 실행을 해보면

아무 값이나 입력하세요 :

까지만 출력이 되고 사용자의 입력을 기다리게 됩니다. 사용자가 어떤 값을 입력하고 엔터를 치면 그제서야 앞에 적어둔 answer 라는 변수에 그 값이 저장되고 이어서 print() 문이 실행됩니다.

 

2번을 실행시키며 각각 다른 형태로 입력해보겠습니다.

(10 을 입력했을 때)

아무 값이나 입력하세요 : 10
입력하신 값은 10입니다.

("나도코딩"을 입력했을 때)

아무 값이나 입력하세요 : 나도코딩
입력하신 값은 나도코딩입니다.

두 경우 모두 출력이 잘 되는데요. 여기에는 중요한 점이 있습니다. print() 문에서 보면 분명 + 를 통해서 각 문자열과 입력값을 출력하고 있습니다. 지금까지 우리는 문자열과 문자열이 아닌 숫자를 함께 출력하려면 str() 로 감싸주어야 했었는데요. input() 을 통해 10 을 입력했음에도 불구하고 그 값은 str() 로 감싸주지 않고도 잘 출력이 되었습니다.

 

왜 그럴까요?

 

코드를 다음과 같이 바꿔서 입력값의 타입정보를 확인해보겠습니다.

answer = input("아무 값이나 입력하세요 : ")
print(type(answer))

이번에도 2번을 실행시키며 10 과 "나도코딩"을 차례로 적어볼까요?

(10 을 입력했을 때)

아무 값이나 입력하세요 : 10 

<class 'str'>

("나도코딩" 을 입력했을 때)

아무 값이나 입력하세요 : 나도코딩

<class 'str'>

두 경우 모두 str, 즉 문자열 타입으로 나오네요.

 

그렇습니다. input() 을 통해 입력받는 모든 값은 항상 문자열 형태로 저장되기 때문에 print() 내에서 + 를 통해 출력했을 때 아무 문제가 없었던 겁니다. 만약 10 과 같은 정수를 입력받고 이 값을 실제로 계산 목적으로 사용하려면 반드시 int(answer) 와 같이 형을 바꿔줘야 합니다.

 

참고로 코드를 다음과 같이 적고 실행해보면 answer 의 타입 정보는 int 임을 확인할 수 있습니다.

answer = 10
print(type(answer)) # <class 'int'>

 

input() 과의 차이점, 잊지 마세요 !

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함