백준 코딩 문제를 푸는데 n 줄의 입력을 받을 때 for 문으로 input을 받는 것 말고 다른 방법이 없을까 고민하다가 sys.stdin.readlines() 명령어를 알게 되었다. 이걸 쓰면 사용자가 ^Z(또는 ctrl + z)를 누르기 전까지 입력을 계속할 수 있다. 그런데 파이참에서 실행을 하면 이 키가 먹지 않아서 무한 입력을 해야 하는 상황이 생긴다. 이럴 때는 sys.stdin.readlines() 말고 sys.stdin.readline()을 써서 입력을 원하는 만큼 받을 수 있다. 결국 for문을 써야 하지만 이런 방법도 있다는 것을 알게 되어 좋다. 사실 문제에서는 입력을 받는 게 중요하지 않았지만 그래도 문제를 보면서 여러 가지 상황을 생각해볼 수 있어서 공부하는 데 많은 도움이 되었다.
import sys
def readlines(count):
result = []
for i in range(count):
result.append(*sys.stdin.readline().split())
return result
print(readlines(3))
그리고 한 줄에 여러 문자를 받아서 각각 넘기고 싶으면 .split()을 사용한다. 괄호 안에 아무것도 쓰지 않으면 공백을 기준으로 값을 나누고, 괄호 안에 문자를 넣으면 그 문자를 기준으로 값을 나눈다.
>>>text = "It's a text, not a code."
>>>result = text.split()
>>>result
["It's", 'a', 'text,', 'not', 'a', 'code.']
>>>result = text.split(",")
>>>result
["It's a text", ' not a code.']
또한 문자 좌우의 공백을 제거하는 메소드도 있다. 오른쪽 공백을 제거하려면 rstrip(), 왼쪽은 lstrip(), 양쪽은 strip()이다.
만약 여러 줄로 값을 받았을 경우 아래와 같이 줄바꿈 문자가 포함된 채로 값을 받는다.
1
2
3
['1\n', '2\n', '3\n']
이 때 sys.stdin.readline().rstrip()이나 sys.stdin.readline().strip()을 사용해서 받으면 공백 문자가 사라진다.
1
2
3
['1', '2', '3']
이걸 만약 ssys.stdin.readline().split()으로 공백을 기준으로 나눠 받으면?
1
2
3
[['1'], ['2'], ['3']]
리스트로 저장되므로 *sys.stdin.readline().split()으로 입력을 풀어서 받아도 되지만 그냥 위의 방법을 쓰는 게 좋다.
+덧
그리고 input()과 raw_input()이 있다는 걸 알았다. 이전 버전에서는 input()이 raw_input()을 evaluate 한 값이어서 input()의 속도가 느렸고 출력되는 값도 달랐다. 그 때문에 raw_input()이나 sys.stdin 명령어를 쓰는 일이 있었다고 한다. 그런데 내가 쓰는 파이썬 3.7에는 raw_input()이 사라졌고 input()만 있다. input()은 더이상 evaluate를 한 값을 돌려주지 않는다. 이전 버전에서의 raw_input()의 기능을 지금 버전의 input()이 하는 거구나 하고 이해했는데, 맞으려나?
'문과의 파이썬 공부' 카테고리의 다른 글
파이썬의 이스터에그 (0) | 2020.11.12 |
---|---|
python으로 날짜와 시간 다루기 : UTC와 KST (0) | 2020.11.04 |
python3로 분수 나타내기 (0) | 2020.11.04 |
객체 지향 언어 파이썬, 클래스와 객체의 관계는 붕어빵 틀과 붕어빵이다? (0) | 2020.11.01 |