Skip to content

Instantly share code, notes, and snippets.

@zeehio
Last active December 27, 2015 12:49
Show Gist options
  • Save zeehio/7329208 to your computer and use it in GitHub Desktop.
Save zeehio/7329208 to your computer and use it in GitHub Desktop.
Una analogia de funcions en programació amb funcions a matemàtiques que espero que ajudi als estudiants que comencen a programar.

Funcions: Variables locals

En aquesta pàgina s'explica com s'utilitzen els arguments de funcions i com no s'utilitzen. Primer fem una analogia amb les funcions matemàtiques i després apliquem la mateixa lògica de les funcions matemàtiques a la programació.

La gràcia de fer servir funcions és que divideixes un problema (dibuixar una cara) en petites parts independents entre sí (ulls, nas, boca...).

Analogia matemàtica

És semblant a les matemàtiques:

Tens una funció, per exemple: f(x,y) = x^2+y^2

Pots preguntar-te: Quant val f(3,4)? Associes el 3 amb la x, el 4 amb la y i trobes 25.

Pots preguntar-te: Si z=3 i t=4, quant val f(z, t)? Associes la z amb la x, la t amb la y i trobes 25.

Pots preguntar-te: Si x=3 i y=4, quant val f(x, y)? Associes la x amb la x, la y amb la y i trobes 25.

Fixa't que en el darrer cas es dóna una coincidència: Les variables de fora la funció coincideixen amb les variables de dins de la funció.

El que no faràs mai a matemàtiques és dir: f(x,y) = z^2 + t^2

No ho faràs perquè estaràs fent servir les variables z i t que no són els arguments de la funció i no estan definides a dins la funció.

Programant en Python

A Python cal fer funcions de la mateixa manera:

Si una tortuga es diu "paula" en un programa, i fem la funció (malament):

def dibuixar_ull(tortuga,x,y,escala):
    """Dibuixa un ull"""
    radi = int(10*escala)  # el int() ens assegura que radi sigui enter
    paula.penup()
    paula.goto(x,y-radi) # ens situem a la part inferior de l'ull
    paula.setheading(0) # mirant a la dreta
    paula.pendown()
    paula.circle(radi) # dibuixem el cercle de l'ull

Aquesta funció fallarà, doncs paula no està definit dins de la funció. És com si estiguéssim fent f(x,y) = z^2 + y^2.

Podem provar la funció amb un programa:

#Programa:
import turtle

finestra= turtle.Screen()
finestra.setup(500,500)
finestra.title("Dibuix ull")

paula=turtle.Turtle()
paula.speed("fastest")
dibuixar_ull(paula, 20, 30, 3)
finestra.exitonclick()

Python és prou espavilat com per intentar "mirar a fora" a veure si troba la "paula", i en aquest programa la troba... però... què passarà si més endavant volem dibuixar un ull amb la tortuga "maria"? El Python intentarà buscar la "paula", i tindrem errors quan no la trobi.

A més, tenim un argument anomenat tortuga en la definició de la funció que no estem fent servir en tota la funció.

Si fem servir la definició següent:

def dibuixar_ull(tortuga, x, y, escala):
    """Dibuixa un ull"""
    radi = int(10*escala)  # el int() ens assegura que radi sigui enter
    tortuga.penup()
    tortuga.goto(x,y-radi)
    tortuga.setheading(0)
    tortuga.pendown()
    tortuga.circle(radi)

i provem el mateix programa d'abans, veurem que al cridar la funció amb:

    dibuixar_ull(paula, 20, 30, 3)

El python associa paula amb tortuga, 20 amb x, 30 amb y i 3 amb escala. I tot funciona bé.

A més, si més endavant fem servir una tortuga diferent anomenada “maria” i cridem la funció amb:

    dibuixar_ull(maria, 20, 30, 3)

El python associarà maria amb tortuga, 20 amb x, 30 amb y i 3 amb escala. I tot funcionarà bé.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment