본문 바로가기

Python

[Python] 3. 입출력 (Input / Output)

반응형

 

 

[목차]

 

1. input 함수로 입력받기

 

2. 여러 값 한 번에 입력받기 (split, map)

 

3. 다양한 경우의 입력받기

 

4. print 함수로 출력하기

 

 

  1. input 함수로 입력받기

 

파이썬은 기본적으로 input()함수를 이용해서 사용자의 입력을 받는다. input은 입력되는 모든 것을 문자열로 취급한다.

변수에 값을 입력받을 때에는 a = input() 와 같은 형태로 이용한다.

 

a = input() 	# 1234ab 입력
print(a) 	# ans : "1234ab"

a = input() 	# 123 입력
print(a) 	# ans : "123"

a = input() 	# 1 2 3 입력
print(a) 	# ans : "1 2 3"

 

사용자 입력을 받을 때 메시지를 띄워줄 수도 있다. 예를 들어서 번호를 입력할 때 "번호를 입력하세요: " 와 같은 문구를 띄워주고 싶을 때가 있다. 이런 경우에 메시지를 input함수 내에 넣어주면 값을 입력받을 때 메시지를 띄워준다. 

 

a = input("값을 입력하세요 : ")

 

* 대량의 데이터를 반복적으로 입력받아야 할 때에는 sys.stdin.readline 함수를 사용하면 input함수보다 더 빠르게 수행 가능하다. 주로 알고리즘 문제를 해결할 때 많이 이용된다. 자세한 설명은 [링크]를 참고하자. 

 

 

input함수는 숫자를 입력해도 문자열로 입력받기 때문에 숫자를 할당하고 싶다면 함수를 추가적으로 이용해야 한다. 

input함수를 정수로 바꿔주는 int, 실수로 바꿔주는 float 등의 함수로 감싸주면 된다.

 

a = int(input())

a = int(input("정수를 입력하시오 : "))

a = float(input())

a = int(input(), 2) # 2진수 입력

a = int(input(), 8) # 8진수 입력
 
a = int(input(), 16) # 16진수 입력

 

2진수나 8진수, 16진수도 입력이 가능하다. 예를 들어 int(input(), 2)로 입력을 받을 때, 1001을 입력하면 a에는 십진수인 9가 할당된다.

 

 

  2. 여러 값 한 번에 입력받기 (split, map)

 

이전까지는 하나의 값만 입력받는걸 알아보았다. 만약 입력받는 값의 수가 매우 많아지는 경우에는 이를 하나씩 받기에는 무리가 있다. 여러 값을 한 번에 어떻게 입력을 받을까?

 

split함수와 map함수를 이용하면 가능하다. 

split함수는 이전의 문자열 자료형 게시글에서 설명하였듯이, 특정 문자를 기준으로 문자열을 잘라 리스트로 만들어주는 함수이다. 

 

input함수로 입력받으면 항상 문자열로 입력받아진다는 걸 알았으니, 입력된 문자열에 split함수를 이용할 수 있다. 

예를 들어 1부터 10까지 10개의 자연수를 입력받는다고 하자. 각 숫자 사이에는 공백이 주어진다. 

그러면 "1 2 3 4 5 6 7 8 9 10" 의 문자열로 입력을 받게 되고, split 함수를 이용해서 공백 기준으로 모두 분리해주면 

['1', '2', '3', ..., '10'] 으로 만들어진다. 

하지만 아직까지는 리스트의 각 원소가 숫자가 아니라 문자열이다. 우리가 원하는 건 자연수이기 때문에 이 원소들을 모두 숫자로 바꿔주어야 한다. 여기서 map이라는 함수가 이용된다.

 

map은 map(변환 함수, 반복가능한 객체) 이렇게 두 인수를 받는다. 함수부분에는 원하는 자료형(int, float 등)을 넣어주면 된다. 

map함수는 map타입의 객체를 반환하기 때문에 이를 다시 list나 tuple등으로 변환을 시켜주어야 한다. 

 

따라서 종합하면 아래의 코드와 같다. 각 함수들이 적용되어가는 과정을 순서대로 나타내었고, 마지막 코드처럼 사용하면 리스트로 숫자를 입력받을 수 있다.

 

a = input()

print(a) # "1 2 3 4 5 6 7 8 9 10"

a = input().split()

print(a) # ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']

a = map(int, input().split())

print(a) # <map object at 0x01D56750>

a = list(map(int, input().split()))

print(a) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

a = tuple(map(int, input().split()))

print(a) # (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

 

하나의 리스트가 아니라, 여러 변수에 대한 값을 한 번에 입력받을 수도 있다. 동시에 여러 변수에 여러 개체를 할당하는 것을 '다중 할당(Multiple Assignment)'이라고 한다. 

 

a, b, c = map(int, input().split()) # 1 2 3 입력

print(a) # 1

print(b) # 2

print(c) # 3

 

이와 같이 map 객체를 바로 변수할당에 이용해주면 된다.

다만 입력받는 원소의 개수와 할당받는 변수의 개수가 같아야 하며, 아니면 에러가 발생한다.

 

 

 

  3. for문을 이용한 입력

 

for문을 아직 다루지는 않았지만, for문을 이용해서 다양한 입력이 가능하다. 

이전까지는 입력을 한 줄만 받을 수 있었는데, for문을 이용하면 한번에 여러 줄을 입력받을 수 있다.  

 

우선, 기본적으로 여러줄을 입력받는 방법이다. 

a = [input() for _ in range(5)]
print(a)

# 입력
AAAAA
BBBBB
CCCCC
DDDDD
EEEEE

# 출력
['AAAAA', 'BBBBB', 'CCCCC', 'DDDDD', 'EEEEE']

 

range(5)는 0부터 4까지 정수를 의미하며, 위와 같이 작성하면 input을 5번 수행한다는 의미이다. 

여러 줄이 입력되면, 한 줄씩 문자열 원소로 리스트에 담기게 된다.  

 

이렇게 입력받을 수 있다는 걸 알게 되면 문자열을 다루는 함수들로 많이 응용할 수 있다. 

 

각 줄마다도 문자를 하나씩 분리시켜서 최종적으로 2차원 배열을 만들 수 있다.

a = [list(input()) for _ in range(5)]
print(a)

# 입력
AAAAA
BBBBB
CCCCC
DDDDD
EEEEE

# 출력
[['A', 'A', 'A', 'A', 'A'], ['B', 'B', 'B', 'B', 'B'], ['C', 'C', 'C', 'C', 'C'], ['D', 'D', 'D', 'D', 'D'], ['E', 'E', 'E', 'E', 'E']]

 

비슷한 방식으로, 2차원 배열 또한 입력받을 수 있다.

아래와 같이 이용해주면 된다.

a = [list(map(int, input().split())) for _ in range(5)]
print(a)

# 입력
1 2 3 4 5
3 2 9 10 8
4 3 2 1 2
3 3 3 3 3
5 5 5 5 5

# 출력
[[1, 2, 3, 4, 5], [3, 2, 9, 10, 8], [4, 3, 2, 1, 2], [3, 3, 3, 3, 3], [5, 5, 5, 5, 5]]

 

 

  4. print 함수로 출력하기

 

단순하게 print함수를 이용하는 방법은 생략하겠다. 

 

1. 여러 값을 출력하기

 

print 함수 내에 콤마(,) 를 넣어서 한 번에 여러 변수나 값을 출력할 수 있다. 콤마를 넣으면 각 값 사이에 공백 한 칸씩 띄워진 상태로 출력이 된다. 

print(1, 2, 3) # ans : 1 2 3

a = 3
b = 4
c = -1

print(a, b, c) # ans : 3 4 -1

print(a, 10, b) # ans : 3 10 4

 

각 값 사이에 공백이 아니라 특정한 문자를 넣을 수도 있다. 이 경우에는 sep이라는 구분자를 이용한다.

print(1, 2, 3, sep=',')     # ans : 1,2,3

print(1, 2, 3, sep='ab')    # ans : 1ab2ab3

print(1, 2, 3, sep='')      # ans : 123

print(1, 2, 3, sep=', ')    # ans : 1, 2, 3

print(1, 2, 3, sep='\n')

# ans :
# 1
# 2
# 3

 

2. 줄바꿈 생략하기 

 

기본적으로 파이썬의 print함수는 출력을 한 후 자동으로 줄 바꿈을 수행한다. 

하지만 end라는 옵션을 수행하면 출력의 끝에 오는 문자를 지정할 수 있다. 즉, 줄 바꿈을 하지 않고 이어서 출력할 수 있다.

print(1, 2, 3, end=' ')
print(4, 5, 6)

# ans : 1 2 3 4 5 6

print(1, 2, 3, end=' and ')
print(4, 5, 6)

# ans : 1 2 3 and 4 5 6

print(1, 2, 3, end='\n')
print(4, 5, 6)

# ans : 
# 1 2 3
# 4 5 6

 

3. format 활용하기

 

format은 문자열 파트에서 다룬적이 있다. (rebro.kr/123

이외에 정렬, 크기 설정 등등 다양한 출력 방법이 이 게시글에 나와 있으므로 참고하면 도움이 될 것이다.

 

 

PC로 보시는 것을 권장합니다. 

피드백은 언제나 환영입니다. 댓글로 달아주세요 ^-^

 

반응형