Conceptes clau de Python

Objectes

  • Les dades en Python es representen com objectes.

  • Tot objecte té identificador, tipus, estat (atributs o valor) i comportament (mètodes).

  • Tipus predefinits i altres tipus (classes).

Identificador d’un objecte

  • L’identificador d’un objecte és un nombre natural.

  • Es pot consultar cridant la funció id().

  • L’operador is permet saber si dos objectes són el mateix.

  • Un cop creat un objecte, l’identificador no canvia.

  • Identificador d’un objecte al Python Tutor

>>> a = "xyz"
>>> id(a)
140464420688944
>>> b = "xyz"
>>> id(b)
140464420688944
>>> c = "t"
>>> id(c)
140464425362032
>>> a is b
True
>>> b is c
False

Tipus d’un objecte

  • El tipus d’un objecte determina les operacions i els valors de l’objecte.

  • Es pot consultar cridant la funció type().

  • Un cop creat un objecte, el tipus no canvia.

  • Tipus d’un objecte al Python Tutor

>>> a = 3 # a es refereix a l'enter 3
>>> type(a)
<class 'int'>
>>> b = a
>>> a = "abc" # a ara es refereix a l'string "abc"
>>> type(a)
<class 'str'>
>>> type(b) # Però l'objecte 3 segueix essent de tipus enter
<class 'int'>

Valor d’un objecte

  • El valor

    • pot canviar, si l’objecte és mutable, i

    • no canvia, si l’objecte és immutable.

  • Les funcions repr() i str() retornen una representació del valor de l’objecte com a string.

  • Valor d’un objecte al Python Tutor

>>> a = 3.7
>>> str(a), repr(a)
('3.7', '3.7')
>>> b = [1, 2, "abc"]
>>> str(b), repr(b)
("[1, 2, 'abc']", "[1, 2, 'abc']")
>>> c = 'xyz'
>>> str(c), repr(c)
('xyz', "'xyz'")
>>> # les llistes són mutables
>>> l = [-3, 5]
>>> str(l), id(l), type(l)
('[-3, 5]', 140063405847936, <class 'list'>)
>>> l.append(-8)
>>> str(l), id(l), type(l)
('[-3, 5, -8]', 140063405847936, <class 'list'>)

Variables

  • Una variable és un nom que fa referència (o es refereix) a un objecte.

  • Més d’una variable pot fer referència al mateix objecte.

  • Els elements dels objectes contenidors són referències a objectes.

  • Cal anar amb compte quan més d’una variable fa referència a un objecte mutable.

-Objectes i noms al Python Tutor

>>> l = [1, 2]
>>> m = l
>>> # l i m fan referència al mateix objecte
>>> l is m
True
>>> n = [1, 2]
>>> # l i n NO fan referència al mateix objecte
>>> l is n
False
>>> # encara que siguin iguals
>>> l == n
True
>>> # Compte amb els objectes mutables!
>>> m
[1, 2]
>>> l[0] = -5
>>> # l i m fan referència al mateix objecte
>>> m
[-5, 2]

Espais de noms

  • Un espai de noms (namespace) és una funció que donat un nom li assigna un objecte.

  • Exemples: builtin names, noms globals d’un mòdul, noms locals d’una funció, …

  • La funció dir() permet consultar els noms d’un espai de noms.

  • No hi ha cap relació entre els noms de diferents espais de noms.

  • Els espais de noms es creen i es destrueixen en diferents moments de l’execució d’un programa.

    • L’espai global d’un mòdul es crea quan s’importa i es destrueix quan acaba el programa.

    • L’espai local d’una funció es crea quan es crida i es destrueix quan retorna.

    • Espais de noms 1 al Python Tutor

  • L'àmbit de visibilitat és la regió del programa on es pot accedir a un espai de noms directament (sense qualificar).

  • Les referències a noms fora de l’àmbit local són només de lectura: l’escriptura d’un nom global crea un nom local.

  • import, from i espais de noms.

  • Espais de noms 2 al Python Tutor

>>> dir()
['__builtins__', '__name__']
>>> a = 3
>>> dir()
['__builtins__', '__name__', 'a']
>>> def f(x):
...   return x + 1
... 
>>> dir()
['__builtins__', '__name__', 'a', 'f']
>>> dir(a)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> import math
>>> dir(math)
['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']