.. -*- rst -*- ============================ Introducció a la Programació ============================ Què és programar? ----------------- - Descriure formalment la solució genèrica d'un problema de manera que un ordinador pugui calcular una solució concreta a partir d'unes dades concretes. - Per programar calen habilitats de disciplines com :matemàtiques: per tal d'expressar els càlculs en llenguatges formals, :enginyeria: per tal de dissenyar components, assemblar-los en sistemes complexos i avaluar alternatives i :ciència: per tal d'observar el comportament de sistemes complexos, formular hipòtesis i comprovar les prediccions. Llenguatges de programació -------------------------- Segons el nivell d'abstracció distingim: - `Llenguatges de programació de baix nivell `__: - Propers al `llenguatge màquina `__ que pot executar un ordinador - `Llenguatges de programació d'alt nivell `__. Permeten escriure programes: - Portables, independents de l'arquitectura de l'ordinador que els execurta - Més curts i ràpids d'escriure - Més entenedors, fàcils de llegir i raonar sobre la seva correctesa Compiladors i intèrprets ------------------------ - `Compilador `_: programa que tradueix un *programa font* (o :term:`codi font`) a un *programa objecte* equivalent. Normalment, - el programa font està escrit en un llenguatge d'alt nivell i - el programa objecte en llenguatge màquina - `Intèrpret `_: analitza i executa el programa font, sense traduir-lo abans a llenguatge màquina. Python ------ - `Python `__ és un `llenguatge de programació interpretat `_ - L\':term:`intèrpret de Python` té dos modes de treball: - :term:`mode interactiu` (:term:`shell`): per petits experiments - :term:`mode script`: per programes Objecte i tipus --------------- - Les dades en Python es representen mitjançant objectes - Un :term:`objecte` té associats un identificador, un tipus i un valor - El :term:`tipus` d'un objecte determina el seu conjut de valors possibles i les operacions entre ells Tipus numèrics -------------- - Valors de :term:`tipus` enter (:py:class:`int`) - :term:`valors literals `: successió de dígits (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) precedits de signe (opcional) .. code-block:: python3 1285 -5284327 0 - Valors de tipus real representats en `coma flotant `__ (:py:class:`float`) - :term:`valors literals `: successió de dígits amb punt decimal intercalat o escrits en `notació científica `__ (adaptada), precedits de signe (opcional) .. code-block:: python3 12.85 -528.4327 0.0 3e-4 # 3 per 10 elevat a -4 Operadors i operands -------------------- - Operadors: símbols que representen operacions o càlculs (suma, producte, ...) - Operands: valors sobre els quals actuen els operadors - Operadors aritmètics - Unaris: negatiu (``-``), positiu (``+``). Tenen un operand i s'escriuen abans d'ell (prefix) >>> - 3 -3 >>> + 5 5 - Binaris: suma (``+``), resta (``-``), multiplicació (``*``), ``/``, ``//``, ``%``, potenciació (``**``). Tenen dos operands i s'escriuen entremig d'ells (infix) >>> 3 + 4 7 >>> 3 - 4 -1 >>> 3 * 4 12 >>> 2 ** 3 8 - Quan un operand és de tipus :class:`int` i l'altre :class:`float`, Python converteix l'operand de tipus :class:`int` a :class:`float` abans de fer l'operació >>> 7.2 - 5 2.2 >>> 2*4.1 8.2 - Divisió real (``/``) >>> 9 / 4 2.25 - Quocient (``//``) i residu (``%``) de la divisió entera >>> 9 // 4 2 >>> 9 % 4 1 >>> (9 // 4)*4 + (9 % 4) # pel teorema de la divisió entera 9 Expressions ----------- - Un :term:`valor literal` és una :term:`expressió` >>> 3 3 - Un `operador unari `_ seguit d'una expressió és una expressió >>> - 5 -5 - Una expressió sequida d'un `operador binari `_ seguit d'una expressió és una expressió >>> 5**2 25 - Una expressió tancada entre parèntesis és una expressió >>> (3 + 4) 7 Avaluació d'expressions ----------------------- - Un :term:`valor literal` s\':term:`avalua ` al valor que representa - Una :term:`expressió` tancada entre parèntesis s'avalua al valor de l'expressió - Un `operador `_ s'avalua al resultat de calcular l'operació sobre els seus operands. - L\':ref:`ordre d'avaluació ` d'una expressió depèn de - els parèntesis - la *prioritat* o precedència dels operadors: elevar, multiplicació i divisió, suma i resta >>> 3 + 2 ** (3 - 1) * 5 23 >>> 3 + ((2 ** (3 - 1)) * 5) 23 - l\'*associativitat* dels operadors amb la mateixa prioritat: d'esquerra a dreta excepte per elevar a una potència >>> 5 - 3 - 2 0 >>> (5 - 3) - 2 0 >>> 5 - (3 - 2) 4 >>> 2 ** 3 ** 4 2417851639229258349412352 >>> 2 ** (3 ** 4) 2417851639229258349412352 >>> (2 ** 3) ** 4 4096 - El resultat d'avaluar una expressió és un :term:`objecte` amb el valor de l'expressió. Variables --------- - Una :term:`variable` és un nom que es refereix a un :term:`objecte` - Els noms de variables - Són arbitràriament llargs - Només poden contenir lletres, dígits i guions baixos (``_``) - Han de començar per una lletra o un guió baix - No poden coincidir amb cap :term:`paraula clau`. Vegeu-ne la :ref:`llista ` - Exemples de noms correctes: .. code-block:: python3 _abc lm1 n_o _ _1a h_3 a94_3jl - Exemples de noms incorrectes:: 1xyz ab? b-a if @fgh Assignació ---------- - La sintaxi de la :term:`sentència` d\':term:`assignació` és :: variable = expressió - Després d'executar l'assignació, la ``variable`` **es refereix** (o fa referència) a l'objecte a què s'ha avaluat l\'``expressió`` - L'operador d'assignació (``=``) no és commutatiu - Una :term:`variable` és una :term:`expressió` - Una variable s\':term:`avalua ` al valor de l\':term:`objecte` a què es refereix >>> a = 4 * (5 - 2) >>> a 12 - Una variable pot deixar de referir-se a un objecte i passar a referir-se a un altre >>> a = 8 >>> a 8 - Una variable es defineix (o *queda definida*) a la primera assignació que rep Estat ----- - L\':term:`estat` és el conjunt de :term:`variables ` i :term:`objectes ` a què es refereixen, en un moment determinat de l'execució d'un programa - `Diagrama d'estat `__: representació gràfica de l'estat - Els objectes als quals no es refereix cap variable es destrueixen. Sentències ---------- - El :term:`codi font` d'un programa s'organitza en sentències - Una :term:`assignació` és una :term:`sentència` >>> a = 3 - Una :term:`expressió` és una sentència >>> (5 - a)*8 16 - Un programa és una seqüència de sentències - Una sentència s'ha d'escriure en una línia (llevat de molt poques excepcions) Flux d'execució seqüencial -------------------------- - El :term:`flux d'execució` d'un programa és :term:`seqüencial `: s'executa una :term:`sentència` rere l'altra en l'ordre en què estan escrites - L'execució d'una :term:`assignació` produeix un canvi d\':term:`estat` - L'execució d'una :term:`expressió` no té cap efecte sobre l'estat - La :term:`traça d'execució` és l'evolució de l'estat després de l’execució de cada sentència d’un programa - Vegeu una traça d'execució a l\'`Online Python Tutor `__. Assignació múltiple ------------------- - Sintaxi:: variable 1, variable 2, variable 3... = expressió 1, expressió 2, expressió 3... - Primer s\':term:`avaluen ` totes les :term:`expressions ` i després s\':term:`assigna ` el resultat de cada una a la :term:`variable` que li correspon - Exemple: >>> a, b = 5 - 2, 3e2 >>> a 3 >>> b 300.0 >>> a, b = b, a # intercanvi de dues variables >>> a 300.0 >>> b 3 Comentaris ---------- - Els programes els executen els ordinadors, però els llegeixen els programadors. - Els comentaris van adreçats als programadors i el seu a objectiu és facilitar la lectura dels programes - Sintaxi ``#`` >>> # exemple d'expressió >>> 3 # valor literal de tipus int 3 - L\':term:`intèrpret` descarta el text des del coixinet fins al final de la línia Errors de programació --------------------- - Els `errors de programació `__ (*bugs*) poden ser sintàctics, d'execució o semàntics - Un :term:`error sintàctic` es produeix en analitzar la :term:`sentència` i impedeix executar-la >>> ? + 5 SyntaxError: invalid syntax >>> 5 * 2) SyntaxError: unmatched ')' - Un :term:`error d'execució` es produeix durant l'execució de la sentència - La divisió per zero no està definida >>> 1/0 Traceback (most recent call last): File "", line 1, in 1/0 ZeroDivisionError: division by zero - Les :term:`variables ` que apareixen en una :term:`expressió` han d'estar definides >>> f Traceback (most recent call last): File "", line 1, in f NameError: name 'f' is not defined >>> f = -1 >>> f -1 - Un :term:`error semàntic` es produeix quan el resultat d'un programa no és l'esperat - Càlcul incorrecte del tant per cent d'estudiants aprovats sobre el total >>> aprovats = 5 >>> total = 10 >>> total/aprovats*100 200.0 - :doc:`fi:laboratori/errors/index` - `Correcció d'errors `_ (*debugging*) - :doc:`Pautes per evitar cometre errors i corregir-los `. Exercicis --------- - :doc:`fi:temes/introduccio/Conversions/index`: 2 i 5. - :doc:`fi:temes/introduccio/Física/index`: 3. - :doc:`fi:temes/introduccio/Geometria/index`: 4, 5. - :doc:`fi:temes/introduccio/Percentatge/index`