.. -*- rst -*- Functions ========= Ús de funcions -------------- - Funcions predefinides: - Valor absolut: :py:func:`abs`. - Conversió de tipus: :py:class:`float`, :py:class:`int`, :py:class:`str`. - Longitud: :py:func:`len`. - Màxim i mínim: :py:func:`max`, :py:func:`min`. - Arrodonir: :py:func:`round`. - Tipus (o classe) d'un objecte (valor): :py:class:`type` - Vegeu-ne més a `Built-in Functions `__ del Manual de Referència de la Biblioteca de Python. - *Crida* d'una funció: :: nom_de_la_funció(argument_1, argument_2, ...) - *Arguments*: dades que reben les funcions a la crida a partir de les quals calculen el resultat. - Els arguments són expressions: composició de funcions. - Funcions d'un mòdul: :py:mod:`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 - Llista dels noms definits: :py:func:`dir`. Definició --------- .. function .. function definition .. compound statements .. header .. body .. 4 spaces is the Python standard .. def .. argument .. function call - Una funció de `python` no sempre és una funció matemàtica, però normalment ho és. - Definició: .. sourcecode:: python def nom_de_la_funció(llista_de_paràmetres): # capçalera sentències # cos return expressió # resultat - El cos és un bloc. - El bloc s'escriu sagnat respecte de la capçalera. - Els *paràmetres* són noms. Flux d'execució --------------- .. flow of execution - L'execució d'un programa és seqüencial: una sentència rere l'altra. - Les definicions de funcions no alteren el flux d'execució. - Les crides a funcions l'alteren fent que l'execució continuï per la primera sentència del cos de la funció. Després d'executar la darrera sentència del cos, torna al punt de la crida i continua seqüencialment. - `Online Python Tutor\: recta`_. .. _Online Python Tutor\: recta: http://pythontutor.com/visualize.html#code=def%20recta(a,%20b,%20x%29%3A%0A%20%20%20%20y%20%3D%20a*x%20%2B%20b%0A%20%20%20%20return%20y%0A%20%20%20%20%0Ax%20%3D%200%0Az%20%3D%20recta(3,%202,%20x%29%0Aprint(x,%20z%29%0A%0Ax%20%3D%201%0Az%20%3D%20recta(3,%202,%20x%29%0Aprint(x,%20z%29%0A&cumulative=false&curInstr=0&heapPrimitives=true&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false> Paràmetres i variables locals ----------------------------- .. parameter .. local variable .. parameters are also local .. stack diagram .. frame .. traceback/stack trace - Paràmetres: variables que reben el valor dels arguments de la crida. - La llista de paràmetres forma part de la capçalera de la definició de la funció. - Al cos de la funció es poden crear variables (locals). - Tant els paràmetres com les variables són **locals**: només existeixen en el cos de la funció. - Pila d'execuxió (*stack diagram*), bloc d'activació (*frame*) i traça de la pila (*traceback* o *stack trace*). - Variables temporals. - `Online Python Tutor\: recta`_. Sentència ``return`` -------------------- .. return statement .. return .. return value .. temporary variables .. dead code .. None .. NoneType - Sintaxi: .. sourcecode:: python return expressió - Què succeeix si oblidem el ``return`` o oblidem l'expressió: la funció retorna el valor ``None`` de tipus ``Nonetype``. - ``return`` i codi inassolible (*dead code*). - `Online Python Tutor\: oblit`_. .. _Online Python Tutor\: oblit: http://pythontutor.com/visualize.html#code=%23%20Hem%20oblidat%20retornar%20un%20valor%0A%0Adef%20oblit(a,%20b%29%3A%0A%20%20%20%20c%20%3D%20a%20%2B%20b%0A%20%20%20%20%0Am%20%3D%20oblit(3,%202%29%0Aprint(m,%20type(m%29%29%0A&cumulative=false&curInstr=0&heapPrimitives=true&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false .. return per a condicions excepcionals: .. - Distància d'un punt a una recta en forma normal. - Funcions que retornen més d'un resultat: .. sourcecode:: python3 return exp1, exp2, ..., expN Desenvolupament incremental --------------------------- .. incremental development .. scaffolding - `How to think ... program development `_. - `Online Python Tutor\: distance`_. .. _Online Python Tutor\: distance: http://pythontutor.com/visualize.html#code=%23%20Versi%C3%B3%201%0A%0Adef%20distance_1(x1,%20y1,%20x2,%20y2%29%3A%0A%20%20%20%20return%200.0%0A%0Ad%20%3D%20distance_1(0,%200,%201,%201%29%0Aprint(1,%20d%29%0A%0A%23%20Versi%C3%B3%202%0A%0Adef%20distance_2(x1,%20y1,%20x2,%20y2%29%3A%0A%20%20%20%20dx%20%3D%20x2%20-%20x1%0A%20%20%20%20dy%20%3D%20y2%20-%20y1%0A%20%20%20%20return%20dx,%20dy%0A%20%20%20%20%0Ad%20%3D%20distance_2(0,%200,%201,%201%29%0Aprint(2,%20d%29%0A%0A%23%20Versi%C3%B3%203%0A%0Adef%20distance_3(x1,%20y1,%20x2,%20y2%29%3A%0A%20%20%20%20dx%20%3D%20x2%20-%20x1%0A%20%20%20%20dy%20%3D%20y2%20-%20y1%0A%20%20%20%20dsquared%20%3D%20dx*dx%20%2B%20dy*dy%0A%20%20%20%20return%20dsquared%0A%20%20%20%20%0Ad%20%3D%20distance_3(0,%200,%201,%201%29%0Aprint(3,%20d%29%0A%0A%23%20Versi%C3%B3%204%0A%0Adef%20distance_4(x1,%20y1,%20x2,%20y2%29%3A%0A%20%20%20%20dx%20%3D%20x2%20-%20x1%0A%20%20%20%20dy%20%3D%20y2%20-%20y1%0A%20%20%20%20dsquared%20%3D%20dx*dx%20%2B%20dy*dy%0A%20%20%20%20result%20%3D%20dsquared**0.5%0A%20%20%20%20return%20result%0A%20%20%20%20%0Ad%20%3D%20distance_4(0,%200,%201,%201%29%0Aprint(4,%20d%29%0A%0A%23%20Versi%C3%B3%205%0A%0Aimport%20math%0A%0Adef%20distance_5(x1,%20y1,%20x2,%20y2%29%3A%0A%20%20%20%20dx%20%3D%20x2%20-%20x1%0A%20%20%20%20dy%20%3D%20y2%20-%20y1%0A%20%20%20%20dsquared%20%3D%20dx*dx%20%2B%20dy*dy%0A%20%20%20%20result%20%3D%20math.sqrt(dsquared%29%0A%20%20%20%20return%20result%0A%20%20%20%20%0Ad%20%3D%20distance_5(0,%200,%201,%201%29%0Aprint(5,%20d%29%0A%0A%23%20Versi%C3%B3%205%0A%0Aimport%20math%0A%0Adef%20distance_6(x1,%20y1,%20x2,%20y2%29%3A%0A%20%20%20%20dx%20%3D%20x2%20-%20x1%0A%20%20%20%20dy%20%3D%20y2%20-%20y1%0A%20%20%20%20result%20%3D%20math.hypot(dx,%20dy%29%0A%20%20%20%20return%20result%0A%20%20%20%20%0Ad%20%3D%20distance_6(0,%200,%201,%201%29%0Aprint(6,%20d%29%0A&cumulative=false&curInstr=0&heapPrimitives=true&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false Composició de funcions ---------------------- - `How to think ... composition `_. - `Online Python Tutor\: geom`_. Descarregueu el mòdul :download:`geom ` i proveu-lo. .. _Online Python Tutor\: geom: http://pythontutor.com/visualize.html#code=import%20math%0A%0Adef%20distance(x1,%20y1,%20x2,%20y2%29%3A%0A%20%20%20%20dx%20%3D%20x2%20-%20x1%0A%20%20%20%20dy%20%3D%20y2%20-%20y1%0A%20%20%20%20result%20%3D%20math.hypot(dx,%20dy%29%0A%20%20%20%20return%20result%0A%20%20%20%20%0Adef%20area(r%29%3A%0A%20%20%20%20return%20math.pi%20*%20r**2%0A%0Adef%20area2(xc,%20yc,%20xp,%20yp%29%3A%0A%20%20%20%20radius%20%3D%20distance(xc,%20yc,%20xp,%20yp%29%0A%20%20%20%20result%20%3D%20area(radius%29%0A%20%20%20%20return%20result%0A%0A%0Ad%20%3D%20distance(0,%200,%201,%201%29%0Aprint(d%29%0A%0Aa%20%3D%20area(2%29%0Aprint(a%29%0A%0Ab%20%3D%20area2(0,%200,%200,%203%29%0Aprint(b%29&cumulative=false&curInstr=0&heapPrimitives=true&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false Tipus funció ------------ .. function type - El tipus funció. - Funcions com a arguments. - Documentació d'una funció: *docstring*. - *String* amb triple cometa. Programació amb estil --------------------- .. programming with style - `How to think ... programming with style `_. Exercicis --------- - `Sintaxi de funcions `_ - `Funcions misterioses `_ - `Percentatge `_ - `Càlcul de múltiples 3 `_ - `Nòmines `_ .. Conceptes *Fruitful functions* .. ------------------------------ .. triple quoted strings .. unit testing .. doctest