-
파이썬 while문 isdecimal(), isdigit(), isnumeric() 활용하기코딩 연습/파이썬 기초(예제) 2022. 5. 4. 15:22
파이썬 코딩 시 사용자의 터미널 입력을 받아야 하는 경우, for문보다는 while문으로 사용하는데 input() 함수로 입력받는 데이터 type의 문제로 인해 예외 처리를 하거나 파이썬 숫자 판별 함수를 이용해야 할 때가 있다.
숫자 판별 함수와 while 반복문
[파이썬 소스 코드]
while True: try: games = int(input('진행 게임수를 입력하세요 > ')) if games <= 0: continue else: break except ValueError: continue print(f'games: {int(games)}')
- int(input('진행 게임수를 입력하세요 > ')) 부분에 숫자가 아닌 값이 입력되면 에러가 난다. ValueError: invalid literal for int() with base 10:
- while 반복문에서 예외 처리(try ~ except) 구문을 활용하여 input() 함수로 숫자를 입력받을 수 있고, 아래의 숫자 판별 함수를 이용하는 방법으로 할 경우 더 간단하게 할 수 있다.
[숫자 판별 함수 이용]
games = '' while games == '0' or not games.isdecimal(): games = input('진행 게임수를 입력하세요 > ') print(f'games: {int(games)}')
[숫자 판별 함수]
파이썬의 isdecimal(), isdigit(), isnumeric() 함수에 대해 알아보면,
a = "369" b = "-1" c = "0" d = "½" e = "3²" f = "2e3" g = "0xf" print(f'"369": {a.isdecimal()}, {a.isdigit()}, {a.isnumeric()}') # "369": True, True, True print(f'"-1": {b.isdecimal()}, {b.isdigit()}, {b.isnumeric()}') # "-1": False, False, False print(f'"0": {c.isdecimal()}, {c.isdigit()}, {c.isnumeric()}') # "0": True, True, True print(f'"½": {d.isdecimal()}, {d.isdigit()}, {d.isnumeric()}') # "½": False, False, True print(f'"3²": {e.isdecimal()}, {e.isdigit()}, {e.isnumeric()}') # "3²": False, True, True print(f'"2e3": {f.isdecimal()}, {f.isdigit()}, {f.isnumeric()}') # "2e3": False, False, False print(f'"0xf": {g.isdecimal()}, {g.isdigit()}, {g.isnumeric()}') # "0xf": False, False, False
- 각 함수의 용도는 다르다. isnumeric()의 경우 분수, 제곱 등까지 True로 받을 수 있는 반면에
- isdecimal()의 경우 0과 양의 정수 문자열에 대해서만 True로 입력받는다.
- 위 a ~ g까지의 예시 중에서 게임수를 입력받는 것은 양의 정수만을 True로 입력받는 isdecimal()이다.
- 다만, "0"도 True이기 때문에 이 부분에 대해서 반복문이 동작하도록 적용하면 되기 때문에 while 문에 games == "0" 부분을 추가했다.
[파이썬 나눗셈 ZeroDivisionError 처리]
def div_ex1(): num1 = int(input('피제수 입력: ')) num2 = int(input('제수(0은 제외) 입력: ')) print(f'{num1} ÷ {num2} = {num1 / num2}') div_ex1()
- 제수에 0 입력 시 ZeroDivisionError: division by zero
- 제수에 숫자가 아닌 값이 입력되면 ValueError: invalid literal for int() with base 10:
def div_ex2(): num1 = int(input('피제수 입력: ')) while True: num2 = input('제수(0은 제외) 입력: ') if num2 == '0': print('0으로 나눌 수 없어요') continue elif not num2.isdecimal(): print('입력값이 정수가 아닙니다.') continue else: print(f'{num1} ÷ {int(num2)} = {num1 / int(num2)}') break div_ex2()
- 숫자 이외의 값에 대해 조건문 처리를 위해 숫자 판별 함수를 사용해서 처리할 수 있는데, 이 경우에는 입력값을 문자열 type으로 받아야 함
- 다만, 파이썬에서 숫자를 판별하는 함수 중 isnumeric() 함수은 분수나 제곱값을 True로 처리하고,
- isdigit() 함수도 제곱을 True로 처리하기 때문에 int() 타입 변환 시 에러 발생한다. 그래서 양의 정수 입력을 받을 때는 isdecimal() 함수를 사용한다.
def div_ex3(): num1 = int(input('피제수 입력: ')) while True: try: num2 = int(input('제수(0은 제외) 입력: ')) print(f'{num1} ÷ {int(num2)} = {num1 / int(num2)}') break except ZeroDivisionError: print('0으로 나눌 수 없어요') continue except ValueError: print('입력값이 정수가 아닙니다.') div_ex3()
- 예외 처리로 하는 하는 코드임.
- input() 입력값을 int()로 변환하여 나눗셈을 하되 에러 발생 시 예외 처리로 다시 입력받게 한다.
'코딩 연습 > 파이썬 기초(예제)' 카테고리의 다른 글
파이썬 팩토리얼 (factorial) 구하는 방법 (0) 2022.05.09 판매 데이터 파일(텍스트) 읽고 계산한 후 결과를 저장하기 (0) 2022.05.09 구구단 게임 [파이썬기초예제] (0) 2022.04.28 진수 변환 - 2진수 변환, 8진수 변환, 16진수 변환 [파이썬기초예제] (0) 2022.04.23 가위바위보 게임 [파이썬기초예제] (0) 2022.04.21