Program menolak untuk menjalankan pernyataan 'jika' meskipun memiliki nilai yang valid sebagai masukan

Aug 20 2020

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

2 mattbornski Aug 19 2020 at 23:50

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.

2 marsnebulasoup Aug 20 2020 at 00:16

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

1 tdelaney Aug 20 2020 at 00:06

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 casefoldmengatakan 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.