"La gente generalmente no elige Python para escribir código rápido.
Las principales ventajas de Python son la legibilidad y la simplicidad"
Notación
En lo sucesivo cuando encuentre >>> estaremos refiriendo un entorno Python
o el shell de Python,
continue leyendo para saber a que me refiero.
Un lenguaje de programación es un lenguaje formal que proporciona una
serie de instrucciones que permiten a un programador escribir
secuencias de órdenes y algoritmos a modo de controlar el comportamiento físico y
lógico de una computadora con el objetivo de que produzca diversas clases de datos.
El nombre del lenguaje Python proviene del popular programa de
Monty Python
grupo británico de seis humoristas que sintetizó en clave de humor la idiosincrasia británica de los años 1960 y 1970.
Desarrollado inicialmente por un programador holandés llamado
Guido van Rossum a fines de la década de 1980
pero aparece en 1991.
Python es un lenguaje de programación moderno de:
Propósito general.
Interpretado, dinámico y multiplataforma..
Multiparadigma. Ya que soporta parcialmente la orientación a objetos, programación imperativa y, en menor medida, programación funcional.
Posee una licencia de código abierto, denominada Python Software Foundation License
Programación Imperativa. Se describe en términos de instrucciones, condiciones y pasos que modifican el estado de un programa al permitir la mutación de variables, todo esto con el objetivo de llegar a un resultado.
Funcional. Es un paradigma de programación declarativa basado en el uso de verdaderas funciones matemáticas.
Reflexivo. Es la capacidad que tiene un programa para observar y opcionalmente modificar su estructura de alto nivel.
En un sentido más amplio, la reflexión es una actividad computacional que razona sobre su propia computación.
Se preserva la estructura como metadatos en el código generado. Dependiendo de la implementación, el código con reflexión tiende a ser más lento que el que no lo tiene.
Compilación
El programa fuente se traduceuna vez
obteniendo un archivo que contiene el código de la máquina;
el programa que realiza esta traducción se llama compilador o traductor.
Interpretación
Cualquier usuario del código puede traducir el programa fuente cada vez que se ejecute;
el programa que realiza este tipo de transformación se denomina intérprete,
ya que
interpreta el código cada vez que está destinado a ejecutarse;
también significa que no puede distribuir el código fuente tal como está,
porque el usuario final también necesita que el intérprete lo ejecute.
Un programa de computadora es en realidad una pieza de texto,
por lo que el código fuente generalmente se coloca en archivos de texto.
El intérprete lee el código fuente
y verifica si todas las líneas subsiguientes son correctas.
Si el compilador encuentra un error, termina su trabajo inmediatamente. El único resultado en este caso es un mensaje de error.
El intérprete le informará dónde se encuentra el error y qué lo causó.
También es posible que una parte significativa del código se ejecute con éxito antes de que el intérprete encuentre un error. Este es el comportamiento normal en este modelo de ejecución.
Si deseas programar en Python, necesitarás el intérprete de Python.
Python es un lenguaje de programación de alto nivel, interpretado, orientado a objetos y de uso generalizado con semántica dinámica, que se utiliza para la programación de propósito general.
En 1999, Guido van Rossum definió sus objetivos para Python:
Un lenguaje fácil e intuitivo tan poderoso como los de los principales competidores.
De código abierto, para que cualquiera pueda contribuir a su desarrollo.
El código que es tan comprensible como el inglés simple.
Adecuado para tareas cotidianas, permitiendo tiempos de desarrollo cortos.
Posibles usos:
Desarrollo web
Ciencia de datos y aprendizaje automático
Su sintaxis simple permite que las personas que no tienen experiencia en programación lo utilicen para el procesamiento de datos y el entrenamiento de modelos sin perder mucho tiempo aprendiendo un nuevo idioma.
Python admite una gran cantidad de bibliotecas de terceros para aprendizaje automático, redes neuronales, estadísticas y cálculos numéricos, lo que facilita mucho su trabajo.
Con Python, es posible recopilar, limpiar y explorar datos, así como entrenar modelos y visualizar los resultados, ¡todo en una sola configuración!
La comunidad de desarrolladores de Python ML es muy grande, por lo que siempre puede encontrar soporte para sus tareas.
Scripting. Automatización de tareas, como procesamiento de texto o simulación de acciones típicas del usuario
Con menos frecuencia: desarrollo de escritorio
Lanzamientos:
Python 1.0 fue lanzado en 1994
Python 2.0 fue lanzado en 2000
Python 3.0 fue lanzado en 2008
Pythones un lenguaje de programaciónque te permite trabajar rápidamente e integrar sistemas de forma más eficaz.
Python es un lenguaje de programación orientado a objetos claro y poderoso, comparable a Perl, Ruby, Scheme o Java.
Python es un
lenguaje de programación interpretado
cuya filosofía hace hincapié en la legibilidad de su código.
Se trata de un
lenguaje de programación multiparadigma,
ya que soporta parcialmente la orientación a objetos, programación imperativa y, en menor medida, programación funcional.
Verifique o agregue al path la ubicación del ejecutable de Python:
- Panel de control\Sistema y seguridad\Sistema > Configuración avanzada del sistema
- Propiedades del sistema > Variables de entorno > Variables del sistema > Path > Editar C:\PythonXX
- Abra una ventana de símbolo del sistema o CMD
- Puede ingresar:
python --version y [enter]
python3 --version y [enter] para comprobar sobre la versión 3 especificamente
- Si ya esta instalado Python, entonres ingrese python y [enter]
- Esto hará que acceda al entorno de Python o shell
- Indicando la versión de Python instalada
- A continuación se presenta el prompt en espera de comandos de Python
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
NOTA: la versión 2.7 su mantenimiento ha llegado a su end-of-life.
- Cree un archivo con la extensión .py
- En el contenido del archivo escriba print("Hola Mundo")
- Asegurese de estar en el directorio que contiene el archivo creado .py
- Ingrese el nombre del archivo y [enter]
Nota: o desde donde se encuentre indique la ruta y nombre del archivo a ejecutar.
Otras extensiones validas de Python son:
.py, .pyc, .pyd, .pyo, .pyw, .pyz, .pyi
Un comentario sirve para cualquier tipo de anotación que deseamos hacer en el código,
pero que no debe formar parte del código a interpretar como parte de la ejecución del programa.
La sintaxis de Python para los comentarios se realiza escribiendo el símbolo # (almohadilla o el numeral o cardinal o signo de número)
Todo lo que este escrito despues del símbolo # será ignorado por Python.
A veces es necesario explicar para qué sirven algunas partes particulares del código.
Python brinda la oportunidad de satisfacer esas necesidades,
puede dejar notas especiales llamadas comentarios. Son especialmente útiles para principiantes.
Se llama comentario en línea ( inline comment ) porque está escrito en la misma línea que el código.
print("This will run.") # This won't run
Comentarios de acuerdo con las mejores prácticas
Después de una marca de almohadilla #debe haber un espacio y,
en los comentarios en línea, debe haber dos espacios entre el final del código y
la marca de almohadilla.
También es aceptable poner más de dos espacios entre el final del código y la marca de almohadilla,
pero lo más común es que haya exactamente dos espacios.
Aplica una sangría a tu comentario al mismo nivel que la declaración que explicar
Un comentario no debería ser demasiado largo, la guía PEP-8 indica que la longitud del comentario debe
limitarse a 72 caracteres.
Es mejor dividir un comentario largo en varias líneas: puede hacerlo agregando una marca de almohadilla
al comienzo de cada nueva línea
Los comentarios que abarcan varias líneas se denominan multi-line o de bloque.
Comentarios para Documentación
Puede encontrar comentarios de varias líneas entre comillas triples "" "..." "".
Las comillas triples están reservadas para cadenas de documentación.
También son informativos, pero su uso se limita a funciones, métodos y varios otros casos.
Cada objeto de datos como una variable o una constante
tiene un tipo que describe cómo mantenerlo en la memoria,
qué operaciones se pueden aplicar a este objeto y cómo calcularlas.
Es el valor mismo. Un literal se refiere a datos cuyos valores están determinados por el literal mismo.
But a literal is not a name -- it is the value itself.
Literales son notaciones para representar valores fijos en el código.
Existe un literal especial más utilizado en Python: el literal None. Este literal es llamado un objeto de NonType (ningún tipo), y puede ser utilizado para representar la ausencia de un valor.
Cuando los datos y operadores se unen, forman juntos expresiones. La expresión más sencilla es el literal.
Par nombre-valor, donde su valor si puede cambiar durante la ejecución del programa.
Una variable puede ser declarada con ámbito global anteponiendo global en su declaración
Una variable se crea cuando se le asigna un valor. A diferencia de otros lenguajes de programación, no es necesario declararla.
Si se le asigna cualquier valor a una variable no existente, la variable será automáticamente creada. No se necesita hacer algo más.
Para eliminar la definición de una variable use la instrucción del
PEP 8, un espacio antes y después del signo de asignación (=) se considera una buena práctica.
Utilice minúsculas y guiones bajos para dividir palabras.
Si desea definir una constante, es común escribir su nombre en mayúsculas y, nuevamente, separar las palabras con guiones bajos.
Normalmente, las constantes se almacenan en archivos especiales llamados módulos.
Evite los nombres de una letra que podrían confundirse fácilmente con números
como las letras: 'l' 'O/o', 'I'.
Aunque puede utilizar cualquier símbolo Unicode, la convención de estilo de código recomienda limitar los nombres de variable con caracteres ASCII.
Si el nombre de variable más adecuado es alguna palabra clave de Python, agregue un guión bajo al final.
Elija un nombre que tenga sentido. El nombre de la variable debe ser legible y descriptivo y debe explicar al lector qué tipo de valores se almacenarán en él.
No uses nombres demasiado genéricos. Intente elegir un nombre que explique el significado de la variable, de 1 a 3 palabras suelen ser suficientes.
Si una palabra es larga, intente encontrar la forma corta más común y esperada.
Evite los nombres de la lista de tipos built-in (incorporada).
Todas las convenciones de nomenclatura y las mejores prácticas son opcionales, pero se recomienda encarecidamente seguirlas,
ya que hacen que su código sea más legible y autodescriptivo para usted y otros programadores.
Cada variable tiene un nombre específico que la distingue de otras variables. Existen algunas reglas para nombrar variables que debe seguir:
Los nombres distinguen entre mayúsculas y minúsculas ("fecha" no es lo mismo que "Fecha");
Un nombre comienza con una letra o un guión bajo, seguido de letras, dígitos y guiones bajos (por ejemplo, nombre de usuario, puntuación1, _cuenta);
Un nombre no puede comenzar con un dígito (por ejemplo, 2q no es un nombre válido);
Un nombre no debe ser una palabra clave (keywordpalabra reservada).
Cada variable tiene un nombre que la identifica de forma única entre otras variables.
Dar un buen nombre a una variable puede no ser tan simple como parece.
Los programadores experimentados son cuidadosos al nombrar sus variables para asegurarse de que sus programas sean fáciles de entender.
Es importante porque los programadores pasan mucho tiempo leyendo y entendiendo el código escrito por otros programadores.
Si las variables tienen nombres incorrectos, incluso su propio código le parecerá confuso de leer en unos meses.
Siempre que usa un signo igual =, en realidad asigna algún valor a un nombre.
Por esa razón, al signo de = se le suele denominar operador de asignación.
Hay otros operadores de asignación que puede usar en Python,
se denominan operadores de asignación compuesta, ya que
realizan una operación aritmética y una asignación en un solo paso:
Las operaciones de comparación o relación le permiten comparar dos valores y determinar la relación entre ellos.
Hay diez operadores de comparación en Python:
< menor que
<= menor que o igual
> mayor que
>= mayor que o igual
== igual
!= no igual
is
is not
in esta en
not is no esta en
El resultado de aplicar estos operadores siempre es bool.
Operadores aritméticos
Un signo de ** (doble asterisco) es un operador de potencia (exponenciación).
El argumento a la izquierda es la base, el de la derecha, el exponente.
Cuando ambos ** argumentos son enteros, el resultado es entero también.
Cuando al menos un ** argumento es flotante, el resultado también es flotante.
Un símbolo de * (asterisco) es un operador de multiplicación.
Un símbolo de / (diagonal) es un operador de división.
El valor después de la diagonal es el dividendo, el valor antes de la diagonal es el divisor.
Hay una excepción a la regla, el resultado producido por el operador de división siempre es flotante,
Un símbolo de // (doble diagonal) es un operador de división entera.
El resultado carece de la parte fraccionaria, está ausente (para los enteros),
o siempre es igual a cero (para los flotantes); esto significa que los resultados siempre son redondeados.
Se ajusta a la regla entero vs flotante. El redondeo siempre va hacia abajo.
La division entera también se le suele llamar en inglés floor division.
Módulo/ es el residuo que queda de la división entera,
es el valor que sobra después de dividir un valor entre otro para producir un resultado entero.
La división entre cero no funciona.
No se debe intentar, dividir entre cero,
realizar una división entera entre cero o
encontrar el residuo de una división entre cero.
Se pueden emplear tantos paréntesis como se necesiten, y seguido son utilizados para mejorar la legibilidad de una expresión, aun si no cambian el orden de las operaciones.
Una expresión es una combinación de valores (o variables, operadores, llamadas a funciones, aprenderás de ello pronto) las cuales son evaluadas y dan como resultado un valor
Los operadores son símbolos especiales o palabras clave que son capaces de operar en los valores y realizar operaciones matemáticas
Un operador unario es un operador con solo un operando.
Un operador binario es un operador con dos operados
Algunos operadores actúan antes que otros, a esto se le llama jerarquía de prioridades.
Los números enteros se pueden usar para contar cosas en el mundo real,
mientras que los números de punto flotante son una buena opción para cálculos estadísticos y científicos.
Los sistemas de numeración Octales y Hexadecimales son similares pues emplean 8 y 16 como sus bases respectivamente. El sistema hexadecimal utiliza los números decimales más seis letras adicionales.
Las cadenas de Python son secuencias, no son listas, pero pueden ser tratadas como tal.
El truco de las comillas simples y dobles para su combinación
Como sabemos para representar un conjunto (cadena) de caracteres en la sintaxis de Python
permite el uso de comillas simples o dobles.
La sintaxis es la regla el lenguaje define para escribir código y que sea considerado como correcto,
pero ¿Cuál es tu estilo? o cual es tu costumbre al escribir ¿Comilla simple o doble?.
El truco para su combinación es otra regla, unas debes estar contenidas en otras,
recuerda que van por pares, comilla al inicio y comilla al final del string.
Si tienes que escribir código sin combinaciones de comillas puedes usar el
carácter de escape\
Las cadenas de Python son inmutables. Con las listas podemos usar del
para eliminar un elemento. No se puede eliminar un caracter de una cadena,
sin embargo al aplicar del a la cadena esta es eliminada por completo.
Tampoco se puede usar el método append() para expander una cadena.
Lo que se estila al manipular cadenas es sobreescribirlas.
Iterar una cadena
Slice:
Siempre que desee trabajar con algún tipo de información textual en su programa,
tendrá que trabajar con cadenas.
El tipo de cadena se llama str.
Los literales de cadena se pueden delimitar mediante comillas simples o dobles.
Concatenación. Combinación de secuencia de caracteres (strings)
>>> a = "Hola"
>>> b = "Mundo"
>>> print(a + " " + b)
Hola Mundo
Se puede utilizar print() para combinar texto con variables utilizando el operador
+ para mostrar cadenas con variables
El signo de * (asterisco), cuando es aplicado a una cadena y a un número
(o a un número y cadena) se convierte en un operador de replicación.
¿Podemos multiplicar strings?, veamos...
>>> c = a + " " + b
>>> print(c*3)
Hola MundoHola MundoHola Mundo
Un número menor o igual que cero produce una cadena vacía.
En general, las cadenas pueden ser: concatenadas (unidas) + y replicadas*.
La capacidad de usar el mismo operador en tipos de datos completamente diferentes (como números o cadenas)
se llama overloading - sobrecarga (debido a que el operador está sobrecargado con diferentes tareas).
El operador + es empleado en dos o más cadenas y
produce una nueva cadena que contiene todos los caracteres de sus argumentos
El operador * necesita una cadena y un número como argumentos;
en este caso, el orden no importa: puedes poner el número antes de la cadena, o viceversa,
el resultado será el mismo: una nueva cadena creada por la enésima replicación de la cadena del argumento.
in, not in
Los operadores in y not in pueden ser aplicados a cadenas
La función ord()
Dada una cadena que representa un carácter Unicode, devuelve un número entero que representa el punto de código Unicode de ese carácter.
La función necesita una cadena de un caracter como argumento - incumplir este requisito provoca una excepción TypeError
La función chr()
Devuelve la cadena que representa un carácter cuyo punto de código Unicode es el entero i.
Invocándolo con un argumento inválido (por ejemplo, un punto de código negativo o inválido)
provoca las excepciones ValueError o TypeError
min() y max()
¿Se puede aplicar la función min() y max() a una cadena?.
Si, para determinar el caractér cuyo punto de código Unicode entero es el menor o mayor.
Las cadenas tienen varios métodos para su manipulación. El método index()
devuelve el índice correspondiente de un carácter en la cadena
Si index() no encuentra el carácter que se pasa como argumento,
genera una excepción ValueError
str.count(sub[, start[, end]])
Devuelve el número de apariciones no superpuestas de subcadena sub en el rango [inicio, fin].
Los argumentos opcionales start y end se interpretan como en notación de sector.
print("Hello".count("l")) # 2
str.capitalize()
Devuelve una copia de la cadena con su primer carácter en mayúsculas y el resto en minúsculas.
print("ángeles".capitalize()) # Ángeles
str.center(width[, fillchar])
Retorno centrado en una cadena de largo y width.
El relleno se realiza utilizando el fillchar
especificado (el valor predeterminado es un espacio ASCII).
Se devuelve la cadena original si el width es menor o igual que len(s).
Devuelve True si la cadena termina con el suffix especificado;
de lo contrario,
devuelve False.
suffix también puede ser una tupla de sufijos a buscar.
Con inicio start, pruebe comenzando en esa posición.
Con el end opcional, deja de comparar en esa posición.
print("Python".endswith("n")) # True
print("Python".endswith("P")) # False
str.find(sub[, start[, end]])
Devuelve el índice más bajo en la cadena donde la subcadena
sub se encuentra dentro del segmento s[inicio: fin].
Los argumentos opcionales start y end
se interpretan como en notación de sector. Devuelve -1 si no se encuentra sub.
print("Python".find("h")) # 3
print("Python".find("J")) # -1 (no se encuentra)
Podríamos encontrar las coincidencias en un texto de una subcadena:
Salida:
' i ' se encontro en la pos: 2
' i ' se encontro en la pos: 6
' i ' se encontro en la pos: 14
str.isalnum()
Devuelve True si todos los caracteres de la cadena son alfanuméricos y
hay al menos un carácter, False en caso contrario.
Un carácter c es alfanumérico si uno de los siguientes devuelve True:
c.isalpha (), c.isdecimal (), c.isdigit () o c.isnumeric ().
str.isalpha()
Devuelve True si todos los caracteres de la cadena son alfabéticos y
hay al menos un carácter, False en caso contrario.
Los caracteres alfabéticos son aquellos definidos en la base de datos de caracteres
Unicode como "Letra".
str.isdigit()
Devuelve True si todos los caracteres de la cadena son dígitos y
hay al menos un carácter, False en caso contrario.
Los dígitos incluyen caracteres decimales y dígitos que necesitan un manejo especial,
como los dígitos de superíndice de compatibilidad.
str.islower()
Devuelve True si todos los caracteres en mayúsculas en la cadena están en minúsculas y
hay al menos un carácter en mayúsculas, de lo contrario es False.
str.lower()
Devuelve una copia de la cadena con todos los caracteres en mayúscula convertidos a minúsculas.
str.isupper()
Devuelve True si todos los caracteres en mayúscula de la cadena están en mayúsculas y
hay al menos un carácter en mayúsculas, de lo contrario es False.
str.isspace()
Devuelve True si solo hay espacios en blanco en la cadena y hay al menos un carácter,
False en caso contrario.
str.join(iterable)
Devuelve una cadena que es la concatenación de las cadenas en iterable.
Se generará un TypeError si hay valores que no son cadenas en iterables,
incluidos los objetos de bytes.
El separador entre elementos es la cadena que proporciona este método.
str.lstrip([chars])
Devuelve una copia de la cadena sin los caracteres iniciales.
El argumento chars es una cadena que especifica el conjunto de caracteres que se eliminarán.
Si se omite o Ninguno, el argumento chars elimina los espacios en blanco de forma predeterminada.
El argumento chars no es un prefijo; más bien, todas las combinaciones de sus valores se eliminan
str.replace(old, new[, count])
Devuelve una copia de la cadena con todas las apariciones de la subcadena antigua reemplazada
por nueva.
Si se proporciona el recuento de argumentos opcional, solo se reemplazan las primeras apariciones del recuento.
str.rsplit(sep=None, maxsplit=-1)
Devuelve una lista de las palabras de la cadena, utilizando sep como cadena delimitadora.
Si se da maxsplit, como máximo se realizan divisiones de maxsplit, las más a la derecha.
Si no se especifica sep o None, cualquier cadena de espacios en blanco es un separador.
El tipo booleano, o simplemente bool, es un tipo de datos especial que solo tiene
dos valores posibles: Verdadero y Falso.
En Python, los nombres de los valores booleanos comienzan con una letra MAYÚSCULA (True, False).
El tipo booleano o lógico es una forma común de representar algo que tiene solo dos estados opuestos como encendido o apagado, sí o no, etc.
Operaciones booleanas
Operadores booleanos integrados en Python: (not, and, or)
Los dos primeros son operadores binarios, lo que significa que esperan dos argumentos.
not es un operador unario, siempre se aplica a un solo operando.
not
es un operador unario, invierte el valor booleano de su argumento.
ser = True # ser es True
no_ser = not ser # no_ser es False
and
es un operador binario, toma dos argumentos y devuelve True si ambos argumentos son verdaderos;
de lo contrario, devuelve False.
w = True and True # True
x = True and False # False
y = False and False # False
z = False and True # False
or
es un operador binario, devuelve True si al menos un argumento es verdadero; de lo contrario, devuelve False.
w = True or True # True
x = True or False # True
y = False or False # False
z = False or True # True
w and z devuelven w si w es Falso; de lo contrario, evalúa y devuelve z
w or z devuelve w si w es True; de lo contrario, evalúa y devuelve z
La precedencia de las operaciones booleanas
Los operadores lógicos tienen una prioridad diferente y afecta el orden de evaluación.
Estos son los operadores en orden de prioridades: not, and, or
print("False or not False = ", False or not False) # True
Primero, se evalúa la parte not False.
Después de la evaluación, nos queda False o True. Esto da como resultado True.
Valores de verdad y falsedad
Python permite probar la veracidad de casi cualquier objeto. Cuando se utilizan con operadores lógicos, los valores de tipos no booleanos,
como enteros o cadenas, se denominan truthy o falsy.
Depende de si se interpretan como True o False.
Incluso si una declaración o expresión es sintácticamente correcta, puede causar un error cuando se intenta ejecutarla.
Los errores detectados durante la ejecución se denominan excepciones
y no son incondicionalmente fatales.
Las excepciones son clases.
cuando se genera una excepción, se crea una instancia de un objeto de la clase y
pasa por todos los niveles de ejecución del programa, buscando la rama "except"
que está preparada para tratar con la excepción.
Todas las excepciones integradas de Python forman una jerarquía de clases:
Sin embargo, la mayoría de las excepciones no son manejadas por programas y dan como resultado mensajes de error.
Por ejemplo: NameError.
Se genera cuando no se encuentra un nombre local o global. Esto se aplica solo a los nombres no calificados.
El valor asociado es un mensaje de error que incluye el nombre que no se pudo encontrar.
Cada vez que tu código intenta hacer algo erroneo, irresponsable o inaplicable, Python hace dos cosas:
Detiene tu programa.
Crea un tipo especial de dato, llamado excepción.
Ambas actividades llevan por nombre lanzar una excepción.
Podemos decir que Python siempre lanza una excepción (o que una excepción ha sido lanzada)
cuando no tiene idea de qué hacer con el código.
¿Entonces?
La excepción lanzada espera que alguien o algo lo note y haga algo al respecto.
Si la excepción no es resuelta, el programa será terminado abruptamente, y verás un mensaje de error enviado a la consola por Python.
De otra manera, si se atiende la excepción y es manejada apropiadamente, el programa puede reanudarse y su ejecución puede continuar.
Python proporciona herramientas efectivas que permiten observar, identificar y manejar las excepciones eficientemente.
Esto es posible debido a que todas las excepciones potenciales tienen un nombre específico,
por lo que se pueden clasificar y reaccionar a ellas adecuadamente.
Si el programa tiene un error no debería terminarse de manera abrupta, sino recuperarse a ese fallo
y continuar su funcionamiento, aunque esa parte del código sea erronea.
Por ejemplo la división entre cero es un error: ZeroDivisionError: division by zero
Otro ejemplo es leer una colección pero acceder a un índice fuera de rango: IndexError: list index out of range
try-except: ¿Cómo manejar un error, con excepciones?
Se debe colocar el bloque de código que deseamos controlar, sabiendo de antemano que podría generar un error.
Para colocar el código en un bloque se utiliza la palabra reservada try,
con lo cual estamos indicando, "intenta ejecutar este bloque y si ocurre un error entonces..."
try comienza con un bloque de código el cual puede o no estar funcionando correctamente.
Python intenta ejecutar el código: si falla, se genera una excepción y Python comienza a buscar una solución.
except comienza con un bloque de código que será ejecutado si algo dentro del bloque try sale mal.
Se regresa al nivel de anidación anterior, es decir, se termina la sección try-except.
Si se esta familiarizado con las excepciones entonces podemos usarlas, además de que las excepciones se pueden anidar.
Python 3 define 63 excepciones integradas, y todos ellos forman una jerarquía en forma de árbol,
aunque el árbol es un poco extraño ya que su raíz se encuentra en la parte superior.
Podemos decir que cuanto más cerca de la raíz se encuentra una excepción, más general (abstracta) es.
Exception es un caso especial de una clase más general llamada BaseException.
Por ejemplo: ArithmeticError es una clase general que incluye (entre otras) la excepción ZeroDivisionError.
Se pueden manejar dos o mas excepciones de la misma manera, usando la siguiente sintaxis:
as
Cuando ocurre una excepción,
puede tener un valor asociado,
también conocido como el argumento de la excepción.
La presencia y el tipo de argumento depende del tipo de excepción.
La cláusula except puede especificar una variable después del nombre de excepción.
La variable se vincula a una instancia de la excepción con los argumentos almacenados en
instance.args.
Por conveniencia, la instancia de excepción define __str__()
para que se pueda mostrar los argumentos directamente, sin necesidad de hacer referencia a .args.
También se puede instanciar la excepción primero, antes de generarla, y agregarle los atributos que se desee
raise
La instrucción raise genera la excepción especificada denominada exc como si fuese generada de manera natural:
raise exc
La instrucción permite:
Simular excepciones reales (por ejemplo, para probar tu estrategia de manejo de excepciones).
Parcialmente manejar una excepción y hacer que otra parte del código sea responsable de completar el manejo.
Las declaraciones try … except
tienen un bloque else opcional,
el cual, cuando está presente, debe seguir a los except.
Es útil para aquel código que debe ejecutarse si el bloque try no genera una excepción.
El uso de la cláusula else es mejor que agregar código adicional en la cláusula
try porque evita capturar accidentalmente una excepción
que no fue generada por el código que está protegido por la declaración try … except.
La cláusula finally se ejecuta independientemente de que la cláusula tryproduzca o no una excepción.
Si ocurre una excepción durante la ejecución de la cláusula try,
la excepción podría ser gestionada por una cláusula except.
Si la excepción no es gestionada por una cláusulaexcept,
la excepción es relanzada después de que se ejecute el bloque de la cláusula finally.
Podría aparecer una excepción durante la ejecución de una cláusula
except o else.
De nuevo, la excepción será relanzada después de que el bloque de la cláusula finally se ejecute.
Si el bloque try llega a una sentencia break,
continue o return,
la cláusula finally se ejecutará justo antes de la ejecución de dicha sentencia.
Si una cláusula finally incluye una sentencia return,
el valor retornado será el de la cláusula finally,
no la del de la sentencia return de la cláusula try.
La declaración raise permite al programador forzar a que ocurra una excepción específica.
raise NameError('Hola mundo')
El único argumento de raise indica la excepción a generarse.
Tiene que ser o una instancia de excepción, o una clase de excepción (una clase que hereda de Exception).
¿Como funciona?
Evalúa la expresión.
Si la expresión se evalúa como
True (verdadero), o un
valor numérico distinto de cero, o una
cadena no vacía, o cualquier otro valor
diferente de None, no hará nada más.
De lo contrario (se evalúa como False (falso)),
automáticamente e inmediatamente
genera una excepción llamada
AssertionError (en este caso, decimos que la afirmación ha fallado).
Python es un lenguaje dinámicamente y fuertemente tipado.
La escritura dinámica significa que solo los objetos en tiempo de ejecución (valores) tienen un tipo,
pero no las variables que los almacenan.
Puede almacenar varios valores de diferentes tipos en una sola variable durante la ejecución del código
y no se producirán errores.
Lo cual significa que puede cambiar el tipo de una variable al asignar un valor con tipo de dato distinto al inicial:
Weak typing
El mismo operando puede dar resultados diferentes dependiendo de los tipos de argumentos proporcionados.
Por ejemplo, puede agregar dos cadenas para obtener una concatenación. También es posible multiplicar una cadena por un número entero
Explicit type casting
El proceso de convertir un valor en otro tipo también se denomina conversión de tipos.
Aunque la conversión de tipos implícitos no está permitida en Python, a menudo se encontrará en la necesidad de definir
una conversión de tipos explícita dentro de su código.
Si no se permite la conversión entre dos tipos, verá un error.
En Python existen varios tipos de coleccionespara almacenar datos en Python.
Las colecciones de elementos ordenados posicionalmente generalmente se denominan secuencias,
y tanto las listas como las cadenas les pertenecen.
Cada elemento de una lista, así como cada carácter de una cadena, tiene un índiceque corresponde a su posición.
Los índices se utilizan para acceder a elementos dentro de una secuencia.
La indexación se basa en cero.
La siguiente instrucción permite conocer la posición de un caracter en un string.
>>> vocales = "aeiou"
>>> print(vocales.index("i"))
2
¡Oh si!, la numeración inicia desde cero
Entonces para visualizar de alguna manera esto sería:
01234
aeiou
Donde la posición del caracter "i" es la número 2
Para acceder a un elemento de una lista por su índice,
debe escribir el nombre de la lista, seguido de corchetes y, entre ellos, escribe el índice de un elemento que desea obtener.
No olvide que los índices comienzan en 0, por lo que el índice del primer elemento es 0.
El índice del último elemento es igual a len(lista) - 1.
Donde len() es una función que recibe como parametro una colección y regresa el número de elementos que contiene.
Matrices y Cadenas
IndexError
Si trata de acceder a un índice que no este en el rango de su secuencia obtendrá un error llamado IndexError
En Python Sin embargo, cuando se trata de cadenas, la reasignación es imposible.
Las cadenas, a diferencia de las listas, son inmutables, por lo que no puede modificar su contenido con índices.
Al intentar hacer esto indica el error El objeto 'str' no admite la asignación de elementos
Sin embargo en las listas si es posible la reasignación:
índices negativos
La forma más fácil de acceder a los elementos al final de una lista o una cadena es usar índices negativos.
El menos antes del número cambia tu perspectiva de alguna manera y miras la secuencia desde el final.
Entonces, el último elemento de una lista, en este caso, tiene el índice igual a -1,
y el primer elemento de la lista tiene el índice -len(lista) (la longitud de la lista).
La lista es un tipo de dato en Python que se utiliza para almacenar múltiples objetos. Es una colección ordenada y mutable de elementos separados por comas entre corchetes
Una lista contiene elementos o items de cualquier tipo de dato separados por comas (,)
y esta lista esta encerrada o contenida entre corchetes []
>>> lista = [1,"a","palabra", 0]
>>> print(lista[2])
palabra
Dentro de la jerga de Python se dice que una lista es mutable,
es decir, que puede ser alterada o cambiada.
Mejor con un ejemplo:
>>> print(lista)
[1, 'a', 'palabra', 0]
>>> lista[2] = "python"
>>> print(lista)
[1, 'a', 'python', 0]
>>> print(lista[2])
python
Otra forma de crear listas es a través de la función list()
la cual creaa una lista a partir de un objeto iterable:
es decir, un tipo de objeto en el que puede obtener sus elementos uno por uno.
Tiene un parámetro que es de tipo string o se puede crear una lista vacía al omitir el parámetro.
list("Hola")
En este caso el string "Hola" es divido caracter por caracter,
por tanto, cada caracter corresponde a un elemento en la lista:
['H', 'o', 'l', 'a']
La función list() toma su argumento (una cadena) y crea una nueva lista
que contiene todos los caracteres de la cadena, uno por elemento de la lista.
Operadores in, in not
El operador in puede ser usado para evaluar si un elemento esta contenido en una lista.
El operador in not puede ser usado para evaluar si un elemento no esta contenido en una lista.
Función len()
Hay una función incorporada llamada len() que se puede aplicar a
cualquier objeto iterable y devuelve simplemente la longitud de ese objeto.
len(objeto_iterable)
Método append()
Toma el valor de su argumento y lo coloca al final de la lista que posee el método.
Método insert()
Puede agregar un nuevo elemento en cualquier lugar de la lista, no solo al final.
Este método ordena la lista en su lugar, utilizando solo < comparaciones entre elementos.
Las excepciones no se suprimen: si falla alguna operación de comparación,
la operación de clasificación completa fallará
(y la lista probablemente se dejará en un estado parcialmente modificado).
La funcion sorted(iterable, *, key=None, reverse=False)
Devuelve una nueva lista ordenada de los elementos en iterable.
Una secuencia es un tipo de dato en Python capaz de almacenar mas de un valor
(o ninguno si la secuencia esta vacía),
los cuales pueden ser secuencialmente examinados, elemento por elemento.
Una secuencia es un tipo de dato que puede ser escaneado por el bucle for.
Lo primero que distingue una lista de una tupla es la sintaxis empleada para crearlas.
Las tuplas utilizan paréntesis, mientras que las listas usan corchetes,
aunque también es posible crear una tupla tan solo separando los valores por comas.
Una tupla es una secuencia inmutable. Se puede comportar como una lista pero no puede ser modificada en el momento.
Una tupla es un conjunto de elementos, separados por comas (,)
encerrados o contenidos entre paréntesis ()
Si se necesita definir una tupla de un solo elemento,
es necesario incluir una coma (,),
lo que estaría indicando que se trata de una tupla.
>>> t = ("x",)
tuplaVacia = ()
Si se desea crear una tupla de un solo elemento, se debe de considerar el hecho de que,
debido a la sintaxis (una tupla debe de poder distinguirse de un valor entero ordinario),
se debe de colocar una coma al final: t = ("x",)
El quitar las comas no arruinará el programa en el sentido sintáctico, pero serán variables no tuplas.
Si se intenta cambiar el valor de un tupla se genera el error:
TypeError: 'tuple' object does not support item assignment
El operador + puede unir tuplas.
El operador * puede multiplicar las tuplas.
Los operadores in y not in pueden ser aplicados a las tuplas.
Las Tuplas son colecciones de datos ordenadas e inmutables,
no se puede agregar, modificar, cambiar o quitar elementos.
Cada elemento de la tupla puede ser de un tipo de dato diferente
Las tuplas pueden contener otras tuplas o listas (y viceversa).
Tupla vacía: t = ()
También se puede crear una tupla utilizando la función integrada de Python tuple().
min(tupla). Obtiene o regresa el primer elemento en la lista.
max(tupla). Obtiene o regresa el último elemento en la lista.
>>> t = ("x","y","z")
>>> min(t)
'x'
>>> max(t)
'z'
Si tiene una lista pero quiere convertirla en tupla use
tuple(lista)
>>> l = ["a","b","c"]
>>> tupla = tuple(l)
>>> print(l)
['a', 'b', 'c']
>>> print(tupla)
('a', 'b', 'c')
La lista de todos los pares es encerrada con llaves, mientras que los pares son separados por comas, y las claves y valores por dos puntos.
Los diccionarios no son listas - no guardan el orden de sus datos,
el orden no tiene significado.
El orden en que un diccionario almacena sus datos esta fuera de nuestro control, lo que es normal.
Método keys()
El método retorna o regresa una lista de todas las claves dentro del diccionario.
Al tener una lista de claves se puede acceder a todo el diccionario de una manera fácil y útil.
Método item()
Este método regresa una lista de tuplas donde cada tupla es un par de cada clave con su valor.
Con la función input() podemos capturar la entrada del teclado.
Los datos de entrada que queremos obtener no son más que un valor introducido por el usuario.
Cualquier dato pasado a esta función se trata como una secuencia de caracteres (cadena).
El resultado de la función input()es una cadena.
La función input() deja de esperar la entrada del usuario, hasta que el usuario da ENTER
La función input() puede tomar un argumento opcional, que es un mensaje:
>>> lectura = input("Ingrese letras, números o símbolos y de enter... ")
Ingrese letras, números o símbolos y de enter... El valor de pi es de: 3.14
>>> lectura
'El valor de pi es de: 3.14'
>>>respuesta = input("¿Qué día de la semana es hoy? ")
>>>print("Hoy es", respuesta,", gracias!")
Hoy es Viernes , gracias!
Cualquier valor que ingrese, la función lo verá como una cadena. No importa si ingresa dígitos o letras, la entrada se convertirá en una cadena.
Si desea que un número sea un número, debe escribirlo explícitamente:
Si un usuario ingresa un valor no entero, aparecerá un error.
Una función permite dividir el código en bloques organizados y reusables,
empleados para realizar una acción específica.
No se debe invocar una función antes de que se haya definido.
Los parámetros solo existen dentro de las funciones (este es su entorno natural).
Los argumentos existen fuera de las funciones,
y son los que pasan los valores a los parámetros correspondientes.
La técnica que asigna cada argumento al parámetro correspondiente, es llamada paso de parámetros posicionales,
los argumentos pasados de esta manera son llamados argumentos posicionales.
Una variable que existe fuera de una función tiene alcance dentro del cuerpo de la función,
excluyendo a aquellas que tienen el mismo nombre..
Funciones vs. métodos
Un método es un tipo específico de función: se comporta como una función y se parece a una función,
pero difiere en la forma en que actúa y en su estilo de invocación.
Una función no pertenece a ningún dato: obtiene datos, puede crear nuevos datos y (generalmente) produce un resultado.
Un método es similar a una función, pero también puede cambiar el estado de una entidad seleccionada.
Un método es propiedad de los datos para los que trabaja, mientras que una función es propiedad de todo el código.
Invocar un método requiere alguna especificación de los datos a partir de los cuales se invoca el método.
El nombre del método está precedido por el nombre de los datos que posee el método. A continuación, se agrega un punto, seguido del nombre del método y un par de paréntesis que encierran los argumentos.
Python usa la indentación para establecer el ámbito (scope)
A diferencia de otros programas que usan { } para ello.
print() es una función incorporada de Python.
La keyword def permite definir funciones al codificador de Python.
La sintaxis para declarar una función es la siguiente:
Los dos puntos después de los parentesis que encierran los argumentos indican que inicia la función.
Todo el cuerpo de la función debe ir indentado (4 espacios),
lo que esta indentado, no pertenecera a la función.
¿Qué es un argumento? un valor, que se usará dentro del cuerpo de la función.
Después de def, escriba el nombre de la función y los nombres de los parámetros,
que la función puede aceptar, entre paréntesis. No olvidar los dos puntos al final de la línea.
Los nombres de una función y sus parámetros siguen la misma convención que los nombres de las variables,
es decir, deben escribirse en minúsculas con guiones bajos entre las palabras.
Puede hacer cálculos dentro de la función y usar la palabra clave return para devolver el resultado.
Solo cuando no hay sangría, finaliza la definición de la función.
Posteriormente, los parámetros toman valores pasados en una llamada de función.
Los valores que pasamos a una función se conocen como argumentos.
La única distinción entre parámetros y argumentos es
que introducimos parámetros en una definición de función y
damos argumentos (algunos valores específicos) en una llamada de función.
En caso de que no desee pasar ningún argumento, los corchetes permanecen vacíos.
pass
La sentencia pss no hace nada.
Se puede usar cuando se requiere una declaración sintácticamente pero el programa no requiere ninguna acción.
Esto se usa comúnmente para crear clases mínimas:
También puede declarar una especie de función vacía con la declaración pass:
Cuando elige llamar a lazy_func() con un valor arbitrario como argumento, no sucederá nada.
Así que pass es solo un placeholder, pero al menos su código será válido con él.
Los parámetros son solo alias de valores, que se pueden pasar a una función.
Los parámetros de una función son simplemente alias o placeholder para los valores que les pasará.
Los parámetros se reinicializan cada vez que llama a la función.
Dentro de la función, tiene acceso a estos valores, lo que significa que puede realizar cálculos sobre ellos.
La palabra clave return se usa para indicar qué valores genera la función (como salida o devolución).
Básicamente, es el resultado de la llamada a la función.
El intérprete de Python deja de realizar la función después dereturn.
Pero, ¿qué pasa si el cuerpo de la función contiene más de una declaración de retorno?
Entonces la ejecución terminará después de la primera.
Una función puede simplemente realizar una acción sin devolver nada o devolver un resultado específico.
Si su función no devuelve nada, asignar su resultado a una variable o imprimirlo le dará None.
Python ofrece otra manera de pasar argumentos, donde el significado del argumento esta definido por su nombre,
no su posición, a esto se le denomina paso de argumentos con palabras clave.
En Python se pueden invocar funciones con sus parámetros con nombre junto con su valor,
el intérprete de Python determina a qué argumentos proporcionar los valores.
No se tiene que invocar la función con los argumentos, en un orden particular
solamente proporciona los nombres junto con los valores.
datos(ap = "Paterno", genero = "masculino", nombre = "Homero", edad = 5, am = "Materno")
Es posible combinar ambos tipos si se desea, solo hay una regla inquebrantable:
se deben colocar primero los argumentos posicionales y después los de palabras clave.
Es posible que el valor de un argumento tenga un valor por defecto.
Esto es posible al definir el valor del argumento en la definición de los argumentos de la función,
con la condición que los argumentos por defecto sean declarados al final de la lista de argumentos,
de lo contrario Python indicará: non-default argument follows default argument
Existe un método especial en Python el cual puede extender el alcance de una variable
incluyendo el cuerpo de las funciones
para poder no solo leer los valores de las variables sino también modificarlos.
Este efecto es causado por la palabra reservada llamada global
Sirve para que se ejecute alguna parte del código solo si una condición particular es verdadera.
Tal parte del código debe colocarse dentro del cuerpo de una declaración if.
Seguida de una condición y la una lista de expresiones a ejecutar (si conoces otros lenguajes de programación no lleva parantesis, aunque se pueden colocar).
La condición es siempre una expresión booleana, es decir, su valor es Verdadero o Falso.
Si conoces otros lenguajes de programación encontraras que el inicio de un bloque o ámbito de una función
o estructura de control if es el sangrado o sangría normalmente 4 espacios (indentadoEste término significa mover un bloque de texto hacia la derecha insertando espacios o tabuladores, para así separarlo del margen izquierdo y distinguirlo mejor del texto adyacente),
fuera de este no se reconoce como parte del if.
El inicio del bloque es con dos puntos (:)
tanto para una función como para un if.
Un fragmento de código en el que todas las líneas están en el mismo nivel de sangría se denomina bloque de código.
En Python, solo se usa sangría para separar diferentes bloques de código.
En esta estructura si un caso no se cumple se puede pasar al caso contrario con un else:,
nuevamente si conoces otros lenguajes de programación tendrás que practicar para acostumbrarte a escribir dos puntos después del else:.
elif
Para varios casos se usa elif (si conoces otro lenguaje pensaras que esta mal escrito, pero así es correcto).
La declaración Elif se usa cuando queremos especificar varias condiciones en el código.
La declaración Elif difiere de else en un momento clave:
representa otra opción específica, mientras que else se ajusta a todos los casos
que no caen en la condición dada en la declaración if.
Si conoces otros lenguajes, en Python else no tiene un fin de bloque
El código dentro del bloque else se ejecuta solo si todas las condiciones anteriores son falsas.
Los condicionales con múltiples ramas forman un árbol de decisión, en el que un nodo es una expresión booleana y las ramas se marcan con Verdadero o Falso. La rama marcada como Verdadero conduce a la acción que debe ejecutarse y la rama Falsa conduce a la siguiente condición.
Una declaración if-else es otro tipo de expresiones condicionales en Python.
Se diferencia de una instrucción if por la presencia de la palabra clave adicional else.
El bloque de código que else contiene se ejecuta cuando la condición de su declaración if
no se cumple (el valor booleano es Falso).
Dado que una instrucción else es una alternativa para una instrucción if,
solo se puede ejecutar un bloque de código. Además, else no requiere ninguna condición:
Si conoces otros lenguajes, esta estructura es similar al operador ternario.
En Python se puede hacer uso de esta estructura escribiendola en una sola línea.
Loops permiten que un bloque de código se ejecute de manera iterativa
o repetitiva.
Python solo tiene los tipos de loops:
while
,
for
break empleado para interrumpir la iteración de un loop.
Sale del ciclo inmediatamente, e incondicionalmente termina la operación del ciclo;
el programa comienza a ejecutar la instrucción más cercana después del cuerpo del ciclo.
continue
Se comporta como si el programa hubiera llegado repentinamente al final del cuerpo;
el siguiente turno se inicia y la expresión de condición se prueba de inmediato.
pass para indicar que no se ejecute una sentencia.
Repite un bloque de código (aunque pueda contener una sola línea)
mientras una condición de control es definida por un rango: desde-hasta.
Se usa para iterar sobre una secuencia.
En el caso del for:
No es necesario hacer el incremento de la variable de control
Se usa range(<mínimo><máximo>, step)
para determinar el valor inicial y final de la condición de control.
Donde range() es una función para obtener el rango de los números.
La función range() solo acepta enteros como argumentos y genera secuencias de enteros.
La función range() también puede aceptar tres argumentos: Echa un vistazo al código del editor.
El tercer argumento es un incremento: es un valor agregado para controlar la variable en
cada giro del ciclo (el valor predeterminado del incremento es 1 ).
Si el conjunto generado por la función range() está vacío, el ciclo no ejecutará su cuerpo en absoluto.
Los bucles for de Python son los llamados iteradores,
por lo tanto se puede iterar sobre una colección.
También se usa la función enumerate(<índice>, <valor>),
la cual además regresa el índice de los elementos de una colección.
Recuerda el sangrado (indentado),
para definir el ámbito y los dos puntos (:) para indicar su inicio.
Iteradores
Ejemplo break (sale del ciclo o rompe el ciclo y no termina el ciclo completo)
Ejemplo continue (ignora la iteración que cumpla con la condición y continua con el ciclo)
El protocolo iterador es una forma en que un objeto debe comportarse
para ajustarse a las reglas impuestas por el contexto de las sentencias for e in.
Un objeto conforme al protocolo iterador se llama iterador.
Hay dos funciones específicas para trabajar con iteradores.
Devuelve verdadero si el objeto o admite el protocolo de iterador. Esta función siempre tiene éxito.
__iter__() el cual debe devolver el objeto en sí y que se invoca una vez
(es necesario para que Python inicie con éxito la iteración).
Retorna el siguiente valor de la iteración o.
El objeto debe ser un iterador (depende de quién llama comprobar esto).
Si no quedan valores restantes, retorna NULL sin establecer ninguna excepción.
Si se produce un error al recuperar el elemento, retorna NULL y pasa la excepción.
__next__() el cual debe devolver el siguiente valor (primero, segundo, etc.) de la serie deseada:
será invocado por las sentencias for/in para pasar a la siguiente iteración;
si no hay más valores a proporcionar, el método deberá lanzar la excepción StopIteration.
La expresión yield se usa al definir una función generator
o una función generator asynchronous y, por lo tanto, solo se puede usar en el cuerpo de una definición de función.
El uso de una expresión yield en el cuerpo de una función hace que esa función sea un generador,
y su uso en el cuerpo de una async def hace que esa función de rutina sea un generador asincrónico.
Una sentencia yield es semánticamente equivalente a una expresión yield.
La sentencia yield se puede utilizar para omitir los paréntesis
que de otro modo serían necesarios en la declaración de expresión de rendimiento equivalente.
Existe un documento que se llama PEP 8
(Python Enhancement Proposal - Propuesta de mejora de Python).
La idea clave es usar el mismo estilo de código para todos los proyectos de Python
como si fueran escritos por el mismo programador.
Este documento garantiza que incluso un principiante comprenderá fácilmente
el código escrito por cualquier otro desarrollador.
Existen diferentes tipos de PEP y el más útil para los principiantes es el PEP informativo.
Los PEP de este tipo suelen describir pautas o convenciones comúnmente aceptadas sobre el idioma,
por lo que pueden ser muy útiles.
Además de PEP 8, que es una guía de estilo oficial, otro gran PEP a tener en cuenta es el
PEP 20 Zen de Python.
La longitud de una línea
No utilice más de 79 caracteres en una línea de código.
Las líneas más cortas se ven mejor en los editores de código.
Durante este curso, aprenderemos varias formas de lograrlo.
Evite espacios extra
A veces, puede agregar algunos espacios incluso si realmente no los necesita. Esto reducirá la legibilidad de su código.
Evite espacios adicionales entre paréntesis.
En lo personal hoy en día he visto algunos programadores adoptar un estilo personal
que adopte cuando programaba y es colocar espacios para según yo mayor legibilidad,
es decir, contrario a lo que dicta el PEP, aunque siento que su punto de vista es
Evite espacios adicionales.
Comillas
Es posible usar comillas simples o dobles para definir cadenas.
Elija un estilo y utilícelo constantemente en su código.
La única recomendación en PEP 8 es que si una cadena contiene comillas simples o dobles,
debe usar la otra para evitar barras diagonales inversas.
Con Python puedes escribir código como procedimientos o
código como objetos.
Escribir código orientado a objetos usando clases
las cuales se puede encapsular la funcioncionalidad.
Recuerda que en la programación todo trata de
ordenarse, estructurarse, organizarse de una manera lógica,
el truco esta en entender ese pensamiento o filosofia y listo!.
Una clase se define usando la keywordclass
Métodos
Comenzaremos por una parte de la estructura de una clase,
diciendo que, una clase puede tener métodos.
Estos métodos son definidos como funciones.
Es aquí donde cada autor en su afán de explicar de manera pura
o de una manera particular (ya sea porque es su estilo
o ya sea por intentar ser claro),
en mi experiencia esto en ocasiones trae confusión,
cuando ya más o menos entendí la programación
siempre opte por las formas puras u ortodoxas,
en lo personal considero es lo mejor (ahora
con la edad he perdido ese estilo).
Usualmente el primer argumento de cualquiera de los métodos
de una clase es el argumento de uno mismo
y el argumento de uno mismo se refiere al objeto en sí.
Método es una función que está dentro de una clase.
Un método está obligado a tener al menos un parámetro self,
no existen métodos sin parámetros; un método puede invocarse sin un argumento, pero no puede declararse sin parámetros.
Al invocar un método, no se debe pasar el argumento para el parámetro self,
Python lo gestiona de manera automática e interna.
self
En otros lenguajes esto se conoce como this
El parámetro self es usado para obtener acceso a la instancia del objeto y las variables de clase.
Si omite self en la definición del método, se genera un error
TypeError: metodo() takes 0 positional arguments but 1 was given
Si omite anteponer self para acceder a la variable de clase
se genera un error, NameError: name 'attr' is not defined
self también se usa para invocar otros métodos desde dentro de la clase.
[ Python apareció en 1991, Java 5 años después (1996), sin embargo Eiffel apareció en 1985
pero C++ dos años antes (1983), esto según
wikipedia ].
Bien, una forma de entender una clase
podría ser visualizarla como una plantilla o molde,
donde a través del uso de esta plantilla o molde
se obtiene algo a lo cual llamaremos objeto,
cuando se crea un objeto se dice que
se instancia la clase.
Cuando se invoquen los métodos de clase no se tiene que proporcionar la keywordself,
ya que lo maneja Python automáticamente en tiempo de ejecución.
Cuando se nombra un método como: __init__, no será un método regular, será un constructorS.
Si una clase tiene un constructor, este se invoca automática e implícitamente cuando se instancia el objeto de la clase.
Para crear un objeto usamos:
Cada clase de Python y cada objeto de Python está pre-equipado con un conjunto de atributos útiles
que pueden usarse para examinar sus capacidades.
Los objetos de Python,
cuando se crean, están dotados de un pequeño conjunto de propiedades y métodos predefinidos.
Cada objeto los tiene, los quieras o no. Uno de ellos es una variable llamada
__dict__ (es un diccionario).
__dict__ es un diccionario.
La propiedad __name__ contiene el nombre de la clase, es solo una cadena
y está ausente del objeto, es decir, existe solo dentro de las clases.
__module__ es una cadena y almacena el nombre del módulo que contiene la definición de la clase.
Cualquier módulo llamado __main__ en realidad no es un módulo, sino es el archivo actualmente en ejecución.
__bases__ es una tupla. La tupla contiene clases (no nombres de clases) que son superclases directas para la clase.
Introspección
capacidad de un programa para examinar el tipo o las propiedades de un objeto en tiempo de ejecución.
Reflexión
capacidad de un programa para manipular los valores, propiedades y/o funciones de un objeto en tiempo de ejecución
Ejemplo de una clase:
Constructor
El constructor es un método que se llama cuando se crea un objeto.
Este método se define en la clase y se puede utilizar para inicializar variables básicas.
La operación de instanciación ("invocar" a un objeto de clase) crea un objeto vacío.
A muchas clases les gusta crear objetos con instancias personalizadas para un estado inicial específico.
Por lo tanto, una clase puede definir un método especial llamado __init __().
Considere lo siguiente:
El nombre del constructor es siempre __init__().
Tiene que tener al menos un parámetro obligatorio, generalmente se denomina self.
El parámetro se usa para representar el objeto recién creado:
puedes usar el parámetro para manipular el objeto y enriquecerlo con las propiedades necesarias.
Cuando una clase define un método __init __(),
la instanciación de clase invoca automáticamente __init __() para la instancia de clase recién creada.
Un constructor se puede utilizar para configurar el objeto, es decir,
inicializa adecuadamente su estado interno,
crea variables de instancia, crea instancias de cualquier otro objeto si es necesario, etc.
Un constructor no devuelve un valor,
esta diseñado para devolver un objeto recién creado.
Un constructor No se puede invocar directamente desde el objeto o
desde dentro de la clase. Es posible invorcar un constructor desde cualquiera
de las superclases (las más generales) del objeto.
Objeto
Cada vez que se describe un objeto y se usa:
Un sustantivo: probablemente se este definiendo el nombre del objeto.
Un adjetivo: probablemente se este definiendo una propiedad del objeto.
Un verbo: probablemente se este definiendo una actividad del objeto.
Spirit es un corcel indomable y salvaje que corre por la pradrera.
Nombre del objeto = Spirit
Clase de inicio = Corcel mustang
Propiedad = Temperamento (indomable y salvaje)
Actividad = Correr (por la pradrera)
Una Motocileta negra de competencia.
Nombre del objeto = Motocicleta
Clase de inicio = Vehículo terrestre
Propiedad = Color (negra)
Actividad = Tipo (competencia)
La programación orientada a objetos es el arte de definir y expandir clases. Una clase es un modelo de una parte muy específica de la realidad, que refleja las propiedades y actividades que se encuentran en el mundo real.
El proceso no necesita tener un final. Puedes crear tantas clases como necesites.
La clase que se define no tiene nada que ver con el objeto: la existencia de una clase no significa que ninguno de los objetos compatibles se creará automáticamente. La clase en sí misma no puede crear un objeto: debes crearlo tu mismo y Python te permite hacerlo.
Encapsulamiento
La capacidad de ocultar (proteger) los valores seleccionados contra el acceso no autorizado
se llama encapsulamiento; no se puede acceder a los valores encapsulados
ni modificarlos si deseas utilizarlos exclusivamente.
Variables privadas
Las variables de instancia "privadas" a las que no se puede acceder excepto desde el interior de un objetono existen en Python.
Sin embargo, existe una convención que es seguida por la mayoría del código Python:
un nombre prefijado con un guión bajo
debe tratarse como una parte no pública, es decir, privada de la API:
ya sea una función, método o un miembro de datos.
Debe considerarse un detalle de implementación y sujeto a cambios sin previo aviso.
En términos generales, las variables de instancia son para
datos únicos para cada instancia.
Las variables de clase son para atributos y métodos compartidos
por todas las instancias de la clase.
Una variable de clase es una propiedad que existe en una sola copia y se almacena fuera de cualquier objeto.
Las variables de clase no se muestran en el diccionario de un objeto __dict__
esto es natural ya que las variables de clase no son partes de un objeto.
Una variable de clase siempre presenta el mismo valor en todas las instancias de clase (objetos).
Las variables de clase existen incluso cuando no se creó ninguna instancia de clase (objeto).
Es cuando la subclase puede modificar el comportamiento de su superclase.
La herencia extiende las capacidades de una clase agregando nuevos componentes y modificando los existentes.
La composición proyecta una clase como contenedor capaz de almacenar y
usar otros objetos (derivados de otras clases) donde cada uno de los objetos
implementa una parte del comportamiento de una clase.
Divide una pieza de software en partes separadas pero cooperantes.
Los módulos, junto con las funciones integradas, forman la Biblioteca estándar de Python
Cada módulo consta de entidades. Estas entidades pueden ser funciones, variables, constantes, clases y objetos.
Módulo math.
Módulos en Python son archivos escritos en Python y almacenados con la extensión .py
La instalación estándar de Python contiene bastantes módulos pero puedes ampliar su biblioteca.
De esta manera podemos ir creando nuestro propio código reutilizable en diferentes proyectos,
sin la necesidad de estar copiando código.
Para que un módulo sea utilizable, hay que importarlo,
empleando la sentencia import.
En otros lenguajes seria un use.
La instrucción import puede colocarse en cualquier parte del código,
pero debe colocarse antes del primer uso de cualquiera de las entidades del módulo.
Si se desea importar más de un módulo, se puede hacer repitiendo la cláusula import,
o listando los módulos despues de la palabra reservada import, y separando el nombre de cada
módulo con una coma (,)
Para acceder a la entidad de un módulo se utiliza la notación de punto:
math.pi
__pycache__
Cuando creamos modulos y los importamos se crea un directorio llamado __pycache__
y un archivo, por ejemplo:
<nombre_modulo>.cpython-39.pyc.
Donde los digitos corresponden versión de Python y la ultima parte (pyc) viene de las palabras Python y compilado.
Cuando Python importa un módulo por primera vez, traduce el contenido a una forma "semi" compilada.
El archivo no contiene código en lenguaje máquina: es código semi-compilado interno de Python,
listo para ser ejecutado por el intérprete de Python.
Como tal archivo no requiere tantas comprobaciones como las de un archivo fuente,
la ejecución comienza más rápido y también se ejecuta más rápido.
Python puede verificar si el archivo fuente del módulo ha sido modificado
(en este caso, el archivo pyc será reconstruido) o no (cuando el archivo pyc pueda ser ejecutado al instante).
Este proceso es completamente automático y transparente, no se tiene que estar tomando en cuenta.
__name__
También crea una variable llamada __name__.
Con tan solo hacer el import del módulo creado, se ejecuta como una extensión
del programa desde el cual se importa, por ejemplo si el modulo solo tiene una línea que es un
print("Hola módulo", al ejecutar el programa aparecerá dicho mensaje.
Archivo que importa el módulo:
Módulo creado:
Salida de la ejecución del archivo que importa el módulo:
Hola módulo mimodulo
Cuando se ejecuta un archivo directamente, su variable __name__ se establece a __main__.
Cuando un archivo se importa como un módulo, su variable __name__
se establece al nombre del archivo (excluyendo a .py).
Archivo que importa el módulo:
Módulo creado:
Salida de la ejecución del archivo que importa el módulo:
Hola módulo mimodulo
soy módulo
soy el programa que invoca el módulo
Se debe tener en mente que el módulo solo existe en un archivo independiente,
pero al importar el módulo es una extensión del código por lo que,
si se declara una variable en el módulo,
el programa que importa, puede acceder a la variable
anteponiendo el nombre del módulo y usando la notación de punto.
mimodulo.variable
A diferencia de muchos otros lenguajes de programación, Python no tiene medios para permitirte ocultar tales variables
a los ojos de los usuarios del módulo.
Solo puedes informar a tus usuarios que esta es tu variable, que pueden leerla,
pero que no deben modificarla bajo ninguna circunstancia. Esto se hace anteponiendo al nombre de la variable
_ (un guión bajo) o __ (dos guiones bajos), pero recuerda, es solo un acuerdo.
Los usuarios de tu módulo pueden obedecerlo o no. Python como se menciono no puede impedir que se altere
la variable fuera del módulo.
path
¿Qué sucede cuando el archivo que invoca a un módulo se encuentra en otro directorio?
Hay una variable especial (en realidad una lista) que almacena todas las ubicaciones (carpetas o directorios)
que se buscan para encontrar un módulo que ha sido solicitado por la instrucción import.
Python examina estas carpetas en el orden en que aparecen en la lista:
si el módulo no se puede encontrar en ninguno de estos directorios, la importación falla.
De lo contrario, se tomará en cuenta la primera carpeta que contenga un módulo con el nombre deseado
(si alguna de las carpetas restantes contiene un módulo con ese nombre, se ignorará).
La variable se llama path (ruta), y es accesible a través del módulo llamado sys.
Si hay un archivo zip listado como uno de los elementos de la ruta,
Python puede tratar los archivos zip como carpetas ordinarias, esto puede ahorrar mucho almacenamiento.
Una solución podría ser:
__init__.py
Los paquetes, como los módulos, pueden requerir inicialización.
La inicialización de un módulo se realiza mediante un código independiente (que no forma parte de ninguna función)
ubicado dentro del archivo del módulo. Como un paquete no es un archivo, esta técnica es inútil para inicializar paquetes.
En su lugar, debes usar un truco diferente: Python espera que haya un archivo con un nombre muy exclusivo
dentro de la carpeta del paquete: __init__.py.
El contenido del archivo se ejecuta cuando se importa cualquiera de los módulos del paquete.
Si no deseas ninguna inicialización especial, se puede dejar el archivo vacío, pero no se debe omitir.
from
Existe una forma más óptima de importar un módulo y sus entidades:
frommath import pi
Lo cual expresa que solo se importe esa parte del módulo y no el módulo completo.
De la misma manera que se pueden importar varios módulos, se pueden usar varias entidades de un módulo:
from math import pi, sin
Para importar todo:
from module import *
Para usar un alias
import math as m
from module import nombre as alias
from module import n as a, m as b, o as c
dir()
La función devuelve una lista ordenada alfabéticamente la cual contiene todos los nombres
de las entidades disponibles en el módulo:
namespace
Un namespace es un espacio en el que existen algunos nombres y
los nombres no entran en conflicto entre sí
(es decir, no hay dos objetos diferentes con el mismo nombre).
El grupo tiende a nombrar a cada uno de sus miembros de una manera única.
Dentro de un determinado namespace, cada nombre debe permanecer único.
Un generador de números aleatorios toma un valor llamado semilla, lo trata como un valor de entrada,
calcula un número "aleatorio" basado en él (el método depende de un algoritmo elegido) y produce una nueva semilla.
La duración de un ciclo en el que todos los valores semilla son únicos puede ser muy largo,
pero no es infinito: tarde o temprano los valores iniciales comenzarán a repetirse y
los valores generadores también se repetirán. Esto es normal. Es una característica, no un error.
El valor de la semilla inicial, establecido durante el inicio del programa,
determina el orden en que aparecerán los valores generados.
El factor aleatorio del proceso puede ser aumentado al establecer la semilla tomando un número de la hora actual
- esto puede garantizar que cada lanzamiento del programa comience desde
un valor semilla diferente (por lo tanto, usará diferentes números aleatorios).
Afortunadamente, Python realiza dicha inicialización al importar el módulo.
El código (en ejecución) se encuentra en la parte superior.
El entorno de ejecución de Python se encuentra directamente debajo de él.
La siguiente capa de la pirámide se llena con el SO (sistema operativo):
el entorno de Python proporciona algunas de sus funcionalidades utilizando los servicios del sistema operativo.
Python, aunque es muy potente, no es omnipotente:
se ve obligado a usar muchos ayudantes si va a procesar archivos o comunicarse con dispositivos físicos.
La capa más inferior es el hardware: el procesador (o procesadores), las interfaces de red,
los dispositivos de interfaz humana (ratones, teclados, etc.)
y toda otra maquinaria necesaria para hacer funcionar la computadora:
el sistema operativo sabe cómo emplearlos y utiliza muchos trucos para trabajar
con todas las partes en un ritmo constante.
¿Qué sucede para que se ejecute el código?
El código quiere crear un archivo, por lo que invoca una de las funciones de Python.
Python acepta la orden, la reorganiza para cumplir con los requisitos del sistema operativo local
(es como poner el sello "aprobado" en una solicitud) y lo envía.
El SO comprueba si la solicitud es razonable y válida
(por ejemplo, si el nombre del archivo se ajusta a algunas reglas de sintaxis) e intenta crear el archivo.
Tal operación, aparentemente es muy simple, no es atómica: consiste de muchos pasos menores tomados por...
El hardware, el cual es responsable de activar los dispositivos de almacenamiento
(disco duro, dispositivos de estado sólido, etc.) para satisfacer las necesidades del sistema operativo.
El módulo platform permite acceder a los datos de la plataforma subyacente, es decir,
hardware, sistema operativo e información sobre la versión del intérprete.
Existe también una función que puede mostrar todas las capas subyacentes en un solo vistazo,
llamada platform.
Simplemente devuelve una cadena que describe el entorno; por lo tanto, su salida está más dirigida
a los humanos que al procesamiento automatizado.
machine() devuelve el nombre genérico del procesador.
processor() devuelve el nombre real del procesador.
system() devuelve el nombre genérico del sistema operativo.
version devuelve la versión del sistema operativo.
python_implementation() y python_version_tuple()
devuelven la versión de Python está ejecutando y el número de versión respectivamente.
Al escribir programas de estilo funcional, a menudo necesitará pequeñas funciones que actúen como predicados o que combinen elementos de alguna manera.
Si la función que necesita no existe, debe escribirla.
Una forma de escribir funciones pequeñas es usar la expresión lambda.
lambda toma varios parámetros y una expresión que combina estos parámetros y
crea una función anónima que:
devuelve el valor de la expresión:
El siguiente código sirva para ejemplificar, sin embargo no es del todo correcto,
PEP 8 indica que:
"no asigne una expresión lambda, use def".
Expresiones lambda
Se pueden crear pequeñas funciones anónimas con la palabra clave lambda.
Esta función devuelve la suma de sus dos argumentos: lambda a, b: a + b.
Las funciones Lambda se pueden utilizar siempre que se requieran objetos de función.
Están restringidos sintácticamente a una sola expresión.
Semánticamente, son simplemente azúcar sintáctico para una definición de función normal.
Utilidad
La utilidad de una función lambda es escribir partes anónimas de código destinadas a evaluar un resultado.
Para el manejo de fechas se debe indicar al intérprete de Python que desde el módulo estándar de fecha y hora
que viene con la biblioteca estándar, se importen las clases de fecha, hora y fecha y hora.
Un objeto timedelta representa una duración, la diferencia entre dos fechas u horas.
La diferncia entre time y timedelta es el formato que manejan,
donde timedelta pudiera resultar más entendible para una persona,
el estar su formato expresado en horas, minutos, segundos y milisegundos:
Este módulo permite generar calendarios y proporciona funciones útiles relacionadas con el calendario.
De forma predeterminada, estos calendarios tienen el lunes como primer día de la semana y
el domingo como último (la convención europea).
Utilice setfirstweekday() para establecer el primer día de la semana en domingo (6) o en cualquier otro día de la semana.
Los parámetros que especifican fechas se dan como números enteros.
Las funciones y clases definidas en este módulo utilizan un calendario idealizado,
el actual calendario gregoriano extendido indefinidamente en ambas direcciones.
Esto coincide con la definición del calendario "gregoriano proléptico" en el libro "Calendrical Calculations"
de Dershowitz y Reingold, donde es el calendario base para todos los cálculos.
Los años cero y negativos se interpretan según lo prescrito por la norma ISO 8601. El año 0 es 1 AC, el año -1 es 2 AC, y así sucesivamente.
Podemos acceder a un archivo a través de la función open(filename, mode) la cual regresa un objeto de tipo file,
esta función tiene 2 argumentos, el primero indica el archivo a trabajar y el segundo el modo de acceso a este.
El primer parámetro filename de la función especifica el nombre del archivo que se asociará al stream.
El segundo parámetro mode especifica el modo de apertura utilizado para el stream;
es una cadena llena de una secuencia de caracteres, y cada uno de ellos tiene su propio significado especial.
rsolo lectura.
El archivo asociado con el stream debe existir y
tiene que ser legible, de lo contrario la función open() lanzará una excepción.
wsolo escritura
El archivo asociado con el stream no necesita existir.
Si no existe, se creará;
Si existe un archivo con el mismo nombre, podría ser eliminado.
Si existe, se truncará a la longitud de cero (se borrá);
Si la creación no es posible por ejemplo, debido a los permisos del sistema,
la función open() lanzará una excepción.
ase abre para agregar contenido.
El archivo asociado con el stream no necesita existir;
Si no existe, se creará;
Si existe, el cabezal de grabación virtual se establecerá al final del archivo y
el contenido anterior del archivo permanece intacto.
Cualquier dato agregado al archivo será agregado en automático al final.
r+lectura y escritura
Se abre el archivo tanto en modo lectura como escritura.
El argumento de modo de acceso es opcional.
El archivo asociado con el stream no necesita existir;
Si no existe, se creará;
Si existe, el contenido anterior del archivo permanece intacto.
Nota: r por defecto si el modo de acceso es omitido su modo es de lectura.
También puedes abrir un archivo para su creación exclusiva.
Puedes hacer esto usando el modo de apertura x.
Si el archivo ya existe, la función open() lanzará una excepción.
El tercer parámetro opcional encoding especifica el tipo de codificación,
por ejemplo, UTF-8 cuando se trabaja con archivos de texto.
Si la apertura es exitosa, la función devuelve un objeto stream;
de lo contrario,
se genera una excepción (por ejemplo, FileNotFoundError si el archivo que vas a leer no existe).
os
os este módulo proporciona una forma portátil de utilizar la funcionalidad dependiente del sistema operativo.
Si desea manipular rutas, vea el módulo os.path
FileNotFoundError
Se genera cuando se solicita un archivo o directorio, pero no existe. Corresponde a errno ENOENT.
close
Si un archivo es abierto, este debe ser cerrado con el método close(), después de acceder a su modo.
Ejemplo, validar si el archivo existe, entonces mostrar su contenido, en caso contrario mostrar que no existe el archivo.
El siguiente ejemplo intenta abrir un archivo pero si no existe este, entonces lo crea:
write
El método write() espera solo un argumento: una cadena que se transferirá a un archivo abierto,
el modo de apertura debe reflejar la forma en que se transfieren los datos
(escribir en un archivo abierto en modo de lectura no tendrá éxito).
No se agrega carácter de nueva línea al argumento de write(),
por lo que debe agregar si se desea que el archivo se complete con varias líneas.
El siguiente ejemplo creará el mismo archivo con el mismo contenido cada que se ejecute el programa:
Para escribir en el archivo se usa el método write(contenido),
ejemplo que crea un archivo diferente cada vez que se ejecuta el programa:
Streams pre-abiertos
Cualquier operación del stream debe estar precedida por la invocación de la función open().
Hay tres excepciones bien definidas a esta regla:
sys.stdin,
sys.stdout y
sys.stderr.
Cuando comienza nuestro programa, los tres streams ya están abiertos y no requieren ninguna preparación adicional.
sys.stdin
Entrada estándar. Se utiliza para todas las entradas interactivas (incluidas las llamadas a input ());
El stream stdin normalmente se asocia con el teclado, se abre previamente para la lectura y
se considera como la fuente de datos principal para los programas en ejecución.
La función bien conocida input() lee datos de stdin por default.
sys.stdout
Salida estándar. Se usa para la salida de print() y declaraciones de expresión y para las solicitudes de input();
El stream stdout normalmente está asociado con la pantalla, preabierta para escritura,
considerada como el objetivo principal para la salida de datos por el programa en ejecución.
La función bien conocida print() envía los datos al stream stdout.
sys.stderr
Salida de error estándar. Las propias indicaciones del intérprete y sus mensajes de error van a stderr.
El stream stderr normalmente está asociado con la pantalla, preabierta para escribir,
considerada como el lugar principal donde el programa en ejecución debe enviar información sobre los errores encontrados durante su trabajo.
La separación de stdout resultados útiles producidos por el programa de stderr
(mensajes de error, indudablemente útiles pero no proporcionan resultados)
ofrece la posibilidad de redirigir estos dos tipos de información a los diferentes objetivos.
stream.close()
La última operación realizada en un stream (esto no incluye a los streams stdin, stdout, y stderr pues no lo requieren) debe ser cerrarlo.
Esa acción se realiza mediante un método invocado desde dentro del objeto del stream: stream.close().
La función no espera argumentos; el stream no necesita estar abierto.
La función no devuelve nada pero lanza una excepción IOError en caso de un error.
Considera que close() puede fallar.
Errores con streams
El objeto IOError está equipado con una propiedad llamada errno
(el nombre viene de la frase error number, número de error).
El valor del atributo errno se puede comparar con una de las constantes simbólicas predefinidas en módulo errno.
Devuelve el mensaje de error correspondiente al código de error en el código.
En plataformas donde strerror() devuelve NULL cuando se le da un número de error desconocido, se genera ValueError.
Ejemplo de lectura de un archivo con strerror():
Ejemplo de lectura de los caracteres que tiene de un archivo con strerror():
mode
Podemos conocer el modo de acceso del archivo con la propiedad mode.
read
Para obtener el contenido del archivo se usa el método read()
Para obtener todo el contenido del archivo por líneas se usa el método readlines().
tell
El método tell() devuelve un número entero que da la posición actual del objeto de archivo en el archivo representado como el número de bytes desde el principio del archivo cuando está en modo binario y un número opaco cuando está en modo texto.
readline
El método readline() lee solamente una línea del archivo.
El método intenta leer una línea completa de texto del archivo,
y la devuelve como una cadena en caso de éxito. De lo contrario, devuelve una cadena vacía.
Ejemplo de lectura de los caracteres y líneas que tiene de un archivo con readline()strerror():
Para cambiar la posición del objeto de archivo, se usa el método seek(desplazamiento, de dónde).
La posición se calcula sumando el desplazamiento a un punto de referencia; el punto de referencia se selecciona mediante el argumento de origen. Un valor de donde 0 mide desde el principio del archivo, 1 usa la posición actual del archivo y 2 usa el final del archivo como punto de referencia. donde se puede omitir y el valor predeterminado es 0, utilizando el comienzo del archivo como punto de referencia.
readlines
Cuando el método readlines(), se invoca sin argumentos, intenta leer todo el contenido del archivo y
devuelve una lista de cadenas, un elemento por línea del archivo.
Si no estás seguro de si el tamaño del archivo es lo suficientemente pequeño y no deseas probar el sistema operativo,
puede indicar al método readlines() de leer no más de un número especificado de bytes a la vez.
El tamaño máximo del búfer de entrada aceptado se pasa al método como argumento.
Ejemplo de lectura de los caracteres y líneas que tiene de un archivo con readlines()strerror():
Falta de portabilidad
Un programa capaz de procesar un archivo de texto y está escrito para Windows,
puedes reconocer los extremos de las líneas al encontrar los caracteres
\r\n, pero si el mismo programa se ejecuta en un entorno
Unix/Linux será completamente inútil,
y viceversa: el programa escrito para sistemas Unix/Linux podría ser inútil en Windows.
Estas características indeseables del programa, que impiden o dificultan el uso del programa en diferentes entornos,
se denomina falta de portabilidad.
El rasgo del programa que permite la ejecución en diferentes entornos se llama portabilidad.
Un programa dotado de tal rasgo se llama programa portable.
El módulo shutil ofrece una serie de operaciones de alto nivel en archivos y colecciones de archivos.
En particular, se proporcionan funciones que admiten la copia y eliminación de archivos.
El método copy() solo copia el contenido del archivo.
Si desea copiar cosas como la hora de modificación y otros metadatos asociados con el archivo,
necesita usar el método copystat()
Clases especializadas de Python que usa para almacenar datos amorfos.
Datos amorfos son datos que no tienen forma específica, son solo una serie de bytes.
Estos datos amorfos no se pueden almacenarse como cadenas o listas.
Debe haber un contenedor especial capaz de manejar dichos datos.
Este subtipo de PyObject representa un objeto arreglo de bytes de Python,
es un arreglo que contiene bytes (amorfos).
data = bytearray(100)
La invocación crea un objeto bytearray capaz de almacenar diez bytes.
Nota: dicho constructor llena todo el arreglo con ceros.
Los bytearrays son mutables, son suceptibles a la función len(), y
se puede acceder a cualquiera de sus elementos usando indexación convencional.
No se debe establecer ningún elemento del arreglo de bytes con un valor que no sea un entero,
violar esta regla causará una excepción TypeError y
tampoco está permitido asignar un valor fuera del rango de 0 a 255 un valor diferente provoca una excepción ValueError.
hex()
Convierte un número entero en una cadena hexadecimal en minúscula con el prefijo "0x".
Si x no es un objeto int de Python,
tiene que definir un método __index __() que devuelva un número entero:
print(hex(255)) # 0xff
print(hex(-42)) # -0x2a
En el siguiente ejemplo se usa la función hex() para ver los elementos impresos como valores hexadecimales.
El método write() devuelve la cantidad de bytes escritos correctamente.
El método readinto(b) lee bytes en objeto pre-asignado y grabable bytes-like object b, y
retorna el número de bytes leído.
Por ejemplo, b puede ser una clase de tipo bytearray.
Si el objeto está en modo sin bloquear y no hay bytes disponibles, se retorna None.
read(size=-1)
Lee y retorna hasta size en bytes. Si el argumento está omitido, None, o es negativo,
los datos son leídos y retornados hasta que se alcance el fin del archivo.
Un objeto bytes vacío se retorna si el stream está al final del archivo.
Si el argumento es positivo, y el stream subyacente no es interactiva,
varias lecturas sin formato pueden ser otorgadas para satisfacer la cantidad de byte (al menos que primero se llegue al fin del archivo).
Pero para los streams sin formato interactivas, a lo sumo una lectura sin formato será emitida y
un resultado corto no implica que se haya llegado al fin del archivo.
Un BlockingIOError se lanza si el stream subyacente está en modo no bloqueo y no tiene datos al momento.
read() invocado sin argumentos, intenta leer todo el contenido del archivo en la memoria,
haciéndolo parte de un objeto recién creado de la clase bytes.
Esta clase tiene algunas similitudes con bytearray, con la excepción de una diferencia significativa: es immutable.
Si el método read() se invoca con un argumento, se especifica el número máximo de bytes a leer.
El método intenta leer la cantidad deseada de bytes del archivo, y la longitud del objeto devuelto puede
usarse para determinar la cantidad de bytes realmente leídos.
Los códigos de estado de respuesta HTTP indican si se ha completado satisfactoriamente una solicitud HTTP específica. Las respuestas se agrupan en cinco clases:
Respuestas informativas (100–199)
Respuestas satisfactorias (200–299) por ejemplo: 200 es OK, 201 - creado, 202 - aceptado
Redirecciones (300–399)
Errores de los clientes (400–499) por ejemplo: 400 es Bad Request, 404 - Not Found y
JSON (JavaScript Object Notation), es un formato de intercambio de datos ligero,
inspirado en la sintaxis literal de objetos JavaScript (aunque no es un subconjunto estricto de JavaScript).
json expone una API familiar para los usuarios de los módulos estándar de biblioteca marshal y pickle.
json.loads() Deserializar s (una instancia de str, bytes o bytearray que contiene un documento JSON)
a un objeto Python usando esta tabla de conversión.
Si los datos que se deserializan no son un documento JSON válido, se generará un JSONDecodeError.
pip es un sistema de gestión de paquetes utilizado para instalar y administrar paquetes de software escritos en Python.
Muchos paquetes pueden ser encontrados en el Python Package Index (PyPI).
Python 2.7.9 y posteriores (en la serie Python2), Python 3.4 y posteriores incluyen pip (pip3 para Python3) por defecto.
pip es un acrónimo recursivo que se puede interpretar como Pip Instalador de Paquetes o Pip Instalador de Python.
El Proyecto Jupyter es una organización sin ánimo de lucro creada para
"desarrollar software de código abierto, estándares abiertos y servicios para computación interactiva en docenas de lenguajes de programación".
Creado a partir de IPython en 2014 por Fernando Pérez,
el proyecto Jupyter soporta entornos de ejecución en varias docenas de lenguajes de programación.
El nombre del proyecto Jupyter es una referencia a los tres lenguajes de programación principales soportados por Jupyter,
que son Julia, Python y R, y también un homenaje a
los cuadernos de Galileo que registran el decubrimiento de los satélites de Júpiter.
El proyecto Jupyter ha desarrollado y respaldado los productos de computación interactiva
Jupyter Notebook, JupyterHub y JupyterLab, la versión de próxima generación de Jupyter Notebook.
Anaconda es un distribución libre y abierta1 de los lenguajes Python y R, utilizada en ciencia de datos, y
aprendizaje automático (machine learning).
Esto incluye procesamiento de grandes volúmenes de información, análisis predictivo y cómputos científicos.
Está orientado a simplificar el despliegue y administración de los paquetes de software
Las diferentes versiones de los paquetes se administran mediante el sistema de gestión de paquetes conda,
el cual lo hace bastante sencillo de instalar, correr, y actualizar software de ciencia de datos y
aprendizaje automático como ser Scikit-team, TensorFlow y SciPy.
La distribución Anaconda es utilizada por 6 millones de usuarios e incluye más de 250 paquetes de ciencia de datos válidos para
Windows, Linux y MacOS.
Pandas es una herramienta de análisis y manipulación de datos de código abierto rápida, potente, flexible y fácil de usar,
construido sobre el lenguaje de programación Python.
En Computación y Ciencia de datos, pandas es una biblioteca de software escrita como extensión de NumPy para manipulación y
análisis de datos para el lenguaje de programación Python.
En particular, ofrece estructuras de datos y operaciones para manipular tablas numéricas y series temporales.
Es un software libre distribuido bajo la licencia BSD versión tres cláusulas.
El nombre deriva del término "datos de panel", término de econometría que designa datos
que combinan una dimensión temporal con otra dimensión transversal.
Anaconda es una distribución libre y abierta de los lenguajes Python y R, utilizada en ciencia de datos, y aprendizaje automático (machine learning).
Anaconda
fue construida por científicos de datos, para científicos de datos.
Las soluciones Anaconda son una tecnología seria para aplicaciones de ML y
ciencia de datos reales. Anaconda es versátil: estará listo
para resolver problemas que ni siquiera sabe que tiene todavía.
Al descargar e instalar Anaconda una de sus herramientas es Jupyter
Acceda al sitio de Anaconda y descargue la versión que le convenga:
Installing on Windows
Proyecto Jupyter
El Proyecto Jupyter es una organización sin ánimo de lucro creada
para "desarrollar software de código abierto, estándares abiertos y
servicios para computación interactiva en docenas de lenguajes de programación".
Creado a partir de IPython en 2014 por Fernando Pérez,
el proyecto Jupyter soporta entornos de ejecución en varias docenas de lenguajes de programación.
El nombre del proyecto Jupyter es una referencia a los tres lenguajes de programación principales
soportados por Jupyter, que son Julia, Python y R, y
también un homenaje a los cuadernos de Galileo que registran el descubrimiento de los satélites de Júpiter.
El proyecto Jupyter ha desarrollado y respaldado los productos de computación interactiva
Jupyter Notebook, JupyterHub y JupyterLab, la versión de próxima generación de Jupyter Notebook.
Una vez instalado Anaconda puede abrir o ejecutar Jupyter.
Jupyter Notebook
Jupyter Notebook (anteriormente IPython Notebooks)
es un entorno informático interactivo basado en la web
para crear documentos de Jupyter notebook.
El término "notebook" puede hacer referencia coloquialmente a muchas entidades diferentes,
principalmente la aplicación web Jupyter, el servidor web Jupyter Python o
el formato de documento Jupyter según el contexto.
Un documento de Jupyter Notebook es un documento JSON,
que sigue un esquema versionado y que
contiene una lista ordenada de celdas de entrada/salidaque pueden contener código,
texto (usando Markdown),
matemáticas,
gráficos y texto enriquecidos, generalmente terminado con la extensión ".ipynb".
Home page, crear o seleccionar una notebook
De inicio si nunca has utilizado Jupyter tendras una pequeña curva de aprendizaje
para familiarizarte con su forma de trabajo, por ejemplo:
Lo primero que debes saber es que Jupyter abre un entorno web,
es decir, vas a trabajar en una página web que se abre al iniciar Jupyter.
Por cierto puedes abrir Anacanda Navigator que es una aplicación de escritorio y
que muestra todas sus herramientas, entre ella Jupyter y desde ahí solo basta un clic para abrir.
O bien puedes ejecutar directamente Jupyter sin abrir Anaconda Navigator,
en este caso se abre un servidor web por lo que se tiene una consola,
la cual indica instrucciones para su uso.
En un browser o navegador se abre la siguiente URL http://localhost:8888/tree
Donde localhost hace referencia a un servidor web o http local y los dos puntos
sirven para especificar el puerto 8888 donde estará funcionando,
es decir, donde el servidor HTTP “escucha” la petición hecha por un cliente.
Se presentan tres pestañas: Files, donde puede navegar entre los directorios de la máquina,
Running, Actualmente ejecutando procesos de Jupyter y clusters,
ipyparallel.
Los botones:
Upload, para el envío de archivos al servidor
New, la parte interesante, puedes crean una notebook,
la cual trabajará con el compilador de tu elección.
Nota. Los tipos de Notebooks dependeran de lo que se tenga instalado,
es decir, si en la máquina esta instalado Python, se listará como notebook,
lo mismo para Julia y lo mismo para los kernels que Jupyter detecte
se encuentran instalados y su versión correspondiente.
También es posible crear por ejemplo: un archivo de texto, un directorio o folder
y otro punto interesente es que es posible abrir una terminal.
Nueva notebook
Al dar clic en el kernel de Python por ejemplo, se abre una nueva página,
la cual no tiene título, pero que es posible almacenar con un nombre.
Además indica cuando se hizo el último checkpoint
Un menú principal con las opciones: File, Edit, View, insert, Cell,
Kernel, Widgets, Help, al extremo derecho de este menú se muestra
el lenguaje seleccionado que puede ser Python 3 por ejemplo.
Debajo del menú principal tenemos unos accesos directos representados
por un ícono, así como una lista seleccionable que contiene por ejemplo:
Code, Markdown, Raw NBconvert, Heading,
con estas opciones cambiamos el tipo de edición, por ejemplo
si estamos documentando tal vez lo estemos haciendo con Markdown,
pero si estamos codificando será Code.
Celdas
Debajo del menú se inicia la notebook, por defecto muestra una celda.
Aquí es donde escribes las instrucciones por ejemplo en Python,
despúes de donde se indica In [ ]: y en la parte sombreada,
podrías escribir
print("Hola mundo")
y para ejecutar la instrucción debes dar CTRL + Intro
o con el ícono que dice Run
Ejecutada la celda inicia una numeración In [n]:
Si la instrucción esta procesandose se mostrara un *
Al final de su ejecución debajo de la celda se muestra el resultado
o un mensaje de error si lo hubo.
Insertar una celda
De lo más simple, de los accesos director, dar clic en el ícono de +.
Cambiar orden de celdas
Simple, coloca el cursor en la celda que deseas mover y con los íconode de las
flechas arriba y abajo, situar en el lugar que mejor convenga.
Al ejecutar las celdas, el número de celda cambia y se reordena.
Cortar, copiar y pegar celdas
Es posible Cortar, copiar y pegar celdas, como en cualquier editor de texto,
las cortamos o copiamos y pegamos en donde sea conveniente.
Kernel: Interrupt, restart, reconnect, shutdown
Permite controlar la ejecución de celdas o la notebook, es decir el kernel.
Apache Spark es un framework de computación en clúster open-source.
Fue desarrollada originariamente en la Universidad de California, en el AMPLab de Berkeley.
El código base del proyecto Spark fue donado más tarde a la Apache Software Foundation
que se encarga de su mantenimiento desde entonces.
Spark proporciona una interfaz para la programación de clusters completos
con Paralelismo de Datos implícito y tolerancia a fallos.
Apache Spark se puede considerar un sistema de computación en clúster de propósito general y
orientado a la velocidad.
Proporciona APIs en Java, Scala, Python, R y un motor optimizado que soporta la ejecución de grafos en general.
También soporta un conjunto extenso y rico de herramientas de alto nivel
entre las que se incluyen Spark SQL (para el procesamiento de datos estructurados basada en SQL),
MLlib para implementar machine learning, GraphX para el procesamiento de grafos y Spark Streaming.
Para instalar lo usual, acceder al sitio del producto spark.apache.org
buscar la sección de descarga,
para cuando se consulto la página indicaba seleccionar la versión de spark
y el tipo de paquete.
Para la instalación y configuración sigan las instrucciones del sitio oficial.
Una vez instalado para trabajar con el ambiente de Spark deben acceder al directorio donde este fue instalado
y configurado, el comando es el siguiente:
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.7
/_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 11.0.9)
Type in expressions to have them evaluated.
Type :help for more information.
Su principal desarrollador, Wes McKinney, empezó a desarrollar Pandas en el año 2008
mientras trabajaba en AQR Capital por la necesidad que tenía de una herramienta flexible de alto rendimiento
para realizar análisis cuantitativo en datos financieros.
Antes de dejar AQR convenció a la administración de la empresa de distribuir esta biblioteca
bajo licencia de código abierto.
Otro empleado de AQR, Chang Ella, se unió en 2012 al esfuerzo de desarrollo de la biblioteca.
Pandas es una herramienta de análisis y manipulación de datos
de código abierto rápida, potente, flexible y fácil de usar,
construido sobre el lenguaje de programación Python.
En Computación y Ciencia de datos,
Pandas es una biblioteca de software escrita como extensión de NumPy
para
manipulación y análisis de datospara el lenguaje de programación Python.
En particular,
ofrece estructuras de datos y operaciones para manipular
tablas numéricas y
series temporales.
Es un software libre distribuido bajo la licencia BSD versión tres cláusulas.
El nombre deriva del término "datos de panel",
término de econometría que designa datos que combinan una dimensión temporal con otra dimensión transversal.
Para usar Pandas se hace a través de un import y se recomienda se declare como pd como convención.
pandas.read_csv
De la misma manera por convención un DataFrame se declara como df,
por ejemplo pandas.read_csv
que lee un archivo de valores separados por comas (csv) en un
Dataframe
DataFrame
es una estructura de datos etiquetada bidimensional con columnas de tipos potencialmente diferentes.
Puede pensar en ello como una hoja de cálculo o una tabla SQL, o un dict de objetos Series.
Generalmente es el objeto de pandas más utilizado.
Junto con los datos, puede pasar opcionalmente argumentos de índice
(etiquetas de fila) y columnas (etiquetas de columna).
Si pasa un índice y / o columnas, está garantizando el índice y / o columnas del DataFrame resultante.
Por lo tanto, un dict de Serie más un índice específico descartará
todos los datos que no coincidan con el índice pasado.
Si no se pasan las etiquetas de los ejes, se construirán a partir de los datos de entrada
basándose en reglas de sentido común.
En Windows debemos tener en cuenta la sintaxis, los signos / (diagonal o barra) y
\ slash (diagonal inversa o barra inversa) tienen significados y usos diferentes en Jupyter.
Las siguientes rutas o paths pueden resultar correctos:
El index (etiquetas de fila) del DataFrame. Recupere las etiquetas de índice.
Out[n]: RangeIndex(start=0, stop=5, step=1)
Si deseamos ver los valores de una columna basta con indicar a través de la notación de punto
el nombre de la columna, ya que es un atributo del dataframe.
Obtiene un rango de filas desde el limite inferior y hasta el limite superior.
Recuerde que el índice inicia en 0
Obtener filas por condiciones
Obtener filas por funciones con condiciones
pandas.isna
Detecta valores faltantes para un objeto tipo matriz.
Esta función toma un objeto escalar o similar a una matriz e indica si faltan valores
(NaN (Not a Number) en matrices numéricas,
Ninguno o NaN en matrices de objetos, NaT (Not a Time) en datetimelike).
Elimina filas o columnasespecificando los nombres de las etiquetas y el eje correspondiente,
o especificando directamente los nombres de índice o columna.
Cuando se utiliza un índice múltiple, las etiquetas de diferentes niveles se pueden eliminar especificando el nivel.
NOTA 1: Si no especifica axis se genera un error, es necesario indicar de que eje se quiere eliminar.
NOTA 2: Para afectar el dataframe con esta función, sera necesario entonces asignar el resultado a la variable dataframe
Otra manera es usar el parámetro inplace = True
Para eliminar una columna puede usar df.drop(índice)
Para eliminar más de una columna puede usar df.drop( range(start, stop[, step]) )
El siguiente ejemplo elimina los pares incluso el 10.
NOTA: Recuerde el uso de asignar a la variable dataframe el resultado.
Lee un archivo de Excel en un DataFrame de pandas.
Admite extensiones de archivo xls, xlsx, xlsm, xlsb, odf, ods y odt
leídas desde un sistema de archivos local o URL.
Muestra todas las columnas del dataframe con las filas agrupadas por la columna Country:
Es necesario señalar que el orden en el cual se lista más de una columna en groupby
cambia el sentido de la lectura y la información que deseamos obtener:
Las estadísticas descriptivas incluyen aquellas que resumen la
tendencia central,
la dispersión y
la forma de la distribución de un conjunto de datos
, excluyendo los valores de NaN.
Analiza series numéricas y de objetos, así como conjuntos de columnas DataFrame de tipos de datos mixtos. La salida variará según lo que se proporcione. Consulte las notas a continuación para obtener más detalles.
La salida agrupa por Country, que forma parte de las columnas y
las columnas de describe() son count, mean, std, min, 25%, 50%, 75% (cuartiles), max.
El paquete fundamental para la informática científica con Python (numpy.org/install)
Distribución de Anaconda: incluye Python, NumPy y muchos otros paquetes de uso común para la informática científica y la ciencia de datos.
NumPy es el paquete fundamental para la computación científica en Python.
Es una biblioteca de Python que
proporciona un objeto de matriz multidimensional,
varios objetos derivados (como matrices y matrices enmascaradas) y
una variedad de rutinas para operaciones rápidas en matrices,
que incluyen manipulación matemática, lógica, de formas, clasificación, selección, E/S,
transformadas discretas de Fourier, álgebra lineal básica, operaciones estadísticas básicas, simulación aleatoria y mucho más.
En el núcleo del paquete NumPy , está el objeto ndarray.
Esto encapsula matrices n-dimensionales de tipos de datos homogéneos,
con muchas operaciones que se realizan en código compilado para el rendimiento.
Existen varias diferencias importantes entre las matrices NumPy y las secuencias estándar de Python
NumPy es una biblioteca
para el lenguaje de programación Python
que da soporte para crear vectores y matrices grandes multidimensionales,
junto con una gran colección de funciones matemáticas de alto nivel para operar con ellas.
El precursor de NumPy, Numeric, fue creado originalmente por Jim Hugunin
con contribuciones de varios otros desarrolladores.
En 2005, Travis Oliphant creó NumPy incorporando características de la competencia Numarray en Numeric,
con amplias modificaciones.
NumPy es un software de código abierto y cuenta con muchos colaboradores.
ndarray unidimensional con etiquetas de eje (incluidas series de tiempo).
Las etiquetas no necesitan ser únicas, pero deben ser de tipo hashtable.
El objeto admite la indexación basada tanto en números enteros como en etiquetas y
proporciona una serie de métodos para realizar operaciones relacionadas con el índice.
Los métodos estadísticos de ndarray
se han anulado para excluir automáticamente los datos faltantes (actualmente representados como NaN).
Un objeto de matriz representa una matriz homogénea y multidimensionalde elementos de tamaño fijo.
Un objeto de tipo de datos asociado describe el formato de cada elemento en el array
(su orden de bytes, cuántos bytes ocupa en la memoria, si es un entero, un número de coma flotante u otra cosa, etc.)
En probabilidad y estadística, la correlación
indica la fuerza y
la dirección de
una relación lineal y proporcionalidadentre dos variables estadísticas cuantitativas.
Se considera que
dos variables cuantitativas están correlacionadas cuandolos valores de una de ellas varían sistemáticamente con respecto a los valores homónimos de la otra:
si tenemos dos variables (A y B)
existe correlación entre ellas
si al disminuir los valores de Alo hacen también los de B y viceversa.
La correlación entre dos variables no implica,
por sí misma,
ninguna relación de causalidad.
¿Y cómo se hace esto en Python?
Recordemos que para eso se crean las bibliotecas, funciones, paquetes, etc.
Matplotlib es una biblioteca completa para
crear visualizaciones estáticas, animadas e interactivas en Python.
Matplotlib es una biblioteca
para la generación de gráficos a partir de datos contenidos en listas o arrays
en el lenguaje de programación Python y su extensión matemática NumPy.
Proporciona una API, pylab, diseñada para recordar a la de MATLAB
que es un sistema de cómputo numérico que ofrece un entorno de desarrollo integrado con un lenguaje de programación propio.
Seaborn es una biblioteca de
visualización de datos de Python basada en matplotlib.
Proporciona una interfaz de alto nivel para dibujar gráficos estadísticos atractivos e informativos.
Seaborn es una biblioteca para hacer gráficos estadísticos en Python.
Se basa en matplotlib y se integra estrechamente con las estructuras de datos de pandas.
Seaborn le ayuda a explorar y comprender sus datos.
Sus funciones de trazado operan en marcos de datos y matrices que contienen conjuntos de datos completos y
realizan internamente el mapeo semántico y la agregación estadística necesarios
para producir gráficos informativos.
Su API declarativa y orientada a conjuntos de datos le permite centrarse en
lo que significan los diferentes elementos de sus gráficos, en lugar de en los detalles de cómo dibujarlos.
Machine learning es una forma de la IA que
permite a un sistema aprender de los datos
en lugar de aprender mediante la programación explícita.
Sin embargo, machine learning no es un proceso sencillo.
Conforme el algoritmo ingiere datos de entrenamiento,
es posible producir modelos más precisos basados en datos.
Un modelo de machine learning es la
salida de información que se genera cuando entrena su algoritmo de machine learning con datos.
Después del entrenamiento, al proporcionar un modelo con una entrada, se le dará una salida.
Por ejemplo, un algoritmo predictivo creará un modelo predictivo.
A continuación, cuando proporcione el modelo predictivo con datos,
recibirá un pronóstico basado en los datos que entrenaron al modelo.
En aprendizaje automático y minería de datos, el aprendizaje supervisado es una
técnica para deducir una función a partir de datos de entrenamiento.
Los datos de entrenamiento consisten de pares de objetos:
una componente del par son los datos de entrada y el otro, los resultados deseados.
El aprendizaje supervisado comienza típicamente con un conjunto establecido de datos y
una cierta comprensión de cómo se clasifican estos datos.
El aprendizaje supervisado tiene la intención de
encontrar patrones en datos que se pueden aplicar a un proceso de analítica.
Estos datos tienen características etiquetadas que definen el significado de los datos.
Por ejemplo, se puede crear una aplicación de machine learning con base en imágenes y
descripciones escritas que distinga entre millones de animales.
El objetivo del aprendizaje supervisado es el de
crear una función capaz de predecir el valor correspondiente
a cualquier objeto de entrada válida después de haber visto una serie de ejemplos, los datos de entrenamiento.
Para ello, tiene que generalizar a partir de los datos presentados a las situaciones no vistas previamente
El aprendizaje no supervisado se utiliza cuando el problema requiere una cantidad masiva de datos sin etiquetar.
Por ejemplo, las aplicaciones de redes sociales, tales como Twitter, Instagram y Snapchat,
tienen grandes cantidades de datos sin etiquetar.
La comprensión del significado detrás de estos datos requiere algoritmos que
clasifican los datos con base en los patrones o clústeres que encuentra.
El aprendizaje no supervisado lleva a cabo un proceso iterativo,
analizando los datos sin intervención humana.
Se utiliza con la tecnología de detección de spam en e-mails.
Existen demasiadas variables en los e-mails legítimos y de spam para que un analista etiquete una cantidad masiva
de e-mail no solicitado.
En su lugar, los clasificadores de machine learning, basados en clustering y asociación,
se aplican para identificar e-mail no deseado.
El deep learning es un método específico de machine learning que
incorpora las redes neuronales en capas sucesivas para aprender de los datos de manera iterativa.
El deep learning es especialmente útil cuando se trata de aprender patrones de datos no estructurados.
Las redes neuronales complejas de deep learning están diseñadaspara emular cómo funciona el cerebro humano,
así que las computadoras pueden ser entrenadas para lidiar con abstracciones y problemas mal definidos.
Las redes neuronales y el deep learning se utilizan a menudo en el reconocimiento de imágenes,
voz y aplicaciones de visión de computadora.
Machine learning requiere que el correcto conjunto de datos se aplique a un proceso de aprendizaje.
Una organización no necesita de big data para utilizar las técnicas del machine learning;
sin embargo, el big data puede ayudar a mejorar la precisión de los modelos de machine learning.
Con big data, ahora
es posible virtualizar los datos para que se puedan almacenar de la forma más eficiente y
eficaz en función de los costos, ya sea en el entorno local o en la nube.
Además, las mejoras en la velocidad y confiabilidad en la red
han eliminado otras limitaciones físicas asociadas con la
gestión de cantidades masivas de datos a una velocidad aceptable.
Añada a esto el impacto de los cambios en el precio y la sofisticación de la memoria de computadora y
ahora es posible imaginar cómo las compañías pueden aprovechar
los datos de formas que hubieran sido inconcebibles hace sólo cinco años.
La ventaja de machine learning es que es posible aprovechar algoritmos y modelos para predecir resultados.
Es importante asegurarse de que los científicos de datos que realizan el trabajo
usen los algoritmos correctos, asimilando los datos más apropiados (que sean precisos y limpios) y
utilizando los mejores modelos de rendimiento.
Si todos estos elementos se reúnen, es posible entrenar continuamente al modelo y
explotar los resultados aprendiendo de los datos.
La automatización de este proceso de modelado, entrenamiento del modelo y
pruebas conduce a predicciones precisas para dar soporte a los cambios empresariales.