Utilizarea buclelor While True (Programare, Python, Declarație If, Bucla While, Declarații Condiționale, Cuvinte)

ari.montario a intrebat.

Trebuie să scriu un cod care să verifice un cuvânt pentru anumite silabe (exemple: în, ex, sunt). În cazul în care cuvântul este alcătuit numai din aceste silabe, codul returnează „Da” și „Nu” în caz contrar (dacă cuvântul conține și alte silabe). Sarcina îmi cere să folosesc un while true buclă și, deși am găsit o modalitate mai simplă de a face acest cod să funcționeze, nu prea știu de unde să încep să fac o buclă de while true buclă pentru această problemă.

Codul meu actual funcționează doar pentru cuvintele care au toate silabele:

def check(word):
    pos = 0
    while True:
        if pos < len(word):
            if word[pos:pos+2] == "in":
                pos += 2 
                break
            if word[pos:pos+2] == "ex":
                pos += 2
                break
            if word[pos:pos+3] == "are":
                pos += 3 
                break
    return "YES"

Comentarii

  • arată-ne codul pe care l-ai făcut…  > Por depperm.
  • while True: pass. Rulați apoi așteptați (nu faceți asta :)) –  > Por Jean-François Fabre.
  • folosind any sau all este mult mai bună decât while True: ... break –  > Por Jean-François Fabre.
  • Problema dvs. este să vă gândiți la un algoritm sau aveți deja un algoritm despre care credeți că ar trebui să funcționeze și aveți nevoie doar de ajutor pentru a scrie codul? Acest lucru este neclar din întrebare. –  > Por Dev-iL.
4 răspunsuri
HarryCBurn

Dacă ești hotărât să folosești o buclă while din anumite motive, ar fi ceva de genul acesta:

i = 0

while True:

    i += 1
    word = words[i]

    if (syllables in word):
        print('Syllables are in word')
    else:
        print('Syllables not in word')

    if i > len(words):
        break

Cu toate acestea, aceasta este probabil o modalitate mult mai proastă de a rezolva problema. Atunci când iterați printr-un set, este adesea mai eficient să folosiți o buclă for buclă pentru a preveni verificarea inutilă a faptului că întregul set a fost verificat. O implementare a buclei for ar putea arăta astfel:

for s in syllable_set_1:
    if s in word:
        print('Syllable ' + s + ' is in word')
    else:
        print('Syllable ' + s + ' is not in word') 

fafl

În cazul silabelor care se suprapun, este posibil să aveți nevoie de un fel de backtracking. O soluție simplă ar putea folosi while … else, astfel:

syllables = ["in", "ex"]
word = "exinex"
while word:
    matches = [s for s in syllables if word.startswith(s)]
    if not matches:
        print "unable to find syllable for " + word
        break
    word = word.replace(matches[0], "", 1)
else:
    print "only expected syllables found"

Christian König

Fără a avea la dispoziție codul propriu-zis, buclele while True-Loops pot fi utilizate pentru a continua să solicite utilizatorului să introducă date până când este introdus un „cuvânt de oprire” special.

while True:
    text = input("Enter next word to check, end to exit")
    if text=="end":
        break
    else:
        #... your syllable checking

Acest lucru ar permite utilizatorului să introducă mai multe cuvinte de verificat fără a fi nevoit să repornească programul de fiecare dată.

blue_note

Ați putea face ceva de genul

words = iter(words)
while True:
    try:
        if next(words) in allowed_words:
            continue
        else:
            return 'Yes'
    except StopIteration:
        return 'No'

Comentarii

  • return fără o funcție eh –  > Por Chris_Rands.
  • Bine, am spus ceva de genul acest lucru. OP pare să înțeleagă problema suficient de bine pentru a o adapta –  > Por blue_note.
  • De ce este nevoie de un try:except din interes? –  > Por HarryCBurn.
  • Atunci când iteratorul rămâne fără cuvinte, aruncă o eroare de tip StopIteration excepție. Astfel, știți că ați verificat toate cuvintele și trebuie să vă întoarceți –  > Por blue_note.