Funcții definite de utilizator

Introducere

Programatorii pot întâlni probleme destul de complexe și abstracte, dar o caracteristică a unui bun programator este lenea. Ei doresc să aibă de-a face cu un singur lucru odată . Așa că ai nevoie să spargi problemele în bucăți mai mici, separate, care să îți permită să te concentrezi doar pe cea pe care dorești.

Funcțiile sunt un mod de a face această abstractizare în Python. Hai să luăm ca exemplu turtle.reset(). reset este o funcție pe care o apelăm pe turtle și este de fapt o abstractizare a unui număr de pași, adică:

  • Șterge tabla.

  • Setează lățimea și culoarea la valorile implicite.

  • Mută țestoasa înapoi la poziția inițială.

Dar pentru că tot codul este inclus în funcție, nu trebuie să ne facem griji pentru aceste detalii. Putem pur și simplu să apelăm această funcție și vom ști că va face ceea ce spune.

Deci - cum să îți scrii propriile funcții?

O funcție poate fi definită în Python folosind cuvântul cheie def:

def line_without_moving():
    turtle.forward(50)
    turtle.backward(50)

Funcția pe care am definit-o se numește line_without_moving și este o abstractizare a doi pași ai țestoasei - o deplasare înainte și o deplasare înapoi.

Pentru a o utiliza (sau așa cum se spune de obicei, pentru a o apela), scrie numele ei urmat de paranteze:

line_without_moving()
turtle.right(90)
line_without_moving()
turtle.right(90)
line_without_moving()
turtle.right(90)
line_without_moving()

Am putea să scriem mai multe funcții pentru a elimina repetițiile:

def star_arm():
    line_without_moving()
    turtle.right(360 / 5)

for _ in range(5):
    star_arm()

Important

Python utilizează indentarea cu spații albe pentru a identifica blocuri de cod care au legătură. În Python un bloc (cum sunt definițiile funcțiilor de mai sus) este introdus cu un caracter două puncte la sfârșitul unei linii și liniile următoare sunt indentate – în mod uzual cu 4 spații.

Asta este diferit față de multe alte limbaje de programare, care utilizează paranteze (cum ar fi acoladele {}) pentru a grupa blocuri de cod.

Nu utiliza niciodată caractere tab pentru indenta blocurile tale, ci doar spații. Poți – și ar trebui să o faci – să îți configurezi editorul tău să adauge 4 spații cănd apeși tasta tab. Problema cu utilizarea caracterelor tab este că alți programatori Python folosesc spații și dacă sunt folosite în combinație în același fișier atunci Python le va citi greșit (în cel mai bun caz, te va anunța, iar în cel mai rău caz vor apărea erori greu de identificat).

O funcție pentru un pătrat

Exercițiu

Scrie o funție care desenează un pătrat. Poți utiliza această funcție pentru a îmbunătăți programul cu pătrate înclinate? Dacă schimbi programul pentru a folosi o funcție, este mai ușor să experimtentezi?

Soluție

def tilted_square():
  turtle.left(20)     # now we can change the angle only here
  for _ in range(4):
      turtle.forward(50)
      turtle.left(90)

tilted_square()
tilted_square()
tilted_square()

# bonus: you could have a separate function for drawing a square,
# which might be useful later:

def square():
  for _ in range(4):
      turtle.forward(50)
      turtle.left(90)

def tilted_square():
  turtle.left(20)
  square()

# etc

O funcție pentru un hexagon

Exercițiu

Scrie o funcție care desenează un hexagon.

_images/hexagon.png

Acum combină funcția aceasta într-un fagure. Creează un singur strat așa:

_images/honeycomb.png

Încearcă!

Hint

Asigură-te că funcția ta hexagon întoarce țestoasa exact în aceeași poziție și unghi cum era înainte de a desena hexagonul. Este mai ușor să te gândești în acest fel.

Soluție

def hexagon():
  for _ in range(6):
      turtle.forward(100)
      turtle.left(60)

for _ in range (6):
    hexagon()
    turtle.forward(100)
    turtle.right(60)

Poți să pui partea cu``turtle.forward(100); turtle.right(60)`` direct în funcție, dar în acest caz ar fi mai bine să nu o denumești hexagon. Asta ar fi derutant pentru că de fapt desenează un hexagon și pe urmă avansează într-o poziție în care un alt hexagon ar avea sens doar în cazul unui fagure. Dacă ai avea nevoie să reutilizezi funcția la altceva decât faguri, asta ar fi neașteptat.