Download 02 Tipos de datos escalares en Python 3

Document related concepts
no text concepts found
Transcript
02 ­ Tipos de datos escalares en Python 3
Diego Andrés Alvarez Marín
Profesor Asociado
Universidad Nacional de Colombia
Sede Manizales
1
Comentarios en Python
Los comentarios en Python empiezan con el carácter #
2
Variables
Una variable es un nombre o referencia a un valor guardado de la memoria del sistema
En Python no es necesario declarar las variables al principio del programa (esto es necesario en lenguajes como C, C++, Pascal, Visual Basic). Las variables se declaran automáticamente cuando se les asigna un valor por primera vez. Su tipo corresponderá al tipo de dato que contienen.
Reglas para la creación de identificadores o nombres de variables, funciones, etc.
●
Los nombres dados a las referencias de objetos se llaman identificadores o simplemente nombres
●
Los nombres válidos en Python pueden tener cualquier longitud.
●
El primer carácter, debe ser una letra (UNICODE), o el guión bajo _
●
●
●
●
●
Los caracteres siguientes pueden ser también números (UNICODE), por ejemplo: '0' ... '9'. Es decir area2, area_2, área2, _area2 son un identificadores válidos; 2area, área media (con el espacio intermedio), area.media, a(b) no lo son.
Python es case­sentitive: Arbol, ARBOL, arbol, ArBoL y árbol son todos nombres diferentes
Se recomienda no utilizar los nombres ya utilizados por Python, ejemplo: int, float, list, tuple, len, str, etc.
Un nombre válido no puede ser una de las palabras claves (keywords) de Python.
Nunca utilice la ele o la “ó” minúscula como nombre de variable, ya que se puede confundir con un uno o con un cero, respectivamente: “1230 vs l2O”, “1230 vs l23O”, “1230 vs l23O”
Palabras reservadas de Python 3
Nota: las palabras clave no se pueden utilizar como identificadores. Se deben escribir exactamente como se listan aquí.
Tipos de datos
Los tipos de datos determinan el conjunto de valores que un objeto puede tomar y las operaciones que se pueden realizar con ellas.
Tipos de datos escalares:
●
–
Tipos de datos secuenciales:
●
–
Secuencias de bytes, cadenas
Tipos de datos estructurados:
●
–
Listas (lists): secuencias ordenadas de valores
–
Tuplas (tuples): secuencias inmutables de valores ordenados
–
Conjuntos (sets): conjunto no ordenado de valores
–
Diccionarios (dictionaries): conjunto no ordenado de valores, que tienen una “llave” que los identifican
Objetos: módulos, funciones, clases, métodos, archivos, código compilado, etc.
●
●
Números enteros, flotantes, complejos, fraccionarios, lógicos(booleanos)
“Constantes”
Números
●
Enteros (int): pueden ser arbitrariamente largos, es decir no hay límites MIN_INT o MAX_INT como en lenguaje C. Su tamaño está limitado por la memoria del computador.
–
Base 10: 1, 2
–
Base 2: 0b101110110, 0B001001001110
–
Base 8: 0o232573, 0O17321577
–
Base 16:
0x23AF57BA, 0XFF23AB3C
●
Flotantes (double en lenguaje C): 1.2, 7.43e4, 1.2E­3, 1.0
●
Números complejos: 7+3j, 32+4J
●
Fracciones (fraction): 1/21, 2/423
●
Decimales (decimal): Decimal('­0.2')
Enteros vs. Flotantes
Números flotantes
●
Se codifican en memoria utilizando el estándar IEEE Standard 754 for floating point arithmetic:
http://en.wikipedia.org/wiki/IEEE_floating_point
●
Poseen una precisión de 64 bits.
●
Tienen 15 dígitos de precisión
●
Es el mismo “double” de lenguaje C, C++
Como una curiosidad, el IEEE standard 754, permite los llamados números subnormales (o denormales), los cuales son números incluso más pequeños que sys.float_info.min. Ver: http://en.wikipedia.org/wiki/Denormal_number. Todo depende del procesador de su PC. Estos números están en el intervalo entre sys.float_info.min*sys.float_info.epsilon y sys.float_info.min es decir 4.9407e­324. Cualquier número más pequeño que este se redondea a cero. Tenga en cuenta, que esto no tiene importancia práctica alguna en sus cálculos. Además hay una pérdida de precisión asociada a su uso.
sys.float_info.epsilon representa el número más pequeño posible que puede sumársele a 1.0 para que (1.0 + sys.float_info.epsilon) > 1.0. En MATLAB esta constante se llama "eps". sys.float_info.epsilon representa la exactitud relativa de la aritmética del computador. Observe que un double tiene 52 bits en su parte de fracción, por lo que sys.float_info.epsilon = 2­52 = 2.220446049250313x10­16 es la mayor precisión posible.
Ver: http://en.wikipedia.org/wiki/Machine_epsilon
Respuesta corta: sys.float_info.dig reporta el número de dígitos que son siempre correctos. El dígito #16 casi siempre es correcto, pero no siempre lo es.
Respuesta larga:
http://stackoverflow.com/questions/28493114/precision­of­reprf­strf­printf­when­f­is­float
http://stackoverflow.com/questions/18409496/is­it­52­or­53­bits­of­floating­point­precision
Representación de números flotantes en el PC
Ver detalles en:
●
David Goldberg (1991). What Every Computer Scientist Should Know About Floating­Point Arithmetic. Computing Surveys, March 1991.
–
https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/02Numerics/Double/paper.pdf
●
http://en.wikipedia.org/wiki/Floating_point
●
http://en.wikipedia.org/wiki/IEEE_floating_point (IEEE 754, 1985)
●
http://en.wikipedia.org/wiki/Single­precision_floating­point_format
●
http://en.wikipedia.org/wiki/Double­precision_floating­point_format
●
http://en.wikipedia.org/wiki/Quadruple­precision_floating­point_format
Infinito y NaN
NOTA: en MATLAB 1/0 da infinito, no una excepción “ZeroDivisionError” como en Python
Verificando el tipo de una variable
Convirtiendo flotantes a enteros y viceversa
Observe que la función int() trunca el número (lo redondea hacia cero sin decimales). La función math.trunc() hace lo mismo que int() en este caso.
Convirtiendo entre bases numéricas
Operadores
●
Los operadores especifican como se puede manipular un objeto/variable
–
Aritméticos: + ­ * / // %
–
De asignación: = += ­= *= /= %= &= |=
–
Relacionales: > < >= <= == !=
–
Lógicos: and or not
–
Bit a bit: & | ^ ~ >> <<
–
Especiales: .
**
in
not in
is
not is
Operaciones aritméticas, asignaciones
●
Operaciones aritméticas binarias
x+y
●
x*y
x/y
x%y
Operaciones aritméticas binarias con asignación
x += y
●
x-y
x -= y
x *= y
x %= y
x /= y
Asignaciones (variable = expresión):
y = x + 4*y/(x - 2) + y;
Operadores de asignación simplificada “a = a operador b”
Otros operadores de asignación son: +=, -=, *=, /=, &=, //=, <<=, >>=, %=, |=, **=, ^=
a += b es lo mismo que a = a + b
a -= b
a = a - b
a *= b
a = a * b
a /= b
a = a / b
a //= b
a = a // b
a **= b
a = a ** b
etc...
Operadores
aritméticos
División entera //
Observe que este operador redondea hacia menos infinito, no hacia 0 como lo hace el lenguaje C. Si ambos números son enteros retorna un entero. Si un número es un float, retorna un float.
Múltiples asignaciones en una sola línea
La constante pi
La variable _ funciona como el Ans de la calculadora
Python soporta números complejos
25
Fraccionarios
Las operaciones con fraccionarios son más lentas que con flotantes.
El cálculo con fractions es mucho más lento que el cálculo con floats
En este ejemplo lenguaje C es 32.4 veces más rápido que Python.
El módulo math
NOTA: utilice el módulo cmath si piensa trabajar con números complejos.
Redondeando números
Precisión de los flotantes
El módulo decimal
El módulo decimal da una solución al problema de la imprecisión de los flotantes. Esta imprecisión es inaceptable cuando manejamos, por ejemplo, dinero. Usar decimales es más lento que usar flotantes.
Booleanos
True=1 o False=0
Booleanos
Al igual que en lenguaje C, 0 es falso y cualquier valor diferente de 0 es verdadero
bool()
Cadena vacía
Lista vacía
Tupla vacía
Diccionario vacío
Cadena
NOTA: las listas, las cadenas, los conjuntos y los diccionarios los veremos más adelante.
Lista
Conjunto
Diccionario
Condicionales
En Python cualquier valor diferente de 0 es verdadero; el cero es falso. Cuando se ponen cadenas o listas, cualquier lista con una longitud diferente de cero es verdadera. Cadenas, listas, tuplas, conjuntos o diccionarios vacíos son falsos.
Los operadores de relacionales (de comparación) son los mismos que en lenguaje C: > < >= <= == !=
Los operadores lógicos son: and or not
Comparaciones
Ejemplo con los operadores lógicos and y or
Suponga que se ha disparado una bala, y esta está en la posición (pos_bala_x,pos_bala_y). Suponga que el jugador se encuentra en las coordenadas (x,y). Si una bala impacta al jugador, su vida se reduce en 1:
if (x == pos_bala_x) and (y == pos_bala_y):
vida -= 1
?
Suponga que el jugador se encuentra en la posición (x,y). El tablero tiene de 0 a XMAX­1 columnas y de 0 a YMAX­1 filas. Se verifica que el jugador no se haya salido del tablero así:
if (x<0) or (x>=XMAX) or (y<0) or (y>=YMAX):
print('Se ha salido del tablero de juego')
Tablas de verdad
Encadenación de comparaciones
Los operadores se pueden encadenar, por lo que a < b == c es lo mismo que (a<b) and (b==c)
NOTA: este tipo de encadenación no es posible realizarla en lenguaje C, C++, MATLAB, Pascal, entre otros. Esta notación propia de Python es muy elegante y seguro le costará deshabituarse de ella cuando aprenda otro lenguaje de programación.
Condicionales
●
Recuerde que según la precedencia de operadores los operadores se ejecutan en el siguiente orden (de mayor a menor precedencia):
–
in, not in, is, is not, <, <=, >, >=, !=, == –
not x
–
and
–
or
por lo que A and not B or C es equivalente a (A and (not B)) or C
NOTA: el operador de comparación == es diferente del operador de asignación = No compare floats con ==
Igualdad de dos números reales
Precedencia de operadores
●
●
Cualquier expresión diferente de cero es verdadero en C, mientras que si es cero se considera falsa.
Con and: si la primera expresión es falsa, la segunda no se evalúa:
if (x == 5) and (y == 10): print('x=5 y y=10')
●
Con or: si la primera expresión es verdadera, la segunda no se evalúa:
if (x == 5) or (y == 10)): print('x=5 o y=10')
●
Negación (not):
if not (x == 5): print('x es diferente de 5')
Otras operaciones con secuencias de bits
None
Observe que
no imprime nada
None es una contante en Python que significa un valor nulo. Se utiliza para simbolizar que una variable no tiene un valor, o que el valor no existe. No es lo mismo que False, no es 0, no es una cadena vacía, no es una lista vacía, etc. No puede compararse contra nada diferente de None y siempre retornará falso.
Se debe escribir None, no none, NONE, NoNe, etc.
None en un contexto booleano
Constantes
●
●
●
En programación, una constante es un valor que no puede (o no debe) ser alterado durante la ejecución de un programa. Esto en comparación a las variables, cuyo valor pueden cambiar durante la ejecución normal del programa.
Las constantes no existen en Python, pero si son comunes en otros lenguajes de programación como Pascal, C o C++.
Se sugiere (no es obligatorio, pero es una costumbre) escribir el nombre de las constantes en MAYÚSCULAS, para distinguirlo del resto de variables.
Tamaño de las variables en memoria
Varían de implementación a implementación del interpretador, por lo que no se puede fiar de este número para los cálculos.
M
pr ayo
ec r
ed
en
ci
a
M
pr eno
ec r
ed
en
ci
a
Precedencia de operadores
Operators in the same box group left to right (except for exponentiation, which groups from right to left).
The power operator ** binds less tightly than an arithmetic or bitwise unary operator on its right, that is, 2**­1 is 0.5.
Referencias
●
Wikipedia
●
http://www.inventwithpython.com/
●
http://www.diveintopython3.net/
●
Documentación de Python:
●
–
https://docs.python.org/3/tutorial/index.html
–
https://docs.python.org/3/
Marzal Varó, Andrés; Gracia Luengo, Isabel; García Sevilla, Pedro (2014). Introducción a la programación con Python 3. Disponible en: http://dx.doi.org/10.6035/Sapientia93
57