Program menolak untuk menjalankan pernyataan 'jika' meskipun memiliki nilai yang valid sebagai masukan
Saya sangat baru dalam pemrograman komputer dan saat ini sedang menulis program di Komunitas PyCharm yang, ketika diberi nama siswa di sekolah saya, akan mencetak petunjuk arah ke rumah siswa tersebut dari sekolah tersebut.
Semuanya telah berjalan dengan sangat baik, dan saya mendapatkan dasarnya bekerja tadi malam. Hari ini saya membuka komputer saya dan untuk beberapa alasan program saya menolak untuk menjalankan pernyataan 'if' / 'elif' saya dan hanya akan menjalankan pernyataan else meskipun diberikan nilai yang memenuhi pernyataan 'if' / 'elif'.
Saya telah mencoba menulis ulang program, memulai ulang PyCharm beberapa kali, memastikan saya konsisten dengan spasi dan tab, dan memastikan bahwa semua variabel saya dapat berkomunikasi satu sama lain. Saya telah menggali beberapa saat di sini dan situs web lain dan saya tidak dapat melihat alasan mengapa kode saya berfungsi kemarin tetapi sekarang menolak untuk menjalankan apa pun kecuali pernyataan lain.
Ini adalah kode saya, ini akan menanyakan pengguna "Kemana Anda ingin pergi?" dan kemudian akan menerima masukan "rumah". Setelah menerima ini, itu akan mencetak arah mereka. Alih-alih ini, ia menjalankan pernyataan 'lain' setiap saat.
# 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
Jawaban
casefold
mengonversi string menjadi huruf kecil, dan string referensi Anda menyertakan karakter huruf besar.
Sebagai perbaikan sederhana, Anda dapat mengubah 'Davids house' menjadi 'davids house', dll.
Jangka panjang, Anda mungkin ingin menerapkan perbandingan yang sedikit lebih rapuh, tetapi itu latihan besar dan bergantung pada bagaimana program Anda akan digunakan dan apa konsekuensi dari kegagalan-untuk-parse.
Untuk koreksi kesalahan ketik dan dukungan bagi pengguna yang melakukan hal-hal yang merusak pengujian, berikut adalah contoh menggunakan perbandingan kesamaan string untuk menentukan apakah masukan dekat dengan nama pengguna mana pun:
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")
Jadi jika Anda memasuki 'rumah William', 'William', 'rumah William', 'Williamm', atau sesuatu yang dekat dengan 'William', Anda akan mendapatkan petunjuk arah ke rumah William.
Jalankan secara online: https://repl.it/@marsnebulasoup/UprightMutedSymbol
Minimalkan program dan uji! Anda memposting lebih banyak kode daripada yang diperlukan untuk mendemonstrasikan masalah tersebut. Setelah Anda mendapatkan sesuatu seperti if destination.casefold() == 'Davids house':
tidak berfungsi, minimalkan ke satu masalah itu dengan data kaleng
destination = "david's house"
if not destination.casefold() == "Davids house":
print(repr(destination), "failed")
Ini cetakan
"david's house" failed
Bantuan untuk casefold
mengatakan Mengembalikan versi string yang cocok untuk perbandingan tanpa kasing. . Ah, itu dia. Anda perlu melipat kedua sisi. Dan kemudian ada tanda kutip yang mengganggu. Mungkin Anda membutuhkan lebih banyak normalisasi seperti menghilangkan karakter non-alfabet.
Dengan meminimalkan, Anda menulis pengujian yang baik untuk kode Anda. Anda dapat menulis fungsi perbandingan kecil yang melakukan casefold dan normalisasi lainnya. Anda kemudian dapat menulis lusinan pengujian pada fungsi itu untuk menguji semua kasus edge.