2023-03-31 TIL

0v0baek·2023년 3월 31일
0

TIL

목록 보기
19/92

[Python] int(input())의 ValueError

문제

attack_num = int(input("어떤 좀비를 공격하시겠습니까? (숫자 입력) "))
# 1 ~ len(current_stage.zombies) 사이가 아닌 경우
	if attack_num < 1 or attack_num > len(current_stage.zombies):
		print("잘못된 입력입니다. 다시 입력해주세요.")
		continue
# 1 ~ len(current_stage.zombies) 사이의 숫자인 경우
	else:
		zombie = current_stage.zombies[attack_num-1]

		action = input("어떤 공격을 사용하시겠습니까? (1: 일반공격, 2: 마법공격) ")
		if action == "1":
			player.normal_attack(zombie)
		elif action == "2":
			player.magic_attack(zombie)
		else:
			print("잘못된 입력입니다. 다시 입력해주세요.")
			continue

attack_num에서 숫자를 입력 받아서 1부터 current_stage.zombies라는 리스트의 길이만큼의 사이에 있는 숫자라면 통과시키고, 아니면 잘못된 입력으로 보낸다.

근데 문제는, 1.1과 같은 소숫점이 있는 숫자가 입력되면 함수가 돌아가지 않고 invalid literal for int() with base 10: '1.1' 라는 오류가 뜨면서 아예 함수 자체가 실행이 안된다.

시도해 본 것들

int를 제외시키기

attack_num = input("어떤 좀비를 공격하시겠습니까? (숫자 입력) ")

int가 앞에 붙어있어서 애초에 소수점 숫자가 안 받아지는 것 같으니, int를 제외하고 돌려보자.

if attack_num < 1 or attack_num > len(current_stage.zombies):
       ^^^^^^^^^^^^^^
TypeError: '<' not supported between instances of 'str' and 'int'

실패
에러 메세지 뜻은, 부등호 비교가 문자열이랑 int끼리는 안 된다는 소리다.

input 받아 온 변수에 int를 씌워주기

저걸 비교하기 위해서는 input 받아온 attack_num을 비교할 수 있게 같은 형식으로 바꿀 필요가 있다.
int로 감싸보자.

attack_num = input("어떤 좀비를 공격하시겠습니까? (숫자 입력) ")
# 1 ~ len(current_stage.zombies) 사이가 아닌 경우
	if int(attack_num) < 1 or int(attack_num) > len(current_stage.zombies):
		print("잘못된 입력입니다. 다시 입력해주세요.")
		continue
if int(attack_num) < 1 or int(attack_num) > len(current_stage.zombies):
       ^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: '1.1'

안 된다.
아까 발생했던 오류랑 똑같다. 소수는 int가 안 된다는 뜻이다. 애초에 ValueError가 떠도 종료가 안 되고 돌아갈 수 있게 만들면 좋을텐데...

해결 방법 : try except

생각해보니 오류를 넘겨주는 방법이 있다!!
try except 구문에 발생한 오류 구문을 넣어서 넘겨주는 방법이 있다.

나의 경우 발생한 에러 종류가 ValueErrorexcept 옆에 ValueError를 넣어주면 된다.

try:
	attack_num = int(input("어떤 좀비를 공격하시겠습니까? (숫자 입력) "))
	if attack_num < 1 or attack_num > len(current_stage.zombies):
		print("잘못된 입력입니다. 다시 입력해주세요.")
		continue
	else:
		zombie = current_stage.zombies[attack_num-1]
except ValueError:
	print("잘못된 입력입니다. 다시 입력해주세요.")
	continue

이런 식으로 에러가 발생해도 종료되지 않고 계속 진행될 수 있게 해준다.
해결!!

try except구문을 함부로 남발하면 오류가 뭔지 알 수 없게 하는 원인이 된다고 했는데, 적절히 사용하면 오히려 파일이 문제 없이 구동할 수 있게 만들 수 있구나를 느꼈다.

[Python] programmers 가위바위보

문제

가위는 2 바위는 0 보는 5로 표현합니다.
가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때,
rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 return하도록 solution 함수를 완성해보세요.

내 해결 방법

def solution(rsp):
    win_list = []
    for num in rsp:
        if num == '2':
            win_list.append('0')
        elif num == '0':
            win_list.append('5')
        else:
            win_list.append('2')
    return ''.join(win_list)

다른 사람의 해결방법

def solution(rsp):
    d = {'0':'5','2':'0','5':'2'}
    return ''.join(d[i] for i in rsp)

이걸 바탕으로 내 코드를 리뷰하면
1. 굳이 리스트에 집어 넣어서 for문으로 돌려 뺄 필요가 없다
2. 리스트는 한 묶음에 값 하나, 딕셔너리는 한 묶음에 key값이랑 value값, 총 두개를 담기 때문에
1:1으로 값을 바꿀 땐 딕셔너리를 이용하면 훨씬 깔끔하게 코드를 짤 수 있다 !

알고리즘 문제를 풀다보면 진짜 신박한 남의 코드를 많이 보게 되는데, 보면서 많이 배우게 된다
계속 공부하다가 보면 문제를 봤을때 아 저건 몇줄로 가능하지 ㅋㅋ 하고 자신하게 되는 날이 오겠지?

profile
개발 공부 하는 비전공자 새내기. 꾸준히 합시다!

0개의 댓글