티스토리 뷰
다음 두 문장의 출력 결과는 어떻게 될까요?
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 |
그런데 모양이 조금 마음에 안듭니다. 과목명과 점수를 조금 띄울 수는 없을까요? 그리고 점수는 최대 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() 과의 차이점, 잊지 마세요 !
'파이썬 강의 > 기본편' 카테고리의 다른 글
[파이썬 기본편] 8-3.파일입출력 (7) | 2021.03.02 |
---|---|
[파이썬 기본편] 8-2.다양한 출력포맷 (1) | 2021.03.01 |
[파이썬 기본편] 7-7.퀴즈 #6 (10) | 2021.02.27 |
[파이썬 기본편] 7-6.지역변수와 전역변수 (0) | 2021.02.26 |
[파이썬 기본편] 7-5.가변인자 (1) | 2021.02.25 |
- Total
- Today
- Yesterday
- onlineclass
- Xcode
- 파이게임
- Unity
- repl.it
- 챗GPT
- vscode
- 파이썬
- Colab
- Coding
- pygame
- ChatGPT
- 행맨
- 아나콘다
- 나도코딩
- game
- GUI
- 환경설정
- pycharm
- c언어
- 주피터노트북
- Tkinter
- coloso
- 코랩
- Visual Studio Code
- Mac
- 비주얼 스튜디오 코드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |