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.
>>> 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.
>>> 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()
istr()
retornen una representació del valor de l’objecte com a string.
>>> 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.
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.
>>> 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']