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 casesentitive: 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.2E3, 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.9407e324. 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 = 252 = 2.220446049250313x1016 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/precisionofreprfstrfprintfwhenfisfloat http://stackoverflow.com/questions/18409496/isit52or53bitsoffloatingpointprecision Representación de números flotantes en el PC Ver detalles en: ● David Goldberg (1991). What Every Computer Scientist Should Know About FloatingPoint 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/Singleprecision_floatingpoint_format ● http://en.wikipedia.org/wiki/Doubleprecision_floatingpoint_format ● http://en.wikipedia.org/wiki/Quadrupleprecision_floatingpoint_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 XMAX1 columnas y de 0 a YMAX1 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