프로그램이 입력으로 유효한 값이 있음에도 불구하고 'if'문 실행을 거부합니다.
저는 컴퓨터 프로그래밍을 처음 접했고 현재 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
답변
casefold
문자열을 소문자로 변환하고 참조 문자열에는 대문자가 포함됩니다.
간단한 수정으로 'Davids house'를 'davids house'등으로 변경할 수 있습니다.
장기적으로는 약간 덜 깨지기 쉬운 비교를 구현하고 싶을 수 있지만 이는 큰 연습이며 프로그램 사용 방법과 파싱 실패의 결과에 따라 다릅니다.
오타 수정 및 테스트를 위반하는 작업을 수행하는 사용자 지원을 위해 다음은 문자열 유사성 비교를 사용하여 입력이 사용자 이름에 가까운 지 확인하는 예제입니다.
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
프로그램을 최소화하고 테스트하십시오! 문제를 설명하는 데 필요한 것보다 더 많은 코드를 게시했습니다. 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 개의 테스트를 작성하여 모든 에지 케이스를 테스트 할 수 있습니다.