4

저는 코딩 작업을 처음부터 끝 냈습니다. 그래서 여기에 있습니다. 그냥 간단한 숫자 추측 게임을 작성하려고하지만 입력 유효성 검사도 수행하십시오. 따라서 정수 만 입력으로 허용됩니다. 알파벳 문자를 제거하는 방법을 알아 냈으므로 숫자를 정수로 변환 할 수 있습니다. 나는 플로트 넘버를 넣을 때 문제가있다. 나는 float 넘버를 정수로 변환 할 수 없다. 어떤 도움을 주셔서 감사합니다. 내가 말했듯이이 코딩 일 3 일쯤 되니 내 작은 지식을 이해하려고 노력하십시오. 미리 감사드립니다.파이썬에서 float 문자열을 정수로 변환하는 방법 3

내 메인 프로그램의 기능은 다음과 같습니다.

def validateInput(): 
    while True: 
     global userGuess 
     userGuess = input("Please enter a number from 1 to 100. ") 
     if userGuess.isalpha() == False: 
      userGuess = int(userGuess) 
      print(type(userGuess), "at 'isalpha() == False'") 
      break 
     elif userGuess.isalpha() == True: 
      print("Please enter whole numbers only, no words.") 
      print(type(userGuess), "at 'isalpha() == True'") 
    return userGuess 

4.3 (또는 임의의 실수)을 입력으로 사용하면 오류가 발생합니다.

Traceback (most recent call last): 
File "C:\\*******.py\line 58, in <module> 
validateInput() 
File "C:\\*******.py\line 28, in validateInput 
userGuess = int(userGuess) 
ValueError: invalid literal for int() with base 10: '4.3' 
+0

try-except를 사용하여 전환을 연결하려고 할 수 있습니다. int() 변환에서 ValueError 예외가 발생하면 float()을 사용하여 입력을 변환 한 다음 float 값을 정수로 반올림하거나자를 수 있습니다. – nullop

+0

몇 가지 메모 :'if spam == False :',''spam :''not only :''spam :''을 확인하고 싶지는 않을 것입니다. 'elif'에서'if' 테스트의 반대쪽을 다시 검사 할 필요가 없습니다. 거짓인지 아닌지 알고 있기 때문에'isalpha'는 이미 true입니다. 그래서, 그냥'else :'를 사용하십시오. 이 함수에서'userGuess'를 반환한다면 거의 확실하게'global' 일 필요는 없습니다. 그리고 마지막으로'return'을 치기 위해'break '할 필요는 없습니다. 'if' 블록에 바로 userGuess를 반환 할 수 있습니다. – abarnert

답변

4

사실 int() 함수는 정수 문자열 또는 플로트 아니지만 플로트 문자열을 기대하고있다. 왜 정수로 플로트 문자열을 변환을 원하는 않습니다

int(float(userGuess)) 
0

첫째 : 부동 소수점 문자열이 같은 int에 먼저 float로 변환 할 필요가 주어진다면? 4.7을 (를) 이용하여을 (를) 이미 알고 있다고 생각하십니까? 또는 5? 또는 합법적이지만 자동으로 무효 한 추측입니까? 또는 실제로는 값 4.7 (이 경우 정수를 사용하지 않으려 고합니다)? 또는…?


둘째로,이 문제에 접근하는 방법이 잘못되었습니다. userGuess.isalpha()은 추측이 문자로만 이루어 졌다고 알려줍니다. 즉 적어도 하나의 비 문자가 있기 때문에 숫자로 "Hello!"을 치료할 것입니다.

당신은 문자열이 유효한 정수의 경우 단지에 int 전화, 알고 사용하려는 경우 try/except 그렇지 않은 경우 사건을 처리하기 :

def validateInput(): 
    while True: 
     global userGuess 
     userGuess = input("Please enter a number from 1 to 100. ") 
     try: 
      userGuess = int(userGuess) 
      print(type(userGuess), "after int succeeeded") 
      break 
     except ValueError: 
      print("Please enter whole numbers only, no words.") 
      print(type(userGuess), "after int failed") 
    return userGuess 

당신이 원하는 경우 실제 단어를 다른 종류의 오류와 다르게 처리합니다. 예를 들어,보다 구체적인 오류 메시지를 인쇄 할 수 있으므로 절에서 isalpha을 확인할 수 있습니다.

다른 오류를 줄 수 있도록 부동 소수점인지 여부를 확인하려면 tryfloat(userGuess)을 호출하여 except 절을 호출하십시오. 또는 부동 소수점자를 자르려면 int(userGuess)int(float(userGuess))으로 변경하십시오.

try 부분에도 다른 검사가 필요할 수 있습니다. 예를 들어 -23 또는 178을 입력하면 어떻게 되나요? 숫자는 정수이지만 1에서 100 사이의 숫자는 아닙니다.

각 테스트가 다른 코드 행이기 때문에 더 많은 코드가 필요할수록 더 많은 코드가 필요합니다. 따라서 입력을 반복하는 것과는 별도의 기능으로 유효성 검사를 이동하여 읽기 쉽도록하는 것이 좋습니다.

0

isalpha을 사용하여 출력을 차단하지 마십시오. EAFP - 변환하고 예외를 처리하십시오. ValueError은 사용자가 원하는대로 처리 할 수 ​​있으며 입력 내용을 수정하도록 사용자에게 지시 할 수 있습니다. 또는 이상한 이유로 입력을 "4.3"에서 "4"로 자동 수정하려고합니다.

def validateInput(): 
    while True: 
     global userGuess 
     userGuess = input("Please enter a number from 1 to 100. ") 
     try: 
      int(userGuess) 
      return userGuess # you shouldn't really keep this string... 
     except ValueError as e: 
      print("Please enter whole numbers only, no words.") 
관련 문제