본문 바로가기
코딩 연습/파이썬 기초(예제)

파이썬 while문 isdecimal(), isdigit(), isnumeric() 활용하기

by good4me 2022. 5. 4.

goodthings4me.tistory.com

파이썬 코딩 시 사용자의 터미널 입력을 받아야 하는 경우, 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)}')

 

 

good4me.co.kr

 

[숫자 판별 함수]

파이썬의 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()로 변환하여 나눗셈을 하되 에러 발생 시 예외 처리로 다시 입력받게 한다.

 

 

댓글