프로그램이 입력으로 유효한 값이 있음에도 불구하고 'if'문 실행을 거부합니다.

Aug 20 2020

저는 컴퓨터 프로그래밍을 처음 접했고 현재 PyCharm 커뮤니티에서 제 학교 학생의 이름이 주어지면 학교에서 해당 학생의 집으로가는 길을 인쇄하는 프로그램을 작성하고 있습니다.

모든 것이 잘 진행되고 있으며 어제 밤에 그 기반이 작동했습니다. 오늘 저는 컴퓨터를 열었고 어떤 이유로 프로그램이 내 'if'/ 'elif'문을 실행하지 않고 'if'/ 'elif'문을 만족하는 값이 주어 졌을 때만 else 문만 실행합니다.

프로그램을 다시 작성하고, PyCharm을 여러 번 다시 시작하고, 공백과 탭과 일치하는지 확인하고, 내 변수가 모두 서로 통신 할 수 있는지 확인했습니다. 나는 여기와 다른 웹 사이트에서 잠시 동안 파고 들었고 어제 코드가 작동하는 이유에 대한 이유를 알 수 없지만 이제는 else 문을 제외하고는 아무것도 실행하지 않습니다.

다음은 내 코드입니다. 사용자에게 "어디로 가고 싶으세요?"라고 묻습니다. 그런 다음 "집"입력을받습니다. 이것을 받으면 지시 사항을 인쇄합니다. 대신 매번 'else'문을 실행합니다.

# Storing the names and directions of users:
David = "Directions to David's home from T... \n East on X, \n South on Y.," \
            " \n West on Z., \n South on A., \n first white house on the right."

Caroline = "Directions to Caroline's home from T... \n East on x, \n South on y.," \
        " \n East on z., \n South on p., \n East on q," \
        " \n West on t., \n last brick house in the cul-de-sac."

William = "Directions to Will's home from T... \n East on x, \n South on y.," \
        " \n West on z., \n South on Fa., \n West on b., \n first house on the right."

Bannon = "<Insert directions to Bannon's house>"

# User gives a specific name and then receives a location:
while True:
    destination = input("Where would you like to go? ")

    if destination.casefold() == 'Davids house':
        print(David)
        continue

    elif destination.casefold() == 'Carolines house':
        print(Caroline)
        continue

    elif destination.casefold() == 'Wills house':
        print(William)
        continue

    elif destination.casefold() == 'Bannons house':
        print(Bannon)
        continue

    # If an invalid location is given, this code will run:
    else:
        print("Sorry, that location wasn't found! Please try again.")
        continue

답변

2 mattbornski Aug 19 2020 at 23:50

casefold 문자열을 소문자로 변환하고 참조 문자열에는 대문자가 포함됩니다.

간단한 수정으로 'Davids house'를 'davids house'등으로 변경할 수 있습니다.

장기적으로는 약간 덜 깨지기 쉬운 비교를 구현하고 싶을 수 있지만 이는 큰 연습이며 프로그램 사용 방법과 파싱 실패의 결과에 따라 다릅니다.

2 marsnebulasoup Aug 20 2020 at 00:16

오타 수정 및 테스트를 위반하는 작업을 수행하는 사용자 지원을 위해 다음은 문자열 유사성 비교를 사용하여 입력이 사용자 이름에 가까운 지 확인하는 예제입니다.

import difflib
# Storing the names and directions of users: 
#This is called a dictionary. More info here https://www.w3schools.com/python/python_dictionaries.asp
directions= {
    "David": "Directions to David's home from T... \n East on X, \n South on Y.," \
            " \n West on Z., \n South on A., \n first white house on the right.",

    "Caroline": "Directions to Caroline's home from T... \n East on x, \n South on y.," \
        " \n East on z., \n South on p., \n East on q," \
        " \n West on t., \n last brick house in the cul-de-sac.",

    "William":"Directions to Will's home from T... \n East on x, \n South on y.," \
        " \n West on z., \n South on Fa., \n West on b., \n first house on the right.",

    "Bannon":"<Insert directions to Bannon's house>"
}

# User gives a specific name and then receives a location:
while True:
    destination = input("Where would you like to go? ")

    highest = 0 #highest score between the user name and input
    user_key = "" #name of the user who most closely matches the input
    for user in directions: #iterate through all the user's names in the directions dictionary
      similarity = difflib.SequenceMatcher( #for each user's name, compare it to the input
          None, destination, user).ratio()
      if(similarity > highest): #if the similarity score is greater than the highest recorded score, update the score
        highest = similarity
        user_key = user
    
    #Code that runs if a match is too low are not found
    if(highest < 0.5): #adjust this based on how close you want the match to be. highest will always be between 0.0 and 1.0
      print("Sorry, that location wasn't found! Please try again.")
      continue

    #Print user's directions
    else:
      print('\n\nGetting directions to ' + user_key + '\'s house\n\n')
      print(directions[user_key] + "\n\n\n")

따라서 'William 's house', 'William', 'William 's house', 'Williamm'또는 'William'에 가까운 항목을 입력하면 William 's 집으로가는 길을 알 수 있습니다.

온라인으로 실행 : https://repl.it/@marsnebulasoup/UprightMutedSymbol

1 tdelaney Aug 20 2020 at 00:06

프로그램을 최소화하고 테스트하십시오! 문제를 설명하는 데 필요한 것보다 더 많은 코드를 게시했습니다. if destination.casefold() == 'Davids house':작동하지 않는 것과 같은 문제가 발생하면 미리 준비된 데이터로 문제를 최소화하세요.

destination = "david's house"
if not destination.casefold() == "Davids house":
    print(repr(destination), "failed")

이것은 인쇄

"david's house" failed

에 대한 도움말은 casefold말한다 반환 대소 문자를 구별 비교에 적합한 문자열의 버전. . 아, 그게 다야. 양쪽을 접을 필요가 있습니다. 그리고 그 성가신 아포스트로피가 있습니다. 알파벳이 아닌 문자를 제거하는 것과 같은 더 많은 정규화가 필요할 수 있습니다.

최소화함으로써 코드에 대한 좋은 테스트를 작성했습니다. 케이스 폴드 및 기타 정규화를 수행하는 작은 비교 함수를 작성할 수 있습니다. 그런 다음 해당 함수에 대한 12 개의 테스트를 작성하여 모든 에지 케이스를 테스트 할 수 있습니다.