Funcții cu parametri

Introducere

Pe măsură ce reducem codul și adăugăm funcții pentru a elimina duplicarea, îl factorizăm. Ăsta este un lucru bun. Dar funcțiile pe care le-am creeat până acum nu sunt foarte flexibile. Variabilele sunt definite în cadrul funcției, așa că dacă vrem să folosim un alt unghi sau altă distanță atunci trebuie să scriem o nouă funcție. Funcția noastră hexagon poate desena doar o singură dimensiune de hexagon!

Din acest motiv avem nevoie să putem transmite funcției parametri, numiți și argumente. În acest mod variabilele din cadrul funcției pot avea diverse valori la fiecare apel al funcției.

Iată cum am definit funcția line_without_moving() în secțiunea precedentă:

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

O putem îmbunătăți transmițându-i un parametru:

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

Parametrul se comportă ca o variabilă vizibilă doar în cadrul definiției funcției. Utilizăm această funcție nou definită prin apelarea ei cu noua valoare pe care dorim să o aiba parametrul în acest mod:

line_without_moving(50)
line_without_moving(40)

Am utilizat funcții cu parametri încă de la începutul cursului cu turtle.forward(), turtle.left() etc.

Și putem pune oricâte argumente (sau parametri) dorim, separându-le cu virgule și dându-le nume diferite:

def tilted_line_without_moving(length, angle):
    turtle.left(angle)
    turtle.forward(length)
    turtle.backward(length)

O funcție parametrizată pentru un hexagon de dimensiune variabilă

Exercițiu

Scrie o funcție care îți permite să desenezi hexagoane de orice dimensiune dorești, la fiecare apelare.

Soluție

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

O funcție cu mai mulți parametri

Exercițiu

Scrie o funcție care va desena o formă cu oricâte laturi (să presupunem că mai mult de două), de orice lungime a laturii. Fă-o să deseneze diverse forme.

Uite un exemplu de desenare a unor forme cu această funcție:

_images/shapes.png

Tip

Suma unghiurilor externe a oricărei forme este întotdeauna 360 de grade!

Soluție

def draw_shape(sides, length):
    for _ in range(sides):
        turtle.forward(length)
        turtle.right(360 / sides)

Supliment

Ar putea suna aiurea, dar este perfect posibil să transmiți o funcție ca parametru altei funcții! Python tratează funcțiile ca pe ‘lucruri’ perfect normale, la fel ca variabilele, numerele și șirurile de caractere.

De exemplu, ai putea creea o funcție de desenare a funei forme care se întoarce într-o direcție sau alta în funcție de ce funcție îi transmiți - turtle.left sau turtle.right.

Vezi dacă poți implementa asta!

Note

Transmiterea unei funcții (de ex. turtle.left) este diferită de apelarea acesteia, care s-ar scrie turtle.left(45).