본문 바로가기

Program Languages/Python

파이썬 콘솔 상호작용으로 입력받는 법

 

파이썬 언어를 사용하다 보면 특정 값이나 변수에 입력을 받아와야 하는 일이 종종 있습니다.

 

이번 포스트에서는 콘솔과의 상호 작용을 통해 어떤 값을 입력받는 법을 알아 보겠습니다.

 

우선 파이썬에서는 기본적으로 런타임에서 콘솔과 상호작용하면서 동적으로 값을 입력받는 것이 가능한데요.

 

물론 여기에는 여러 방법이 있지만, 쉬운 방법으로는 콘솔에서 텍스트 입력값을 받는 input 함수를 사용하는 것입니다.

 

 

기본적인 사용법은 아래와 같습니다.

변수 = input()
변수2 = input("질문 문장 입니다, 입력 문장을 입력 후 엔터를 입력하십시오.")

#해당 형식은 이해를 돕기 위한 것으로,
#해당 형식을 실제 프로젝트에서 유사하게 사용시, 코드 인젝션 취약성에 대한 보완이 필요합니다.
print( f"변수:'{변수}'\n\t변수 타입:",type(변수))
print(f"변수2:'{변수2}'\n\t변수2 타입: {type(변수)}")

결과 사진을 보면 '변수' 와 '변수2'에 각각 입력값 'a'와 '1 2 3 ' 이라는 값이 할당되는 것을 알 수 있었습니다.

 

 

하지만 input함수를 사용하는 것에 대한 여러 문제가 발생하는데, 그 중 2가지는

  1. 입력값의 데이터 타입이 항상 문자열이라는 점
  2. 입력의 단위가 한줄(one-line)이라는 점

우선 이 2가지 문제가 주로 추가 구현이 필요한 부분이라고 할 수 있겠습니다.

2번 문제는 문자열 전처리와 파이썬 문자열 관련 함수와 관련된 부분이라 이 포스트에서는 설명을 생략하겠습니다.

 

문자열에 정의된 문자열 관련 함수는 나중에 파이썬 문자열에 대한 포스트에서 자세히 다루도록 하고 지금은 

str.split(sep=" ",maxsplit=-1) 그리고 map이라는 함수를 이용해 위에 언급된 1번 문제를 해결해 보도록 하겠습니다.

 

 

우선 각 함수에 대해 간략한 설명을 추가하자면,

함수 설명 예제
str.split(sep="R",maxsplit=-1) 문자열에 대해 분리할 기준점이 되는 어떤 sep문자열이 사이에 있을때 마다 문자열이 분리되는 함수 문자열 분리기준 문자열이  "R"이라면,

"1R2R3" ["1","2","3"]
"1R2R3R" ["1","2","3",""]
"1E2E3" ["1E2E3E"]
map(function,iterable) 어떤 iterable 객체의 각 iteration마다 function을 적용한 iterable객체로 변환하는 함수 만약 function = lambda value: int(value) 이라면,

["1.01","-1.02","1.0"] iterable([1,1,1])

 

 

이러한 함수들을 활용해 조금 더 할당되기 쉬운 형식으로 변환해 보자면

row1 = input("input1: ").split(",")
a,b,c,*remainder_etc = map(lambda x: int(x) if(x.isdigit()) else x,input("input2: ").split())

print("row1:",row1)
print(f"a:{a}, b:{b}, c:{c}, 비지정 변수들: {remainder_etc}")

각 변수들에 적절히 잘 할당되고 입력 문자열이 할당되기 쉬운 형식으로 변환되는 것을 알 수 있었습니다.