Bucle condiționale

Introducere

Buclele condiționale sunt un mod de a repeta ceva atâta vreme cât o condiție este satisfăcută, sau Adevărată. Dacă condiția este întotdeauna satisfăcută (nu devine niciodată Falsă), atunci bucla poate deveni infinită. Dacă condiția este falsă la început, codul din buclă nu va rula niciodată! În Python buclele condiționale sunt definite folosind declarația while:

word = ''
sentence = ''
print('Please enter some words.')
print('Include a period (.) when you are finished.')
while '.' not in word:
    word = input('next word: ')
    sentence = word + ' ' + sentence
print()
print('Aha! You said:')
print(sentence)

Numim această parte a codului ‘condițional’: '.' not in word

De valoarea Adevărat sau nu întoarsă de condiție depinde executarea codului din bucla while.

Citește codul de mai sus și încearcă să rezumi în minte ce face (care va fi rezultatul final).

Apoi copiază într-un fișier, cum ar fi sentence.py și rulează-l - vezi exact ce face. Seamănă cu ce credeai tu ?

Note

Dacă folosești Python 2, atunci trebuie să înlocuiești input cu raw_input pentru ca programul să se execute corect.

Închisoarea țestoasei

Exercițiu

The turtle has been up to its usual tricks again, robbing liquor stores and building up huge gambling debts. It’s time for turtle to be put into a cell that it can’t get out of.

Hai să facem o nouă variantă de forward(). Una care va întoarce țestoasa complet dacă încearcă să meargă mai departe de 100 de la origine. Vom avea nevoie de o buclă while și de cateva funcții noi:

  • turtle.distance(0,0) - Distanța țestoasei de la origine

  • turtle.towards(0,0) - Unghiul pentru a se întoarce la origine

  • turtle.setheading(angle) - Setează direcția țestoasei

Poți să încerci să te joci cu țestoasa direct în interpretor pentru a verifica exact ce fac, daca dorești.

Acum va trebui să implementăm logica celulei, poate într-o buclă while și folosind niște logică condițională. Este puțin cam complicat dar continuă! Să nu îți fie frică să vorbești cu cineva mai experimentat sau cu alt student.

Soluția

def forward(distance):
    while distance > 0:
        if turtle.distance(0,0) > 100:
            angle = turtle.towards(0,0)
            turtle.setheading(angle)
        turtle.forward(1)
        distance = distance - 1

Desenează o spirală

Buclele pot fi întrerupte cu comanda break. Este util în mod special când ai scris o buclă infinită, care este o buclă unde condiția este întotdeauna Adevărată.

Exercițiu

Scrie o buclă while cu o condiție care este întotdeauna Adevărată pentru a desena o spirală. Întrerupe bucla când țestoasa ajunge la o anumită distanță față de centru. Folosește funcția turtle.distance(x, y) pentru a afla distanța țestoasei față de punctul definit de coordonatele x și y.

Pentru a face asta ai nevoie de funcțiile turtle.xcor() și turtle.ycor(), care returnează poziția țestoasei pe axele X si respectiv Y.

Note

Pentru a desena o spirală, țestoasa trebuie să se rotească cu o valoare constantă și să înainteze cu o valoare din ce în ce mai mare.

Soluția

def draw_spiral(radius):
    original_xcor = turtle.xcor()
    original_ycor = turtle.ycor()
    speed = 1
    while True:
        turtle.forward(speed)
        turtle.left(10)
        speed += 0.1
        if turtle.distance(original_xcor, original_ycor) > radius:
            break

Supliment

Poți să creezi o condiție pentru această buclă, în așa fel încât să nu ai nevoie de bucla infinită while True sau de break? Ce versiune este mai ușor de înțeles?