Phyton 2
Phyton 2
Grupo: 4MSC2
PHYTON ESENTIALS 2
Modulo 1
1.1 El código en Python permite importar módulos de varias maneras. Puedes importar un módulo
completo usando la declaración import nombre_del_módulo, importar múltiples módulos en
una sola línea, aunque se prefiere hacerlo de manera detallada. Si importas un módulo
completo, debes usar la notación de punto para acceder a sus entidades, como funciones o
variables. También puedes importar entidades individuales de un módulo, pero esto puede
causar conflictos de nombres en tu código. La forma menos recomendada es importar todas
las entidades de un módulo con from my_module import *, ya que esto aumenta el riesgo de
conflictos de nombres. Además, puedes cambiar el nombre de las entidades importadas en el
proceso utilizando la palabra clave as.
1.2 La función dir() puede proporcionar una lista de las entidades dentro de un módulo importado,
como se muestra en el ejemplo con el módulo os. El módulo math ofrece más de 50 funciones
y constantes para operaciones matemáticas, mientras que el módulo random proporciona más
de 60 entidades para trabajar con números pseudoaleatorios. Además, el módulo platform
contiene alrededor de 70 funciones que permiten explorar las capas subyacentes del sistema
operativo y hardware, brindando información sobre el entorno de ejecución del código.
1.3 Un módulo agrupa entidades relacionadas, mientras que un paquete es un contenedor que
acopla varios módulos bajo un mismo nombre, pudiendo ser distribuido como archivos o
empaquetado en un archivo zip.
Durante la primera importación de un módulo, Python traduce su código fuente a archivos
semi-compilados almacenados en pycache para mejorar el rendimiento.
Para indicar que una entidad en un módulo debe tratarse como privada, se puede marcar su
nombre con el prefijo _ o __, aunque esto es una recomendación y no una orden.
El dígrafo #! (shabang) se utiliza en sistemas Unix para indicar cómo se debe iniciar un archivo
fuente de Python, sin efecto en MS Windows.
Para que Python considere un directorio de un paquete no estándar, su nombre debe
agregarse a la lista de directorios de importación en la variable path de sys.
El archivo init.py en un paquete se ejecuta al importar, inicializando el paquete y sus
subpaquetes, aunque puede estar vacío, no debe faltar.
1.4 Para verificar la versión de pip, se pueden usar los comandos pip --version o pip3 --version,
dependiendo del entorno del sistema operativo.
Principales actividades de pip:
pip help operación_o_comando: Muestra una breve descripción de pip.
pip list: Muestra una lista de paquetes instalados.
pip show nombre_del_paquete: Muestra información, incluyendo dependencias, de un
paquete específico.
pip search cadena: Busca paquetes en PyPI cuyos nombres contienen la cadena.
pip install nombre: Instala un paquete en todo el sistema (puede requerir privilegios de
administrador).
pip install --user nombre: Instala un paquete solo para el usuario actual.
pip install -U nombre: Actualiza un paquete previamente instalado.
pip uninstall nombre: Desinstala un paquete previamente instalado.
Modulo 2
2.1 Las computadoras representan caracteres como números, y dos codificaciones populares son
ASCII (principalmente para el alfabeto latino) y UNICODE (capaz de codificar la mayoría de los
alfabetos humanos). El número que representa un carácter se denomina punto de código.
UNICODE utiliza diversas formas de codificación, como UCS-4 y UTF-8, siendo esta última la más
común debido a su eficiencia en el uso de espacio de memoria.
2.2 Las cadenas en Python son secuencias inmutables que pueden ser indexadas, divididas e
iteradas, y están sujetas a operadores como in y not in. Existen cadenas de una línea ('cadena') y
de varias líneas ('''cadena''' o """cadena""").
Las cadenas pueden concatenarse con el operador + y replicarse con el operador . Ejemplo:
(asterisk + plus) * 4 + asterisk produce la salida ++++.
Las funciones chr() y ord() permiten crear un carácter a partir de su punto de código y determinar
el punto de código correspondiente a un carácter. Las expresiones chr(ord(character)) == character
y ord(chr(codepoint)) == codepoint son siempre verdaderas.
Otras funciones aplicables a cadenas incluyen list() (crea una lista de caracteres), max() (encuentra
el carácter con el punto de código máximo) y min() (encuentra el carácter con el punto de código
mínimo).
2.3 Algunos de los métodos que ofrecen las cadenas son:
2. El contenido de las cadenas se puede determinar mediante los siguientes métodos (todos
devuelven valores booleanos):
La ordenación de listas de cadenas se puede realizar con la función sorted(), que crea una nueva
lista ordenada, o con el método sort(), que ordena la lista en el momento.
Una cadena puede convertirse en un número mediante las funciones int() o float(), pero la
conversión falla si la cadena no contiene un número válido, generando una excepción en ese caso.
2.5 Las cadenas son herramientas esenciales en el procesamiento de datos moderno, ya que la
mayoría de los datos útiles se presentan como cadenas. Por ejemplo, motores de búsqueda web
utilizan procesamiento de cadenas complejo para manejar grandes cantidades de datos.
La comparación de similitud acústica, que determina si dos cadenas suenan similares, se puede
realizar utilizando algoritmos como Soundex, especialmente útil para distintos idiomas o dialectos.
Debido a la limitada precisión de los datos enteros y flotantes, a veces es beneficioso almacenar y
procesar valores numéricos extensos como cadenas, técnica utilizada por Python cuando opera
con números enteros de gran longitud.
2.6 Una excepción es un evento anormal durante la ejecución del programa que debe manejarse
para evitar la terminación del mismo. El manejo de excepciones se realiza mediante bloques try-
except, donde el código riesgoso se coloca dentro del bloque try y cualquier excepción generada se
maneja en el bloque except.
Puedes manejar más de una excepción del mismo bloque try mediante múltiples bloques except,
cada uno etiquetado con un nombre diferente. En el mejor caso, solo se ejecuta uno de los bloques
except que coincida con la excepción generada.
No se puede agregar más de un bloque de excepción sin nombre después de los bloques con
nombre. En ese caso, un bloque except sin nombre debe colocarse después de los bloques con
nombre para manejar cualquier excepción no coincidente con los bloques anteriores.
2.7 No se pueden agregar más de un bloque except sin nombre después de los bloques con
nombre en una secuencia de manejo de excepciones.
Las excepciones predefinidas en Python forman una jerarquía, donde algunas son más generales
(como BaseException) y otras más específicas (por ejemplo, IndexError). Debes colocar
excepciones más generales antes que las más específicas en una secuencia de bloques except.
La sentencia raise NombreDeExcepción en Python puede generar una excepción bajo demanda.
Sin especificar un nombre, solo se puede usar dentro del bloque except y genera la misma
excepción que se está manejando actualmente.
La relación entre clases se llama herencia, donde una clase derivada es la subclase y la clase de la
que deriva es la superclase. Las relaciones se representan en un diagrama de herencia.
Para crear un objeto de una clase, se utiliza la clase como si fuera una función. Por ejemplo,
this_is_an_object = This_Is_A_Class().
3.2 Una pila es un objeto que sigue el modelo LIFO y realiza operaciones como push() y pop() para
almacenar y recuperar datos.
Un método de clase es una función dentro de una clase capaz de acceder a todos sus
componentes.
El constructor de una clase en Python se llama init y se utiliza para crear nuevos objetos.
Cada método de clase debe contener al menos un parámetro (generalmente llamado self) utilizado
por los objetos para identificarse.
Para ocultar componentes de una clase del mundo exterior, se utiliza el doble guion bajo (__), y
estos componentes se llaman privados.
3.3 Una variable de instancia es una propiedad cuya existencia depende de la creación de un
objeto y puede ser agregada o eliminada durante su vida útil. Se almacenan en un diccionario
llamado dict dentro de cada objeto.
Una variable de instancia puede ser privada si su nombre comienza con __, aunque aún es
accesible desde fuera de la clase con un nombre modificado.
Una variable de clase existe en una copia exacta y no requiere la creación de un objeto para ser
accesible. Se almacenan en un diccionario llamado dict dentro de cada clase.
La función hasattr() se utiliza para determinar si un objeto o clase contiene una propiedad
específica.
3.4 Un método es una función dentro de una clase, y el primer parámetro (generalmente llamado
self) identifica al objeto para el que se invoca el método.
Si una clase tiene un constructor (init), no puede devolver ningún valor y no se invoca
directamente.
Todas las clases (no los objetos) tienen propiedades especiales como name (nombre de la clase),
module (nombre del módulo en el que se declaró la clase) y bases (tupla con las superclases de la
clase). Estas propiedades se pueden acceder usando la notación de punto, por ejemplo,
Sample.__name__.
3.5 El método __str__() convierte el contenido de un objeto en una cadena legible, y se puede
redefinir para presentar el objeto de manera más elegante.
Los métodos, variables de instancia y de clase en una superclase se heredan automáticamente por
sus subclases.
Para encontrar propiedades de objeto/clase, Python las busca en el objeto mismo y todas las clases
involucradas en la línea de herencia, de abajo hacia arriba.
Si una subclase redefine un método, variable de clase o variable de instancia con el mismo nombre
que en la superclase, el nuevo nombre anula el anterior.
3.6 El bloque else: de la sentencia try se ejecuta cuando no ha habido ninguna excepción durante
la ejecución del bloque try.
Las clases de excepciones pueden extenderse para enriquecerlas con nuevas capacidades o para
adaptar sus características a excepciones recién definidas.
Código de ejemplo:
python
Copy code
try:
except:
else:
finally:
print("terminado")
La sentencia yield solo puede ser utilizada dentro de funciones y suspende la ejecución de la
función, devolviendo el argumento de yield como resultado. Se utiliza en funciones que actúan
como generadores.
Una lista por comprensión se convierte en un generador cuando se emplea dentro de paréntesis.
Puede ser usado para generar una lista o un generador.
La función map(fun, list) crea una copia de la lista y aplica la función a todos sus elementos,
devolviendo un generador.
La función filter(fun, list) crea una copia de aquellos elementos de la lista para los cuales la función
retorna True, devolviendo un generador.
Un cierre es una técnica que permite almacenar valores a pesar de que el contexto en el que han
sido creados no existe más. Se utiliza para encapsular valores en una función interna.
4.2 Un archivo debe ser abierto antes de procesarlo y cerrado cuando el procesamiento concluya.
La apertura del archivo se realiza asociándolo con un stream, que es una representación abstracta
de los datos físicos almacenados en los medios. Los modos de apertura incluyen lectura, escritura y
actualización.
Dependiendo del contenido del archivo físico, se pueden usar diferentes clases de Python para
procesar archivos. BufferedIOBase puede procesar cualquier archivo, mientras que TextIOBase es
especializado para archivos de texto, dividiendo el stream en binario y de texto.
La función open() se utiliza para abrir un archivo con la siguiente sintaxis: open(file_name,
mode=open_mode, encoding=text_encoding). Crea un objeto stream asociado al archivo,
utilizando el modo y la codificación especificados, o genera una excepción en caso de error.
Tres streams predefinidos ya están abiertos al iniciar el programa: sys.stdin (entrada estándar),
sys.stdout (salida estándar), y sys.stderr (salida de error estándar).
La excepción IOError, creada cuando una operación de archivo falla, contiene una propiedad errno
que almacena el código de finalización de la acción fallida, permitiendo diagnosticar el problema.
4.3 Métodos para leer el contenido de un archivo:
read(number): Lee el número de caracteres/bytes del archivo y los retorna como una cadena.
Capaz de leer todo el archivo a la vez.
readlines(número): Lee el número de líneas del archivo de texto; puede leer todas las líneas a la
vez.
readinto(bytearray): Lee los bytes del archivo y llena el bytearray con ellos.
El método open() devuelve un objeto iterable que se puede usar para recorrer todas las líneas del
archivo dentro de un bucle for. Por ejemplo:
python
Copy code
print(line, end='')
4.4 La función uname devuelve un objeto con información sobre el sistema operativo, incluyendo
atributos como systemname, nodename, release, version y machine.
El atributo name del módulo os permite distinguir el sistema operativo, devolviendo valores como
'posix' para Unix, 'nt' para Windows y 'java' para Jython.
listdir() devuelve una lista con los nombres de archivos y directorios en una ruta dada, omitiendo
las entradas '.' y '..'. Si no se proporciona la ruta, devuelve los elementos del directorio de trabajo
actual.
chdir() cambia el directorio de trabajo actual a la ruta especificada. getcwd() devuelve la ruta del
directorio de trabajo actual.
Para eliminar directorios, se puede usar rmdir() para un directorio y removedirs() para directorios y
subdirectorios.
4.5 Para crear un objeto date, se usan los argumentos de año, mes y día. El método today devuelve
un objeto que representa la fecha local actual.
En Unix, la marca de tiempo representa segundos desde el 1 de enero de 1970. Puedes crear un
objeto date a partir de una marca de tiempo usando fromtimestamp.
El constructor de la clase time acepta seis argumentos opcionales: hour, minute, second,
microsecond, tzinfo, y fold.
El módulo time contiene la función sleep, que suspende la ejecución del programa por un número
específico de segundos.
En el módulo datetime, puedes representar fecha y hora con objetos separados o combinados en
un solo objeto llamado datetime.
El método strftime formatea una fecha y hora según las directivas especificadas en una cadena
(por ejemplo, %Y para año, %m para mes).
Se pueden realizar cálculos en objetos date y datetime, obteniendo un objeto timedelta que
representa la diferencia entre dos fechas. Este objeto se puede usar para realizar más cálculos. Por
ejemplo, d1 - d2 devuelve la diferencia en días, horas, minutos y segundos.
4.6 1. En el módulo calendar, los días de la semana se muestran de lunes a domingo. Cada día de la
semana tiene su representación en forma de número entero, donde el primer día de la semana
(lunes) está representado por el valor 0, mientras que el último día de la semana (domingo) está
representado por el valor 6.
2. Para mostrar un calendario de cualquier año, se emplea la función calendar con el año pasado
como argumento, por ejemplo:
import calendar
print(calendar.calendar(2020))
Para mostrar un calendario de cualquier mes del año, se emplea la función month, pasándoleel
año y el mes. Por ejemplo:
import calendar
print(calendar.month(2020, 9)).
El resultado de la función weekday es un día de la semana como un valor entero para un año, mes
y día determinados:
import calendar
import calendar
Una función muy útil disponible en el módulo calendar es la función llamada isleap, que, como su
nombre indica, te permite comprobar si el año es bisiesto o no.
print("¡Hola mundo!")
Puedes crear un objeto calendar tu mismo usando la clase Calendar, que al crear el objeto, te
permite cambiar el primer día de la semana con el parámetro opcional firstweekday, por ejemplo:
import calendar
c = calendar.Calendar(2)
# Resultado: 2 3 4 5 6 0 1