Funcions

Concepte

  • Anàleg al concepte de funció en matemàtiques (de moment)

Ús

Funcions predefinides

  • Una funció predefinida és una funció integrada a Python i disponible sense necessitat d'importar cap mòdul

  • Per exemple:

    • Valor absolut: abs()

    • Conversió de tipus: float, int

    • Màxim i mínim: max(), min()

    • Arrodonir: round()

    • Tipus (o classe) d’un objecte (valor): type

    • Escriure a la sortida: print()

  • Vegeu la llista completa a la secció python:built-in-funcs del manual python:library/index

Crida d’una funció

  • Sintaxi de la crida d’una funció:

    nom_de_la_funció(argument_1, argument_2, ...)
    
  • Els arguments són les dades a partir de les quals la funció calcula el resultat

  • Els arguments són expressions

  • La crida d’una funció és una expressió que s’avalua al valor descrit a la seva documentació (especificació)

Mòduls

  • El mòdul és la unitat d’organització del codi en Python

  • El mòduls contenen funcions i variables

  • Per cridar les funcions o usar les variables d’un mòdul, cal importar-lo. Es pot fer de dues maneres:

    • Amb la sentència from

      from nom_de_mòdul import funció_o_variable_1, funció_o_variable_2...
      

      Només es poden usar les funcions o variables de la llista amb la sintaxi funció_o_variable_1

    • Amb la sentència import

      import nom_de_mòdul
      

      Es pot usar qualsevol funció o variable definida en el mòdul amb la sintaxi nom_de_mòdul.funció_o_variable

  • Exemples d’importació del mòdul math

    • Importar amb from:

      >>> from math import sin, pi
      
      >>> r = sin(pi/2)
      >>> print(r)
      1.0
      
    • Importar amb import:

      >>> import math
      
      >>> r = math.sin(math.pi/2)
      >>> print(r)
      1.0
      
  • La funció dir() llista els noms definits per un objecte

Definició

  • Permet posar nom al càlcul d’un resultat a partir d’unes dades (paràmetres)

  • Sintaxi de la definició d’una funció:

    def nom_de_la_funció(llista_de_paràmetres):   # capçalera
        sentències                                # cos
        return expressió                          # resultat
    
  • La sentència def és la capçalera de la definició de la funció

  • La capçalera conté el nom de la funció i la llista de paràmetres

  • Un paràmetre és una variable que correspon a una de les dades nencessàries per tal de calcular el resultat

  • El cos és un bloc de codi format per una seqüència de sentències

  • El bloc s’escriu sagnat respecte de la capçalera

  • El resultat de la funció s’obté a l'avaluar l'expressió de la sentència return

  • Per exemple

    def recta(a, b, x):
        y = a*x + b
        return y
    
  • Escriurem la definició d’una funció en un mòdul

  • Un fitxer amb extensió .py és un mòdul

Flux d’execució de la crida d’una funció

  • L’execució de la definició d’una funció associa el nom a l’objecte funció: no altera el flux d’execució

  • L’avaluació de la crida d’una funció durant l’avaluació d’una expressió comporta:

    • Avaluar els arguments de la crida

    • Congelar l'estat del bloc d’activació (stack frame) actual

    • Crear el bloc d’activació de la funció a la pila de crides (call stack) en què l’estat incial només conté els paràmetres

    • Executar les sentències del cos fins a trobar una sentència return

    • Executar la sentència return que implica:

      • Avaluar l’expressió

      • Destruir el bloc d’activació de la funció

      • Reprendre l’avaluació de l’expressió on hi ha la crida amb el valor retornat per la funció

  • Vegeu un exemple a Online Python Tutor: recta

  • Quan es produeix un error d’execució, l'intèrpret mostra la traça de la pila de crides (traceback o stack trace)

    >>> from funcions import f
    >>> f()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "funcions.py", line 4, in f
        return 1/0
               ~^~
    ZeroDivisionError: division by zero
    
    1# mòdul funcions
    2
    3def f():
    4    return 1/0
    
    • Descarregueu el mòdul funcions i proveu-lo

Sentència return

  • Les funcions sempre retornen un valor

  • En una sentència return es pot ometre l'expressió

  • Al cos d’una funció pot haver-hi cap, una o més d’una sentències return

  • La funció acaba quan executa la primera sentència return o quan arriba al final del cos

  • Codi inassolible (unreachable code): les sentències que hi hagi darrera d’una sentència return no s’executaran mai

El valor None de tipus Nonetype

  • Quan una funció acaba perquè executa una sentència return sense expressió o bé perquè arriba al final del cos, retorna el valor None de tipus Nonetype

  • Vegeu un exemple a Online Python Tutor: oblit

Funcions que retornen més d’un resultat

  • La sintaxi de la sentència return quan la funció calcula més d’un resultat és

    return expressió_1, expressió_2...
    
  • Per exemple

    >>> def segons_a_hms(s):
    ...     h = s // 3600
    ...     s = s % 3600
    ...     m = s // 60
    ...     s = s % 60
    ...     return h, m, s
    
    >>> h1, m1, s1 = segons_a_hms(7854)
    >>> h1
    2
    >>> m1
    10
    >>> s1
    54
    >>> h1*3600 + m1*60 + s1
    7854
    

Àmbit de visibilitat

Crides entre funcions

Funcions d’ordre superior

  • En Python, una funció és un nom que fa referència a un objecte cridable de tipus function

  • Una funció d’ordre superior és una funció que

    • té una funció com a paràmetre o

    • retorna una funció com a resultat

  • Per exemple

    >>> from funcions import q, parabola_1
    >>> q(parabola_1, 0, 1e-3)
    -1.9970000000000265
    >>> from math import cos
    >>> q(cos, 1, 1e-3)
    -0.8417409956931188
    
    def q(f, a, h):
        """Calcula el pendent de la secant que
        passa per (a, f(a)) i (a+h, f(a+h)).
    
        """
        r = (f(a + h) - f(a))/h
        return r
    
    def parabola_1(x):
        return 3*x**2 - 2*x + 1
    
    • Descarregueu el mòdul funcions i proveu-lo

Documentació d’una funció

  • Documentació d’una funció: python:docstring.

  • Vegeu les seccions tut-functions i tut-docstrings del python:tutorial/index

Desenvolupament incremental

Programació amb estil

Exercicis