El Jupyter Notebook (antes conocido como IPython) es una aplicación web que permite crear y compartir documentos que contienen código en vivo, ecuaciones, visualizaciones y texto explicativo. Sus usos incluyen: limpieza y transformación de datos, simulación numérica, modelización estadística, aprendizaje automático y mucho, mucho más. Los notebooks tienen la extensión .ipnb, aunque es posible guardarlos como archivo .py o en otros formatos. Utilizar un cuaderno Jupyter tiene una serie de ventajas. Entre ellas se encuentran
Los notebooks tienen 2 modos:
La primera vez que se abre un notebook vale la pena hacer el recorrido de la interfaz de usuario en **Help**.
Usar help(object) da información sobre el objeto. Así, por ejemplo, si queremos ayuda sobre la función imprimir, escribimos help(print) en la celda de abajo y ejecutamos
help(print)
Help on built-in function print in module builtins: print(...) print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments: file: a file-like object (stream); defaults to the current sys.stdout. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. flush: whether to forcibly flush the stream.
Por defecto la celda/línea viene seleccionada con el tipo Code. Las posibilidades son 4 como muestra la imagen siguiente:
Utilizaremos Code para ingresar el código y Markdown para insertar comentrios que pueden incluir imágenes, fórmulas, etc.
Raw NBconvert sólo es útil si se pretende utilizar la herramienta de línea de comandos nbconvert para convertir el cuaderno a otro formato (como HTML o Latex). Entonces, las celdas marcadas como Formato NBConvert sin procesar se convertirán de una manera específica a la salida que se esté buscando.
Qué ocurre cuando se selecciona Heading?
El script de Python es un conjunto de instrucciones, escritas en el lenguaje Python, que se ejecutan en orden y llevan a cabo una serie de comandos.
Ver Ketboard shortcuts en el menú Help.
Una característica importante de Python como ecosistema, en comparación con ser sólo un lenguaje de programación, es la disponibilidad de un gran número de bibliotecas y herramientas. Estas bibliotecas y herramientas generalmente tienen que ser importadas cuando se necesitan (por ejemplo, una biblioteca para realizar gráficos) o tienen que ser iniciadas como un proceso separado del sistema (por ejemplo, un entorno de desarrollo de Python).
Los que estén familiarizados con (por ejemplo) Matlab y R sabrán que vienen con un conjunto de módulos preconfeccionados de varios aspectos de la computación científica. Importar significa hacer que una biblioteca esté disponible para el espacio de nombres actual y el proceso de interpretación de Python actual. Se utiliza la palabra reservada import.
Python en sí mismo ya viene con un gran conjunto de bibliotecas que mejoran el intérprete básico en diferentes direcciones. Por ejemplo, los cálculos matemáticos básicos; la E/S; la manipulación de cadenas, pueden hacerse sin ninguna importación, mientras que las operaciones que requieren (digamos) funciones matemáticas más complejas necesitan ser importadas a través de la biblioteca de matemáticas. Cuando un programa de Python se inicia sólo tiene acceso a unas funciones y clases básicas.
("int", "dict", "len", "sum", "range", ...)
Los "módulos" contienen funcionalidad adicional. Usa el comando "import" para decirle a Python que cargue un módulo, por ejemplo:
import matplotlib
import scipy
import nltk
Veamos qué módulos hay ahora en el directorio utilizando dir()
dir()
['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i2', '_i3', '_ih', '_ii', '_iii', '_oh', 'exit', 'get_ipython', 'matplotlib', 'nltk', 'quit', 'scipy']
Después de utilizar cualquiera de los módulos, si no tenemos más uso, se puede utilizar la palabra reservada del para eliminar un módulo importado. Vamos a eliminar nltk y comprobar el directorio
del nltk
dir()
['In', 'Out', '_', '_3', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i2', '_i3', '_i4', '_ih', '_ii', '_iii', '_oh', 'exit', 'get_ipython', 'matplotlib', 'quit', 'scipy']
Es habitual introducirse en cualquier lenguaje nuevo escribiendo el primer programa/código que simplemente muestra un mensaje de bienvenida en la pantalla.
print('Hola')
Hola
print("Hola!")
Hola!
print"Hola!" #este comando da error
Input In [7] print"Hola!" #este comando da error ^ SyntaxError: invalid syntax
Tengamos en cuenta que las comillas simples y las dobles son lo mismo. Python es uno de los pocos lenguajes de programación donde ' ' y " " tienen la misma funcionalidad. Una regla general es elegir una y quedarse con ella. Más adelante discutiremos cuándo puede haber excepciones a esta regla.
Una cadena es una secuencia de caracteres encerrados entre comillas simples o dobles.
El uso de paréntesis es necesario ya que print es una función.
Las cadenas son de menor importancia para las finanzas computacionales, aunque se encuentran con frecuencia al tratar con archivos de datos, especialmente al importar o al formatear la salida. El uso de cadenas puede facilitar el código de fácil uso.
Los comentarios siguen el carácter cardinal #.
Lo que hace a Python particularmente divertido es su naturaleza interactiva. Podemos recibir una respuesta inmediata para cada declaración, mientras que la ejecución de las declaraciones previamente alimentados en la memoria activa.
Esto también permite el uso del modo interactivo como una calculadora. He aquí algunos ejemplos: $x+y$, $z^n$, $\sqrt{m}$
3+3
5**3
sqrt(64)
La última operación dio error porque se ha realizado sin importar la biblioteca matemática.
Para obetener un resultado debemos primero importar la boblioteca math, tal como se muestra a continuación:
from math import sqrt
sqrt(64)
del sqrt #esto eliminará la función de raíz cuadrada
from math import sqrt
Se pueden expresar varias sentencias en la misma línea separadas por comas.
Notemos que $x^n$ se expresa en python como x**n
3+3, 5**3, sqrt(64)
¿Qué ocurre si se utilizan puntos y comas? En Python los grupos de sentencias se ejecutan uno tras otro:
3+3; 5**3; sqrt(64)
3+3,
5**3,
sqrt(64)
La importación anterior de la función sqrt significa que cada vez que se necesita una función diferente, hay que llamarla, lo que hace que el uso de las funciones incorporadas sea bastante engorroso.
El siguiente comando es una alternativa perezosa, pero muy buena para los principiantes en Python
from math import *
exp(1) #función exponencial
o podemos adoptar un nombre corto para un módulo importado (que es una técnica popular)
import math as m # m es un objeto
entonces usamos m. antes de cada llamada a la función. Por ejemplo, para utilizar la función exponencial ahora sería
m.exp(1)
print(m.sqrt)
Este es el enfoque de los métodos en la programación orientada a objetos (POO).
La notación m.exp(1.0) es un primer ejemplo de POO. Al ser una función matemática, el objeto m posee la función del método que se llama utilizando la notación punto. Esto difiere de la función(.....)
Se puede obtener una lista útil de funciones matemáticas en https://docs.python.org/2/library/math.html
Utilizando TAB se despliegan todas las fuciones asociadas a un objeto.
m.
Cuando se definen los nombres de las variables sólo deben contener números, letras (tanto mayúsculas como minúsculas) y guiones bajos _.
Deben comenzar con una letra o un guión bajo. Python es sensible a las mayúsculas y minúsculas. Como en la mayoría de los lenguajes, es importante que no se utilicen palabras reservadas (por ejemplo, import o for) para los nombres de las variables. Los siguientes son algunos nombres de variables que no están permitidos:
A continuación, algunos ejemplos de nombres legales de variables definidas por el usuario.
x = 1.0
X = 2.0
X1 = 1.0
X1 = 1.5 # nota se permite la redefinición
x1 = 1.1
big = 1.0
bigfoot = 1.0
Bigfoot = 1.0
_x = 1.0 # legal pero no recomendado
x_ = 1.0 # legal pero no recomendado
Técnicamente hablando, Python tiene una característica conocida como recolección de basura que limpia la memoria no utilizada a medida que el programa se ejecuta y no es necesario gestionar esos detalles en el código. En Python, el espacio se recupera inmediatamente, tan pronto como la última referencia a un objeto es se elimina.
Habiendo prescindido del código habitual, nuestros primeros ejemplos implican programas que evalúan fórmulas matemáticas. La naturaleza interactiva de Python permite utilizarlo como una calculadora.
Consideremos un problema fundamental pero muy importante en finanzas: $TV=PV(1+r)^N$ donde se calcula el valor al vencimiento $VT$ dada una inversión inicial $PV$ compuesta a una tasa $r$ anual durante $N$ años
PV=100; r=0.1; N=3 # definición de variables
TV=PV*(1+r)**N; # cálculo del valor al vencimiento
print(TV) # muestra el valor hallado
Todo lo anterior podría haberse expresado en una sola línea como se muestra a continuación:
PV=100; r=0.1; N=3; TV=PV*(1+r)**N; print(TV)
print(100*(1+0.1)**3)
El significado de un operador depende del tipo al que lo apliquemos.
1+1
'a'+'b'
"Mc " + "Donald's"
'1'+'1'
Espacio en blanco es el nombre dado a los espacios, tabulaciones y sangrías. El espacio en blanco también se usa para definir bloques usando sangría. Esto favorece la legibilidad. Para cierto código es necesario, y lo discutiremos más adelante en la sección de funciones definidas por el usuario.
El final de una línea no es importante en Python, ya que ignora casi por completo los espacios en blanco. El script de la fórmula compuesta anterior se expresó de dos maneras y ambas dieron el mismo resultado. Sin embargo, la falta de comentarios en el programa, espacios, nuevas líneas y sangría hace que este programa sea poco amigable, y con programas más grandes se vuelve muy difícil de leer. Aunque el desarrollo de un buen estilo de programación va mucho más allá de aprender a maquetar los programas correctamente, este es un buen comienzo.
Se recomienda ser coherente con el diseño del programa y asegurarse de que la sangría y el espaciado reflejan la estructura lógica de su programa.
También es una buena idea elegir nombres significativos para las variables. Hay que tener presente que el código puede necesitar ser modificado más adelante. Incluso si un programador consulta su propio código (digamos) un año más tarde, sin una documentación adecuada y el uso de nombres significativos para las variables, tendrá que dedicar un tiempo considerable a refrescarse a sí mismo en las distintas partes del código.
syntactic sugar es la sintaxis dentro de un lenguaje de programación que está diseñada para hacer las cosas más fáciles de leer o expresar. Hace que el lenguaje sea más "dulce" para el uso humano: las cosas se pueden expresar de forma más clara, más concisa o en un estilo alternativo que algunos pueden preferir.
https://en.wikipedia.org/wiki/Syntactic_sugar
La operación de modificar un valor es tan común, que la mayoría de los lenguajes tienen atajos en su sintaxis para hacer las operaciones más cortas de escribir. Estas operaciones se denominan "asignaciones aumentadas". Este tipo de atajo para una operación que ya podría estar escrita en el lenguaje se considera a veces syntactic sugar.
Este capítulo comienza nuestro recorrido por el lenguaje Python. En un sentido informal, en Python, hacemos acciones con cosas. Las "acciones" toman la forma de operaciones como la suma y la concatenación, y "cosas" se refiere a los objetos sobre los que realizamos esas operaciones. Nos centramos en esas cosas, y las acciones que nuestros programas pueden hacer con ellas.
De manera algo más formal, en Python los datos toman la forma de objetos, ya sea los objetos incorporados que proporciona Python, o los objetos que creamos utilizando Python o herramientas externas del lenguaje, como las bibliotecas de extensión de C.
¿Por qué usar tipos incorporados?
De hecho, a menos que tenga una necesidad de procesamiento especial que los tipos incorporados no proporcionan, casi siempre es mejor usar un objeto incorporado en lugar de implementar uno propio. En otras palabras, los tipos de objetos incorporados no sólo facilitan la programación, sino que también son más potentes y eficientes que la mayoría de los que se pueden crear desde cero.
La siguiente lista presenta brevemente algunos de los tipos de datos de Python:
En la siguiete tabla se ejemplifican algunos tipos de objetos:
Fuente: Lutz, M. Learning Python 4th Ed. O’Reilly (2009) (Cap 4)
El conjunto de objetos principales de Python incluye:
Los números en Python soportan las operaciones matemáticas normales. Por ejemplo, el signo más (+) realiza la adición, una estrella (*) se utiliza para la multiplicación, y dos estrellas ( ** ) se utilizan para la potenciación.
Fuente: Gauld, A. Learning to program using Python. Addison-Wesley Professional (2000).
123 + 222 #suma de integrals
1.5 * 4 #multiplicación de floating
2 ** 100 # 2 elevado a la 100
len(str(2 ** 1000000)) #cuántos dígitos tiene un número entero muy grande
El tipo de dato (escalar) más importante para el análisis numérico es el float. Para introducir un tipo de dato flotante, es necesario incluir un punto. Así, mientras que 3 es un entero, 3,0 es un flotante.
x=3; type(x)
y=3.0; type(y)
z=float(3); type(z) #Así que el entero 3 se ha convertido en el flotane 3.0
Precisión oculta Consideremos lo siguiente
0.1
0.1+0.1
0.1+0.1+0.1
0.1*3
round(0.1*3,9)
0.15*3
round(0.15*3,6)
Sí, de verdad. Si confiamos en este último decimal, lo estamos haciendo mal. Lo hemos visto antes con el ejemplo de la fórmula compuesta.
Notación científica: El cambio entre un valor entero largo y la notacion científica se puede conseguir utilizando la función float(). Así que $a\times{10^N}$ where $a\in{\mathbb{R}}, x\in{\mathbb{Z}}$ se puede escribir en Python como aeN.
Ejemplos
x=2**127+2**65
print(x)
float(x) # esto convierte lo anterior a la forma estándar
La función type devuelve el tipo de cualquier objeto. La combinación de tipos de forma incorrecta devuelve un error.
Nota: Las variables en sí mismas no tienen un tipo fijo. Sólo los valores a los que se refieren tienen un tipo. Esto significa que el tipo al que se refiere una variable puede cambiar a medida que se interpretan más sentencias.
x=3; type(x)
x=3.0; type(x)
y=float(3); type(y)
type("comida")
Así que al convertir entre tipos
Las cadenas se utilizan para registrar información textual, así como colecciones arbitrarias de bytes. Son nuestro primer ejemplo de lo que llamamos una secuencia en Python, es decir, un conjunto de objetos ordenados por su posición.
Las secuencias mantienen un orden de izquierda a derecha entre los elementos que contienen: sus elementos se almacenan y obtienen por su posición relativa. Estrictamente hablando, las cadenas son secuencias de cadenas de un solo carácter; otros tipos de secuencias son las listas y las tuplas, que veremos más adelante.
Dos cadenas pueden ser unidas/agregadas (concatenadas) utilizando el operador +. Esta unión de cadenas es muy sencilla; sin embargo, si se quiere que las palabras estén divididas por un espacio, es necesario agregar el espacio.
Fuente: Gauld, A. Learning to program using Python. Addison-Wesley Professional (2000).
"Hola," + "Juan!"
"Hola, "+"Juan!"
"Hola," + " Juan!"
El texto es una cadena de caracteres. El texto puede convertirse en enteros (integer) mediante la función incorporada int()
int("10")
int("-100")
int("100-10") # cuél es el problema?
Python tiene, al igual que otros lenguajes, secuencias de escape para los literales de cadena. Dos de las más utilizadas son:
print("Hola, \nJuan") # inserta una línea
print("Hola,\tJuan!") # inserta una tabulación
Para averiguar la longitud de una cadena, se utiliza la función len():
len("supercalifragilisticexpialidocious")
len("supercali fragilisticexpialidocious") #los espacios se cuentan
Podemos unir varias copias de una cadena con el operador *
3*'XYZ'
Slicing es un método utilizado para extraer una porción de la cadena, es decir, subcadenas. Slicing utiliza [ ] para contener los índices de los caracteres de una cadena. Una cadena con n caracteres, tiene el primer índice en 0, y el último es n-1.
Dada una variable de cadena string, los tipos de cortes más utilizados son
string[i]
, devuelve el carácter en la posición i
`string[:i]´, que devuelve los caracteres iniciales de las posiciones 0 a i-1
string[i:]
, devuelve los caracteres finales de las posiciones i a n-1
string[i:j]
, devuelve los caracteres de i a j-1
string[i:j:k]
, devuelve los caracteres de i a j-1 en pasos de k
Qué devuelve la sentencia string[-i]
?
S = "Spam"
S[1:] #todo después del primero (1:len(S))
S #la palabra S no ha cambiado
S[0 :3] # Todo menos el último
S[:3] #lo mismo que S[0:3]
S[-1] #el último elemento desde el final en S
S[len(S)-1] #indexación negativa, por la vía difícil
S[-2] #el penúltimo elemento desde el final
S[:-1] #todo menos el último de nuevo, pero más simple (0:-1)
S[:] #todo S como copia de nivel superior (0:len(S))
Cada objeto en Python se clasifica como inmutable (inmodificable) o no. En términos de los tipos principales, los números, las cadenas y las tuplas son inmutables. Las listas y los diccionarios son mutables (pueden ser cambiados en el lugar libremente).
Entre otras cosas, la inmutabilidad puede utilizarse para garantizar que un objeto permanezca constante a lo largo de todo el programa.
Sus caracteres individuales no pueden ser modificados con una sentencia de asignación y tiene una longitud fija. Cualquier intento de violar esta propiedad resultará en un TypeError
string = "Press return to exit"
print(string[0:12])
string[0]="p" # intento de asignar el velor "p" al primer caracter ("P")
Concatenación de cadenas y (str) para formatear una salida.
El formato de cadenas es una forma más común (y eficiente) de construir cadenas. El formateo de cadenas tiene un formato y los valores están separados por un % (operador del intérprete), es decir, formato % valor.
Los formatos dependen de la conversión deseada de los valores en una cadena: %s
y %d
almuerzo = "pizza"
# se utiliza un %s como marcador de valores para una cadena
"Para el almuerzo comí una %s" % almuerzo
numero=2
"Para el almuerzo comí %s sándwiches" % numero
comida="almuerzo"
numero=2.5
# se utiliza un %s para mostrar un número de punto flotante
"Para el %s comí %s sándwiches" % (comida,numero)
# se utiliza un %d para mostrar un número entero
"Para el %s comí %d sándwiches" % (comida,numero)
comida="la cena"
cantidad=3.5
alimento="pizzas"
"Para %s comí %s %s" % (comida,cantidad,alimento)
La f de f-strings bien puede significar "fast". Además, el código queda más fácil de leer.
Las cadenas f son más rápidas que %-formatting
y str.format()
.
"Las cadenas f proporcionan una forma de incrustar expresiones dentro de literales de cadena, utilizando una sintaxis mínima. Hay que tener en cuenta que una cadena-f es realmente una expresión evaluada en tiempo de ejecución, no un valor constante. En el código fuente de Python, una cadena f es una cadena literal, prefijada con f, que contiene expresiones dentro de llaves. Las expresiones se sustituyen por sus valores". (Fuente)
En tiempo de ejecución, la expresión dentro de las llaves se evalúa en su propio ámbito y luego se junta con la parte literal de la cadena f. La cadena resultante se devuelve. Eso es todo lo que se necesita.
print(f'Para {comida} comí {cantidad} {alimento}.')
El objeto lista de Python es la secuencia más general que proporciona el lenguaje.
Las listas son colecciones ordenadas posicionalmente de objetos de tipo arbitrario, y no tienen un tamaño fijo. También son mutables, a diferencia de las cadenas, las listas pueden ser modificadas por medio de asignaciones o una variedad de métodos de listas.
mi_lista = [123, 'spam', 1.23] # una lista de tres objetos de distinto tipo
len(mi_lista) # número de elementos de la lista
mi_lista[0] # indexación por posición
mi_lista[3] = 0 #no es posible agregar un elemento asigando un valor a un indice que no existe
mi_lista[:-1] # al cortar una lista se obtiene una nueva lista
mi_lista + [4, 5, 6] # la concatenación hace una nueva lista también
mi_lista # no cambiamos la lista original
Ejercicio: cree una lista y pruebe los métodos mencionados
mi_lista.remove(123)
mi_lista
mi_lista.insert(0,123)
mi_lista
mi_lista.sort()
mi_lista.reverse()
mi_lista
Una buena característica de los tipos de datos del núcleo de Python es que admiten el anidamiento arbitrario podemos anidarlos en cualquier combinación, y tan profundamente como queramos (por ejemplo, podemos tener una lista que contenga un diccionario, que contenga otra lista, y así sucesivamente). Una aplicación inmediata de esta característica es la de representar matrices, o "arrays multidimensionales" en Python. Una lista con listas anidadas hará el trabajo para aplicaciones básicas.
Para realizar operaciones con grandes matrices y vectores se utiliza la extensión Numpy que convierte a Python en el equivalente de una versión gratuita y más potente del sistema Matlab. Organizaciones como la NASA, Los Álamos y JPMorgan Chase utilizan esta herramienta para tareas científicas y financieras.
M = [[1, 2, 3], # matriz de 3 × 3, como listas anidadas
[4, 5, 6], # el código puede abarcar líneas si está entre corchetes
[7, 8, 9]]
M
M_2 = [[11, 22, 33], [44, 55, 66], [77, 88, 99]]
M_2
M[1] #fila 2 de M
M[1][2] #fila 2 columna 3 de M (o elemento en el lugar 3 de la fila 2)
Los diccionarios de Python son algo completamente diferente: no son secuencias en absoluto, sino que se conocen como mapeos.
Los mapeos también son colecciones de otros objetos, pero almacenan los objetos por clave en lugar de por posición relativa. De hecho, los mapeos no mantienen ningún orden fiable de izquierda a derecha; simplemente asignan claves a valores asociados. Los diccionarios, el único tipo de mapeo en el conjunto de objetos del núcleo de Python, también son mutables: pueden cambiarse en el lugar y pueden crecer y reducirse a petición, como las listas.
Para crear un diccionario se utilizan corchetes {}. También se puede crear un diccionario utilizando dict.
Los diccionarios son útiles siempre que necesitemos asociar un conjunto de valores con claves, para describir las propiedades de algo, por ejemplo:
mi_dict = {'tipo': "call", 'subyacente': 'SOJ.ROS/JUL23', 'strike': 508 , 'prima': 2.5, 'volumen': 20}
mi_dict
mi_dict['tipo'] # Obtener el valor de la clave 'tipo'
mi_dict['volumen'] += 5 # Sumar 5 al volor de 'volumen'
mi_dict
D = {} #crea un diccionario vacio
D['orden'] = 'C' #crea las claves mediante asignación de valores
D['subyacente'] = 'DLR/AGO22'
D['precio'] = 139
D
Los diccionarios también se pueden utilizar para sustituir las operaciones de búsqueda: indexar un diccionario por clave suele ser la forma más rápida de codificar una búsqueda en Python. Los diccionarios también pueden hacerse pasando argumentos de palabras clave al nombre del tipo (type):
D2 = dict(orden= 'C', subyacente= 'DLR/AGO22', precio= 139)
D2
Para capturar información mas compleja los diccionarios se pueden anidar. No es el objetivo profundizar en este tema. Se presenta porque por ejemplo cuando se hace una consulta a la market data de MtR utilizando por ejeplo pyRofex, la información que devuelve es un diccionario. Ademas, se puede observar en este ejemplo la flexibilidad de los tipos de datos principales de Python.
segments = {'status': 'OK',
'segments': [{'marketSegmentId': 'DDA', 'marketId': 'ROFX'},
{'marketSegmentId': 'DDF', 'marketId': 'ROFX'},
{'marketSegmentId': 'DUAL', 'marketId': 'ROFX'},
{'marketSegmentId': 'TEST', 'marketId': 'ROFX'},
{'marketSegmentId': 'MAE', 'marketId': 'ROFX'},
{'marketSegmentId': 'MERV', 'marketId': 'ROFX'},
{'marketSegmentId': 'MVR', 'marketId': 'ROFX'},
{'marketSegmentId': 'MATBA', 'marketId': 'ROFX'},
{'marketSegmentId': 'U-DDA', 'marketId': 'ROFX'},
{'marketSegmentId': 'U-DDF', 'marketId': 'ROFX'},
{'marketSegmentId': 'U-DUAL', 'marketId': 'ROFX'},
{'marketSegmentId': 'U-DDF-S', 'marketId': 'ROFX'}]}
segments
segments.keys()
segments['segments'] #esta clave contiene una lista con dos elementos que son a su vez diccionarios
len(segments['segments'])
segments['segments'][0] #se accede a un elelemnto de una lista, que a su vez es un diccionario
segments['segments'][0]['marketSegmentId']
segments['segments'].append('nuevo segmento')
segments
len(segments['segments'])
El objeto tupla es prácticamente como una lista que no puede modificarse: las tuplas son secuencias, como las listas, pero son inmutables, como las cadenas. Sintácticamente, se codifican entre paréntesis en lugar de corchetes, y admiten tipos arbitrarios, anidación arbitraria y las operaciones de secuencia habituales.
T = (1, 2, 3, 4) # Una tupla de 4 elementos
T
len(T) # Longitud
T[0] # Indexación, corte y más
Las tuplas también tienen dos métodos específicos de tipo llamable, pero no tantos como las listas:
T.index(4) # Métodos de tuplas: el 4 aparece en el indice 3
T.count(4) # El 4 aparece una vez
T = () # Una tupla vacía se indica con ()
type(T)
Las tuplas se puede utilizar en lugar de las listas, pero tienen muchas menos funciones ya que no pueden ser modificadas entonces no hay append(), insert() por ejemplo.
Entonces, ¿por qué no usar listas en lugar de tuplas en todas partes?
Los operadores lógicos son útiles cuando se combinan con el control de flujo, ya que permiten que un programa busque la verdad/falsedad al tomar decisiones complejas.
2<8 # haciendo la pregunta
8>10 # haciendo la pregunta
5==10 # haciendo la pregunta, cuando se compara se utiliza ==
10!=6 # 10 es distinto de 6?
Verdadero y Falso son (los únicos) dos valores de un tipo especial de Python llamado "Booleano" que se utiliza para registrar si algo es verdadero o no. En cualquier código, las demás opciones dependen del resultado de esta prueba. Así como el operador "+" toma dos enteros y devuelve un valor entero, el operador "<" toma dos enteros y devuelve un booleano; bool para abreviar.
type(True)
type(10==10)
Una pregunta común en matemáticas es probar si $x\in{(a,b)}$. Supongamos que deseamos probar en Python si un número se encuentra en el intervalo abierto 0 y 10. Supongamos que ese número es 4
numero=4
0<numero<10
También podemos considerar la ordenación alfabética, por ejemplo
"dia" < "don"
"dias" > "dia"
Los tipos booleanos tienen su propia aritmética al igual que los números ordinarios. Los números tienen operaciones aritméticas +, -, $\times$, $\div$. ¿Qué operaciones tienen los booleanos? La primera operación es el operador y.
Verdadero y Verdadero $\longrightarrow$ Verdadero
Verdadero y Falso $\longrightarrow$ Falso
Falso y Verdadero $\longrightarrow$ Falso
Falso y Falso $\longrightarrow$ Falso
El y de dos valores booleanos es Verdadero si (y sólo si) sus dos entradas son Verdaderas. Si alguno de los dos es Falso, su salida es Falsa. Vemos que la condición y es fuerte.
Ejemplos:
5 < 10 and 6 < 8
5!=10 and 6 > 8
4>6 and 10!=8
4>6 and 8>10
Ahora veamos el operador o
Verdadero o Verdadero $\longrightarrow$ Verdadero
Verdadero o Falso $\longrightarrow$ Verdadero
Falso o Verdadero $\longrightarrow$ Verdadero
Falso o Falso $\longrightarrow$ Falso
El resultado de esta operación es Verdadero si cualquiera de sus entradas es Verdadera y Falso sólo si ambas entradas son Falsas.La condición o es más débil que y.
Ejemplos:
5 < 10 or 6 < 8 # Esto se reduce a 'Verdadero o Verdadero'
5!=10 or 6 > 8 # Esto se reduce a 'Verdadero o Falso'
5==10 or 6 > 8 # Esto se reduce a 'Falso o Falso'