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)}')
[숫자 판별 함수]
파이썬의 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 |
댓글