Object Oriented Python
Object Oriented Python
Este capítulo habla sobre las características del lenguaje de programación Python que lo convierte en
un lenguaje de programación orientado a objetos.
Tipo de clase Fuerte C #, Java, Go, Python, Ruby, Clojure, Erlang, Haskell, Scala
No C, C ++, C #, Objetivo-C
gestionado
Orientado a objetos significa dirigido hacia objetos. En otras palabras, significa funcionalmente
dirigido a modelar objetos. Esta es una de las muchas técnicas utilizadas para modelar sistemas
complejos al describir una colección de objetos interactivos a través de sus datos y comportamiento.
Python, una programación orientada a objetos (OOP), es una forma de programación que se enfoca
en usar objetos y clases para diseñar y construir aplicaciones. Los principales pilares de la
programación orientada a objetos (OOP) son herencia, polimorfismo, abstracción y
encapsulación .
Python fue diseñado con un enfoque orientado a objetos. OOP ofrece las siguientes ventajas:
Proporciona una estructura de programa clara, que facilita el mapeo de problemas del mundo
real y sus soluciones.
Presenta un buen marco para bibliotecas de códigos donde los componentes suministrados
pueden ser fácilmente adaptados y modificados por el programador.
La tabla en la siguiente imagen muestra las principales diferencias entre el enfoque POP y OOP.
Especificadores
No cualquiera Público, privado y protegido
de acceso
Los datos pueden moverse libremente En Oops, los datos pueden moverse y
Movimiento de
de funciones a funciones en el sistema comunicarse entre sí a través de funciones
datos miembro
En pop, una forma tan específica de Proporciona ocultación de datos, mucho más
Ocultar datos
ocultar datos, un poco menos segura segura.
Idiomas de
C, VB, Fortran, Pascal C ++, Python, Java, C #
ejemplo
Encapsulación
Esta propiedad oculta detalles innecesarios y facilita la administración de la estructura del programa.
La implementación y el estado de cada objeto están ocultos detrás de límites bien definidos y eso
proporciona una interfaz limpia y simple para trabajar con ellos. Una forma de lograr esto es haciendo
que los datos sean privados.
Herencia
La herencia, también llamada generalización, nos permite capturar una relación jerárquica entre
clases y objetos. Por ejemplo, una 'fruta' es una generalización de 'naranja'. La herencia es muy útil
desde la perspectiva de reutilización de código.
Abstracción
Esta propiedad nos permite ocultar los detalles y exponer solo las características esenciales de un
concepto u objeto. Por ejemplo, una persona que conduce un scooter sabe que al presionar una
bocina, se emite sonido, pero no tiene idea de cómo se genera el sonido al presionar la bocina.
Polimorfismo
Polimorfismo significa muchas formas. Es decir, una cosa o acción está presente en diferentes formas
o formas. Un buen ejemplo de polimorfismo es la sobrecarga del constructor en las clases.
Recuerde que un diccionario es un par clave-valor . Eso significa que si tiene un diccionario con una
clave EmployeID y desea recuperarlo, deberá usar las siguientes líneas de código:
Ahora, puede acceder a las funciones o variables en ese módulo con el '.' (punto) Operador.
Considere un módulo llamado employee.py con una función llamada empleado . El código de la
función se da a continuación:
import employee
employee. EmployeID()
def EmployeID():
print (“Employee Unique Identity!”)
# just a variable
Age = “Employee age is **”
import employee
employee.EmployeID()
print(employee.Age)
Al comparar el módulo con un diccionario, ambos son similares, excepto con lo siguiente:
En el caso del diccionario , la clave es una cadena y la sintaxis es [clave].
El módulo es un diccionario especializado que puede almacenar código Python para que pueda
acceder a él con el '.' Operador. Una clase es una forma de tomar una agrupación de funciones y
datos y colocarlos dentro de un contenedor para que pueda acceder a ellos con el operador '.'.
Si tiene que crear una clase similar al módulo de empleado, puede hacerlo usando el siguiente
código:
class employee(object):
def __init__(self):
self. Age = “Employee Age is ##”
def EmployeID(self):
print (“This is just employee unique identity”)
Nota : las clases son preferibles a los módulos porque puede reutilizarlos como están y sin mucha
interferencia. Mientras que con los módulos, solo tiene uno con todo el programa.
Una clase es como un mini módulo y puede importar de manera similar a como lo hace para las
clases, utilizando el concepto llamado instanciar . Tenga en cuenta que cuando crea una instancia de
una clase, obtiene un objeto .
You can instantiate an object, similar to calling a class like a function, as shown −
# dictionary style
Employee[‘EmployeID’]
# module style
Employee.EmployeID()
Print(employee.Age)
# Class style
this_obj = employee()
this_obj.employeID()
Print(this_obj.Age)
This chapter will explain in detail about setting up the Python environment on your local computer.
Funciones de código
Instalando Python
Los siguientes pasos le muestran en detalle cómo instalar Python en su computadora local:
Paso 1 : vaya al sitio web oficial de Python https://www.python.org/ , haga clic en el menú
Descargas y elija la última versión o cualquier versión estable de su elección.
Paso 2 : guarde el archivo exe del instalador de Python que está descargando y, una vez que lo haya
descargado, ábralo. Haga clic en Ejecutar y elija la opción Siguiente de forma predeterminada y
finalice la instalación.
Paso 3 : después de haber instalado, ahora debería ver el menú de Python como se muestra en la
imagen a continuación. Inicie el programa eligiendo IDLE (Python GUI).
Esto iniciará el shell de Python. Escriba comandos simples para verificar la instalación.
Elegir un IDE
Nota : Eclipse IDE se usa principalmente en Java, sin embargo, tiene un complemento de Python.
Pycharm
Enlace de descarga
https://www.jetbrains.com/pycharm/download/#section=windows
Idiomas admitidos : Python, HTML, CSS, JavaScript, Coffee Script, TypeScript, Cython, AngularJS,
Node.js, lenguajes de plantilla.
Captura de pantalla
¿Por qué elegir?
IDE de Komodo
Enlace de descarga
Los enlaces de descarga para Komodo Edit (versión gratuita) y Komodo IDE (versión de pago) se
muestran aquí:
Potente IDE con soporte para Perl, PHP, Python, Ruby y muchos más.
IDE multiplataforma.
It includes basic features like integrated debugger support, auto complete, Document Object
Model(DOM) viewer, code browser, interactive shells, breakpoint configuration, code profiling,
integrated unit testing. In short, it is a professional IDE with a host of productivity-boosting features.
Why to Choose
Screenshot
Elegir un editor de texto
Es posible que no siempre necesite un IDE. Para tareas como aprender a codificar con Python o
Arduino, o cuando se trabaja en un script rápido en script de shell para ayudarlo a automatizar
algunas tareas, un editor de texto centrado en el código simple y liviano hará. Además, muchos
editores de texto ofrecen características como el resaltado de sintaxis y la ejecución de scripts en el
programa, similares a los IDE. Algunos de los editores de texto se dan aquí:
Átomo
Texto sublime
Notepad ++
Enlace de descarga
https://atom.io/
Captura de pantalla
Idiomas admitidos
C / C ++, C #, CSS, CoffeeScript, HTML, JavaScript, Java, JSON, Julia, Objective-C, PHP, Perl,
Python, Ruby on Rails, Ruby, script de Shell, Scala, SQL, XML, YAML y muchos más.
Captura de pantalla
Idioma soportado
Se abre rápidamente
Notepad ++
Es un editor de código fuente gratuito y un reemplazo de
Bloc de notas que admite varios idiomas desde
ensamblado a XML e incluye Python. Ejecutando en el
entorno de MS Windows, su uso se rige por la licencia
GPL. Además del resaltado de sintaxis, Notepad ++
tiene algunas características que son particularmente
útiles para los codificadores.
Captura de pantalla
Características clave
Idioma soportado
Casi todos los idiomas (más de 60 idiomas) como Python, C, C ++, C #, Java, etc.
Las estructuras de datos de Python son muy intuitivas desde el punto de vista de la sintaxis y ofrecen
una gran variedad de operaciones. Debe elegir la estructura de datos de Python en función de lo que
implican los datos, si es necesario modificarlos o si son datos fijos y qué tipo de acceso se requiere,
como al principio / final / aleatorio, etc.
Liza
Una lista representa el tipo de estructura de datos más versátil en Python. Una lista es un contenedor
que contiene valores separados por comas (elementos o elementos) entre corchetes. Las listas son
útiles cuando queremos trabajar con múltiples valores relacionados. Como las listas mantienen los
datos juntos, podemos realizar los mismos métodos y operaciones en múltiples valores a la vez. Los
índices de listas comienzan desde cero y, a diferencia de las cadenas, las listas son mutables.
Estructura de datos - Lista
>>>
>>> # Any Empty List
>>> empty_list = []
>>>
>>> # A list of String
>>> str_list = ['Life', 'Is', 'Beautiful']
>>> # A list of Integers
>>> int_list = [1, 4, 5, 9, 18]
>>>
>>> #Mixed items list
>>> mixed_list = ['This', 9, 'is', 18, 45.9, 'a', 54, 'mixed', 99, 'list']
>>> # To print the list
>>>
>>> print(empty_list)
[]
>>> print(str_list)
['Life', 'Is', 'Beautiful']
>>> print(type(str_list))
<class 'list'>
>>> print(int_list)
[1, 4, 5, 9, 18]
>>> print(mixed_list)
['This', 9, 'is', 18, 45.9, 'a', 54, 'mixed', 99, 'list']
>>> mixed_list = ['This', 9, 'is', 18, 45.9, 'a', 54, 'mixed', 99, 'list']
>>>
>>> # To access the First Item of the list
>>> mixed_list[0]
'This'
>>> # To access the 4th item
>>> mixed_list[3]
18
>>> # To access the last item of the list
>>> mixed_list[-1]
'list'
Objetos vacíos
Los objetos vacíos son los tipos integrados de Python más simples y básicos. Los hemos usado
varias veces sin darnos cuenta y lo hemos extendido a cada clase que hemos creado. El propósito
principal de escribir una clase vacía es bloquear algo por el momento y luego extenderlo y agregarle
un comportamiento.
Agregar un comportamiento a una clase significa reemplazar una estructura de datos con un objeto y
cambiar todas las referencias a él. Por lo tanto, es importante verificar los datos, ya sea un objeto
disfrazado, antes de crear algo. Observe el siguiente código para una mejor comprensión:
Entonces, desde arriba, podemos ver que no es posible establecer ningún atributo en un objeto que
se instancia directamente. Cuando Python permite que un objeto tenga atributos arbitrarios, se
necesita una cierta cantidad de memoria del sistema para realizar un seguimiento de los atributos que
tiene cada objeto, para almacenar tanto el nombre del atributo como su valor. Incluso si no se
almacenan atributos, se asigna una cierta cantidad de memoria para posibles nuevos atributos.
Por lo tanto, Python deshabilita las propiedades arbitrarias en el objeto y varios otros elementos
integrados, de forma predeterminada.
Por lo tanto, si queremos agrupar las propiedades, podríamos almacenarlas en un objeto vacío como
se muestra en el código anterior. Sin embargo, este método no siempre se sugiere. Recuerde que las
clases y los objetos solo deben usarse cuando desea especificar datos y comportamientos.
Tuplas
Las tuplas son similares a las listas y pueden almacenar elementos. Sin embargo, son inmutables, por
lo que no podemos agregar, eliminar o reemplazar objetos. Los principales beneficios que brinda la
tupla debido a su inmutabilidad es que podemos usarlos como claves en los diccionarios, o en otras
ubicaciones donde un objeto requiere un valor hash.
Las tuplas se usan para almacenar datos y no comportamientos. En caso de que requiera un
comportamiento para manipular una tupla, debe pasar la tupla a una función (o método en otro objeto)
que realice la acción.
Como la tupla puede actuar como una clave de diccionario, los valores almacenados son diferentes
entre sí. Podemos crear una tupla separando los valores con una coma. Las tuplas están entre
paréntesis pero no son obligatorias. El siguiente código muestra dos tareas idénticas.
Las tuplas son muy similares a la lista, excepto que todo el conjunto de elementos está encerrado
entre paréntesis en lugar de corchetes.
Al igual que cuando corta una lista, obtiene una nueva lista y cuando corta una tupla, obtiene una
nueva tupla.
>>> tupl
('Tuple', 'is', 'an', 'IMMUTABLE', 'list')
>>> tupl.append('new')
Traceback (most recent call last):
File "<pyshell#148>", line 1, in <module>
tupl.append('new')
AttributeError: 'tuple' object has no attribute 'append'
>>> tupl.remove('is')
Traceback (most recent call last):
File "<pyshell#149>", line 1, in <module>
tupl.remove('is')
AttributeError: 'tuple' object has no attribute 'remove'
>>> tupl.index('list')
4
>>> tupl.index('new')
Traceback (most recent call last):
File "<pyshell#151>", line 1, in <module>
tupl.index('new')
ValueError: tuple.index(x): x not in tuple
>>> "is" in tupl
True
>>> tupl.count('is')
1
Del código que se muestra arriba, podemos entender que las tuplas son inmutables y, por lo tanto,
No puede agregar elementos a una tupla.
No puede agregar o extender un método.
No puede eliminar elementos de una tupla.
Diccionario
El diccionario es uno de los tipos de datos integrados de Python y define las relaciones uno a uno
entre claves y valores.
Definición de diccionarios
Observe the following code to understand about mixing data types in a dictionary −
Observe the following code to understand about deleting items from a dictionary −
Conjuntos
Set () es una colección desordenada sin elementos duplicados. Aunque los elementos individuales
son inmutables, el conjunto en sí es mutable, es decir, podemos agregar o eliminar elementos /
elementos del conjunto. Podemos realizar operaciones matemáticas como unión, intersección, etc.
con set.
Aunque los conjuntos en general se pueden implementar usando árboles, el conjunto en Python se
puede implementar usando una tabla hash. Esto le permite un método altamente optimizado para
verificar si un elemento específico está contenido en el conjunto
Crear un conjunto
Un conjunto se crea colocando todos los elementos (elementos) dentro de llaves {} , separadas por
comas o utilizando la función integrada set () . Observe las siguientes líneas de código:
En este capítulo, discutiremos en detalle los términos orientados a objetos y los conceptos de
programación. Class es solo una fábrica para una instancia. Esta fábrica contiene el plan que
describe cómo hacer las instancias. Se crean instancias u objetos a partir de la clase. En la mayoría
de los casos, podemos tener más de una instancia de una clase. Cada instancia tiene un conjunto de
atributos y estos atributos se definen en una clase, por lo que se espera que cada instancia de una
clase en particular tenga los mismos atributos.
In Python, creating a method defines a class behavior. The word method is the OOP name given to a
function that is defined within a class. To sum up −
Class functions − is synonym for methods
Class variables − is synonym for name attributes.
Clase : un plano para una instancia con comportamiento exacto.
Objeto : una de las instancias de la clase, realiza la funcionalidad definida en la clase.
Tipo : indica la clase a la que pertenece la instancia
Creación e instanciación
El siguiente código muestra cómo crear nuestra primera clase y luego su instancia.
class MyClass(object):
pass
# Create first instance of MyClass
this_obj = MyClass()
print(this_obj)
# Another instance of MyClass
that_obj = MyClass()
print (that_obj)
Aquí hemos creado una clase llamada MyClass y que no realiza ninguna tarea. El objeto de
argumento en la clase MyClass implica herencia de clase y se discutirá en capítulos posteriores.
pasar el código anterior indica que este bloque está vacío, es decir, es una definición de clase vacía.
Vamos a crear una instancia this_obj de la clase MyClass () e imprimirla como se muestra:
Aquí, hemos creado una instancia de MyClass. El código hexadecimal se refiere a la dirección donde
se almacena el objeto. Otra instancia apunta a otra dirección.
Ahora definamos una variable dentro de la clase MyClass () y obtengamos la variable de la instancia
de esa clase como se muestra en el siguiente código:
class MyClass(object):
var = 9
that_obj = MyClass()
print (that_obj.var)
Salida
9
9
Como la instancia sabe de qué clase se instancia, entonces cuando se solicita un atributo de una
instancia, la instancia busca el atributo y la clase. Esto se llama la búsqueda de atributos.
Métodos de instancia
Una función definida en una clase se llama método. Un método de instancia requiere una instancia
para llamarlo y no requiere decorador. Al crear un método de instancia, el primer parámetro siempre
es self. Aunque podemos llamarlo (self) con cualquier otro nombre, se recomienda usar self, ya que
es una convención de nomenclatura.
class MyClass(object):
var = 9
def firstM(self):
print("hello, World")
obj = MyClass()
print(obj.var)
obj.firstM()
Salida
9
hello, World
Tenga en cuenta que en el programa anterior, definimos un método con self como argumento. Pero no
podemos llamar al método ya que no le hemos declarado ningún argumento.
class MyClass(object):
def firstM(self):
print("hello, World")
print(self)
obj = MyClass()
obj.firstM()
print(obj)
Salida
hello, World
<__main__.MyClass object at 0x036A8E10>
<__main__.MyClass object at 0x036A8E10>
Encapsulación
La encapsulación es uno de los fundamentos de OOP. OOP nos permite ocultar la complejidad del
funcionamiento interno del objeto que es ventajoso para el desarrollador de las siguientes maneras:
Simplifica y facilita la comprensión del uso de un objeto sin conocer los elementos internos.
Cualquier cambio puede ser fácilmente manejable.
class MyClass(object):
def setAge(self, num):
self.age = num
def getAge(self):
return self.age
zack = MyClass()
zack.setAge(45)
print(zack.getAge())
zack.setAge("Fourty Five")
print(zack.getAge())
Salida
45
Fourty Five
Los datos deben almacenarse solo si son correctos y válidos, utilizando construcciones de manejo de
excepciones. Como podemos ver arriba, no hay restricción en la entrada del usuario al método
setAge (). Puede ser una cadena, un número o una lista. Por lo tanto, debemos verificar el código
anterior para garantizar la exactitud del almacenamiento.
class MyClass(object):
def setAge(self, num):
self.age = num
def getAge(self):
return self.age
zack = MyClass()
zack.setAge(45)
print(zack.getAge())
zack.setAge("Fourty Five")
print(zack.getAge())
Init Constructor
El método __ init __ se llama implícitamente tan pronto como se instancia un objeto de una clase.
Esto inicializará el objeto.
x = MyClass()
The line of code shown above will create a new instance and assigns this object to the local variable x.
The instantiation operation, that is calling a class object, creates an empty object. Many classes like
to create objects with instances customized to a specific initial state. Therefore, a class may define a
special method named ‘ __init__() ‘ as shown −
def __init__(self):
self.data = []
Python calls __init__ during the instantiation to define an additional attribute that should occur when a
class is instantiated that may be setting up some beginning values for that object or running a routine
required on instantiation. So in this example, a new, initialized instance can be obtained by −
x = MyClass()
El método __init __ () puede tener argumentos únicos o múltiples para una mayor flexibilidad. El init
significa inicialización, ya que inicializa los atributos de la instancia. Se llama el constructor de una
clase.
class myclass(object):
def __init__(self,aaa, bbb):
self.a = aaa
self.b = bbb
x = myclass(4.5, 3)
print(x.a, x.b)
Salida
4.5 3
Atributos de clase
El atributo definido en la clase se denomina "atributos de clase" y los atributos definidos en la función
se denominan "atributos de instancia". Mientras se definen, estos atributos no tienen el prefijo self, ya
que son propiedad de la clase y no de una instancia en particular.
>>> print(dd.classy)
class value
>>>
Estamos anulando el atributo de clase 'con clase' en la instancia dd. Cuando se anula, el intérprete de
Python lee el valor anulado. Pero una vez que el nuevo valor se elimina con 'del', el valor anulado ya
no está presente en la instancia y, por lo tanto, la búsqueda sube un nivel y se obtiene de la clase.
En esta sección, comprendamos cómo se relacionan los datos de la clase con los datos de la
instancia. Podemos almacenar datos en una clase o en una instancia. Cuando diseñamos una clase,
decidimos qué datos pertenecen a la instancia y qué datos deben almacenarse en la clase general.
Una instancia puede acceder a los datos de la clase. Si creamos varias instancias, estas instancias
pueden acceder a sus valores de atributo individuales así como a los datos generales de la clase.
Por lo tanto, los datos de una clase son los datos que se comparten entre todas las instancias.
Observe el código que figura a continuación para una mejor comprensión:
class InstanceCounter(object):
count = 0 # class attribute, will be accessible to all instances
def __init__(self, val):
self.val = val
InstanceCounter.count +=1 # Increment the value of class attribute, accessible through
# In above line, class ('InstanceCounter') act as an object
def set_val(self, newval):
self.val = newval
def get_val(self):
return self.val
def get_count(self):
return InstanceCounter.count
a = InstanceCounter(9)
b = InstanceCounter(18)
c = InstanceCounter(27)
Salida
val of obj: 9
count: 3
val of obj: 18
count: 3
val of obj: 27
count: 3
En resumen, los atributos de clase son los mismos para todas las instancias de clase, mientras que
los atributos de instancia son particulares para cada instancia. Para dos instancias diferentes,
tendremos dos atributos de instancia diferentes.
class myClass:
class_attribute = 99
def class_method(self):
self.instance_attribute = 'I am instance attribute'
print (myClass.__dict__)
Salida
>>> a = myClass()
>>> a.class_method()
>>> print(a.__dict__)
{'instance_attribute': 'I am instance attribute'}
Este capítulo habla en detalle sobre varias funciones integradas en Python, operaciones de E / S de
archivos y conceptos de sobrecarga.
Funciones integradas de Python
El intérprete de Python tiene una serie de funciones llamadas funciones integradas que están
fácilmente disponibles para su uso. En su última versión, Python contiene 68 funciones integradas
que se enumeran en la tabla a continuación:
FUNCIONES INTEGRADAS
función len ()
La función len () obtiene la longitud de cadenas, listas o colecciones. Devuelve la longitud o el número
de elementos de un objeto, donde el objeto puede ser una cadena, una lista o una colección.
La función len () funciona internamente como list .__ len __ () o tuple .__ len __ () . Por lo tanto,
tenga en cuenta que len () funciona solo en objetos que tienen un método __ len __ () .
>>> set1
{1, 2, 3, 4}
>>> set1.__len__()
4
Sin embargo, en la práctica, preferimos len () en lugar de la función __len __ () debido a las
siguientes razones:
Invertido (seq)
Devuelve el iterador inverso. seq debe ser un objeto que tenga el método __ invertido __ () o que
admita el protocolo de secuencia (el método __len __ () y el método __getitem __ ()). Generalmente
se usa para bucles cuando queremos recorrer los elementos de atrás hacia adelante.
El bucle for al final imprime la lista invertida de una lista normal y las instancias de las dos secuencias
personalizadas. El resultado muestra que reverse () funciona en los tres, pero tiene resultados muy
diferentes cuando definimos __reversed__ .
Salida
list: 9, 7, 5, 4, 2,
CustomSequence: x4, x3, x2, x1, x0,
funkyback: b, a, c, k, w, a, r, d, s, !,
Enumerar
enumerate(iterable, start = 0)
Aquí el inicio del segundo argumento es opcional, y por defecto el índice comienza con cero (0).
>>> # Enumerate
>>> names = ['Rajesh', 'Rahul', 'Aarav', 'Sahil', 'Trevor']
>>> enumerate(names)
<enumerate object at 0x031D9F80>
>>> list(enumerate(names))
[(0, 'Rajesh'), (1, 'Rahul'), (2, 'Aarav'), (3, 'Sahil'), (4, 'Trevor')]
>>>
Entonces enumerate () devuelve un iterador que produce una tupla que mantiene el recuento de los
elementos en la secuencia pasada. Dado que el valor de retorno es un iterador, acceder directamente
a él no es muy útil. Un mejor enfoque para enumerate () es mantener el conteo dentro de un ciclo for.
Hay muchas otras funciones en la biblioteca estándar, y aquí hay otra lista de algunas funciones más
utilizadas:
hasattr, getattr, setattr y delattr, que permiten que los atributos de un objeto sean
manipulados por sus nombres de cadena.
all and any, que aceptan un objeto iterable y devuelven True si todos o alguno de los
elementos se evalúan como verdaderos.
nzip, que toma dos o más secuencias y devuelve una nueva secuencia de tuplas, donde
cada tupla contiene un solo valor de cada secuencia.
E / S de archivo
El concepto de archivos está asociado con el término programación orientada a objetos. Python ha
incluido la interfaz que los sistemas operativos proporcionan en abstracción que nos permite trabajar
con objetos de archivo.
La función incorporada open () se utiliza para abrir un archivo y devolver un objeto de archivo. Es la
función más utilizada con dos argumentos:
open(filename, mode)
La función open () llama a dos argumentos, primero es el nombre del archivo y el segundo es el
modo. Aquí el modo puede ser 'r' para el modo de solo lectura, 'w' para solo escribir (se borrará un
archivo existente con el mismo nombre) y 'a' abre el archivo para agregarlo, cualquier dato escrito en
el archivo se agrega automáticamente hasta el final. 'r +' abre el archivo para leer y escribir. El modo
predeterminado es de solo lectura.
En Windows, 'b' agregado al modo abre el archivo en modo binario, por lo que también hay modos
como 'rb', 'wb' y 'r + b'.
En algunos casos, solo queremos agregar al archivo existente en lugar de sobrescribirlo, para eso
podríamos proporcionar el valor 'a' como argumento de modo, para agregar al final del archivo, en
lugar de sobrescribir completamente el archivo existente contenido.
>>> f = open('datawork','a')
>>> text1 = ' This is second line'
>>> f.write(text1)
20
>>> f.close()
Una vez que se abre un archivo para leer, podemos llamar al método read, readline o readlines para
obtener el contenido del archivo. El método de lectura devuelve todo el contenido del archivo como un
objeto str o bytes, dependiendo de si el segundo argumento es 'b'.
Para facilitar la lectura y evitar leer un archivo grande de una vez, a menudo es mejor usar un bucle
for directamente en un objeto de archivo. Para los archivos de texto, leerá cada línea, una a la vez, y
podemos procesarla dentro del cuerpo del bucle. Sin embargo, para archivos binarios es mejor leer
fragmentos de datos de tamaño fijo utilizando el método read (), pasando un parámetro para la
cantidad máxima de bytes a leer.
>>> f = open('fileone','r+')
>>> f.readline()
'This is the first line. \n'
>>> f.readline()
'This is the second line. \n'
Al escribir en un archivo, a través del método de escritura en objetos de archivo, se escribirá un objeto
de cadena (bytes para datos binarios) en el archivo. El método de líneas de escritura acepta una
secuencia de cadenas y escribe cada uno de los valores iterados en el archivo. El método de líneas
de escritura no agrega una nueva línea después de cada elemento de la secuencia.
Finalmente, se debe llamar al método close () cuando hayamos terminado de leer o escribir el
archivo, para garantizar que las escrituras almacenadas en el búfer se escriban en el disco, que el
archivo se haya limpiado correctamente y que todos los recursos vinculados al archivo se vuelvan a
liberar El sistema operativo. Es un mejor enfoque llamar al método close (), pero técnicamente esto
sucederá automáticamente cuando exista el script.
La sobrecarga de métodos se refiere a tener múltiples métodos con el mismo nombre que aceptan
diferentes conjuntos de argumentos.
Dado un único método o función, podemos especificar el número de parámetros nosotros mismos.
Dependiendo de la definición de la función, se puede llamar con cero, uno, dos o más parámetros.
class Human:
def sayHello(self, name = None):
if name is not None:
print('Hello ' + name)
else:
print('Hello ')
#Create Instance
obj = Human()
Salida
Hello
Hello Rahul
Argumentos predeterminados
Un objeto invocable es un objeto que puede aceptar algunos argumentos y posiblemente devolverá
un objeto. Una función es el objeto invocable más simple en Python, pero también hay otros como
clases o ciertas instancias de clase.
Cada función en un Python es un objeto. Los objetos pueden contener métodos o funciones, pero el
objeto no es necesariamente una función.
def my_func():
print('My function was called')
my_func.description = 'A silly function'
def second_func():
def another_func(func):
print("The description:", end=" ")
print(func.description)
print('The name: ', end=' ')
print(func.__name__)
print('The class:', end=' ')
print(func.__class__)
print("Now I'll call the function passed in")
func()
another_func(my_func)
another_func(second_func)
En el código anterior, podemos pasar dos funciones diferentes como argumento a nuestra tercera
función y obtener diferentes resultados para cada una:
objetos invocables
Así como las funciones son objetos que pueden tener atributos establecidos en ellas, es posible crear
un objeto al que se pueda llamar como si fuera una función.
En Python, cualquier objeto con un método __call __ () puede llamarse utilizando la sintaxis de
llamada a función.
Herencia y polimorfismo
Herencia y polimorfismo: este es un concepto muy importante en Python. Debes entenderlo mejor si
quieres aprender.
Herencia
Heredar atributos
Ahora mira el siguiente ejemplo:
Salida
Primero creamos una clase llamada Fecha y pasamos el objeto como argumento, aquí-objeto es una
clase incorporada proporcionada por Python. Más tarde creamos otra clase llamada time y llamamos
a la clase Date como argumento. A través de esta llamada, tenemos acceso a todos los datos y
atributos de la clase Fecha en la clase Hora. Por eso, cuando intentamos obtener el método get_date
del objeto de clase Time tm que creamos antes posible.
Objeto Jerarquía de búsqueda de atributos
La instancia
La clase
Cualquier clase de la cual esta clase hereda
Ejemplos de herencia
En Python, el constructor de clase utilizado para crear un objeto (instancia) y asignar el valor de los
atributos.
Salida
En el ejemplo anterior, vemos los atributos o métodos de comando que colocamos en la clase
primaria para que todas las subclases o clases secundarias hereden esa propiedad de la clase
primaria.
Si una subclase intenta heredar métodos o datos de otra subclase, entonces se producirá un error,
como vemos cuando la clase Dog intenta llamar a los métodos swatstring () de esa clase cat, arroja
un error (como AttributeError en nuestro caso).
Esto permite que las funciones usen objetos de cualquiera de estas clases polimórficas sin necesidad
de conocer las distinciones entre las clases.
El polimorfismo se puede llevar a cabo mediante herencia, con subclases que utilizan métodos de
clase base o los anulan.
Dejemos entender el concepto de polimorfismo con nuestro ejemplo de herencia anterior y
agreguemos un método común llamado show_affection en ambas subclases:
A partir del ejemplo que podemos ver, se refiere a un diseño en el que un objeto de tipo diferente
puede tratarse de la misma manera o más específicamente dos o más clases con un método del
mismo nombre o una interfaz común porque el mismo método (show_affection en el siguiente
ejemplo) se llama con cualquier tipo de objetos.
Salida
Entonces, todos los animales muestran afecto (show_affection), pero lo hacen de manera diferente. El
comportamiento de "show_affection" es, por lo tanto, polimórfico en el sentido de que actuó de
manera diferente dependiendo del animal. Por lo tanto, el concepto abstracto de "animal" en realidad
no "show_affection", pero los animales específicos (como perros y gatos) tienen una implementación
concreta de la acción "show_affection".
Python en sí tiene clases que son polimórficas. Por ejemplo, la función len () se puede usar con varios
objetos y todos devuelven la salida correcta en función del parámetro de entrada.
Primordial
En Python, cuando una subclase contiene un método que anula un método de la superclase, también
puede llamar al método de la superclase llamando a
Super (subclase, self) .method en lugar de self.method.
Ejemplo
class Thought(object):
def __init__(self):
pass
def message(self):
print("Thought, always come and go")
class Advice(Thought):
def __init__(self):
super(Advice, self).__init__()
def message(self):
print('Warning: Risk is always involved when you are dealing with market!')
Heredar al constructor
Si vemos en nuestro ejemplo de herencia anterior, __init__ estaba ubicado en la clase padre en la
parte superior porque el perro o gato de la clase infantil no tenía el método __init__. Python usó la
búsqueda de atributos de herencia para encontrar __init__ en la clase animal. Cuando creamos la
clase secundaria, primero verá el método __init__ en la clase de perro, luego no lo encontró, luego
buscó en la clase principal Animal y lo encontró allí y lo llamó allí. Entonces, a medida que nuestro
diseño de clase se volvió complejo, es posible que deseamos inicializar una instancia procesándola
primero a través del constructor de clase padre y luego a través del constructor de clase hijo.
Salida
En el ejemplo anterior, todos los animales tienen un nombre y todos los perros una raza en particular.
Llamamos constructor de clase padre con super. Entonces el perro tiene su propio __init__ pero lo
primero que sucede es que llamamos super. Super está integrado en la función y está diseñado para
relacionar una clase con su superclase o su clase principal.
En este caso, decimos que obtenga la superclase de perro y pase la instancia de perro a cualquier
método que digamos aquí, el constructor __init__. En otras palabras, estamos llamando a la clase
padre Animal __init__ con el objeto perro. Puede preguntar por qué no solo diremos Animal __init__
con la instancia del perro, podríamos hacer esto, pero si el nombre de la clase animal cambiara, en
algún momento en el futuro. ¿Qué pasa si queremos reorganizar la jerarquía de clases, por lo que el
perro heredó de otra clase? Usar super en este caso nos permite mantener las cosas modulares y
fáciles de cambiar y mantener.
En este ejemplo, podemos combinar la funcionalidad general __init__ con una funcionalidad más
específica. Esto nos da la oportunidad de separar la funcionalidad común de la funcionalidad
específica que puede eliminar la duplicación de código y relacionar la clase entre sí de una manera
que refleje el diseño general del sistema.
Conclusión
Como su nombre lo indica, la herencia múltiple es Python cuando una clase hereda de varias clases.
Por ejemplo, un niño hereda los rasgos de personalidad de ambos padres (Madre y Padre).
Para hacer que una clase herede de varias clases de padres, escribimos los nombres de estas clases
dentro de los paréntesis en la clase derivada mientras la definimos. Separamos estos nombres con
comas.
A continuación se muestra un ejemplo de eso:
La herencia múltiple se refiere a la capacidad de heredar de dos o más de dos clases. La complejidad
surge cuando el hijo hereda de los padres y los padres heredan de la clase de los abuelos. Python
trepa a un árbol heredado en busca de atributos que se solicitan que se lean desde un objeto.
Verificará en la instancia, dentro de la clase, luego en la clase padre y, por último, en la clase abuelo.
Ahora surge la pregunta en qué orden se buscarán las clases: primero la respiración o la profundidad
primero. Por defecto, Python va con la profundidad primero.
Es por eso que en el diagrama a continuación, Python busca el método dothis () primero en la clase
A. Por lo tanto, el orden de resolución del método en el ejemplo a continuación será
Mro- D → B → A → C
Mire el siguiente diagrama de herencia múltiple:
Veamos un ejemplo para comprender la característica "mro" de un Python.
Salida
Ejemplo 3
Salida
La regla simple para comprender el resultado anterior es: si la misma clase aparece en el orden de
resolución del método, las apariencias anteriores de esta clase se eliminarán del orden de resolución
del método.
En conclusión
Cualquier clase puede heredar de múltiples clases
Pero cuando dos clases heredan de la misma clase, Python elimina las primeras apariciones
de esa clase del mro.
Aunque los métodos funcionan exactamente de la misma manera que una función, excepto en un
punto donde el primer argumento del método es objeto de instancia.
def outside_func(():
Método de instancia -
def func(self,)
@classmethod
def cfunc(cls,)
@staticmethod
def sfoo()
Hasta ahora hemos visto el método de instancia, ahora es el momento de obtener una idea de los
otros dos métodos,
Método de clase
sintaxis
class C(object):
@classmethod
def fun(cls, arg1, arg2, ...):
....
fun: function that needs to be converted into a class method
returns: a class method for function
Tienen acceso a este argumento cls, no puede modificar el estado de la instancia del objeto. Eso
requeriría acceso a uno mismo.
Método estático
Un método estático no toma un parámetro self ni cls (clase) pero es libre de aceptar un número
arbitrario de otros parámetros.
sintaxis
class C(object):
@staticmethod
def fun(arg1, arg2, ...):
...
returns: a static method for function funself.
Generalmente usamos el método de clase para crear métodos de fábrica. Los métodos de
fábrica devuelven un objeto de clase (similar a un constructor) para diferentes casos de uso.
Visión general
El desarrollo de software moderno necesita abordar requisitos comerciales complejos. También debe
tener en cuenta factores como la extensibilidad y la mantenibilidad futuras. Un buen diseño de un
sistema de software es vital para lograr estos objetivos. Los patrones de diseño juegan un papel
importante en tales sistemas.
Los diseños que casi se han convertido en una forma estándar de codificar alguna lógica / mecanismo
/ técnica en software, por lo tanto, se conocen o estudian como Patrones de diseño de software.
Le ayuda a lidiar con futuras extensiones y modificaciones con más facilidad que de otra
manera.
Puede reducir los errores en el sistema, ya que son soluciones comprobadas para problemas
comunes.
Patrones creacionales
Los patrones de diseño de creación separan la lógica de creación de objetos del resto del sistema. En
lugar de crear objetos, los patrones de creación los crean para usted. Los patrones de creación
incluyen Abstract Factory, Builder, Factory Method, Prototype y Singleton.
Los patrones de creación no se usan comúnmente en Python debido a la naturaleza dinámica del
lenguaje. Además, el lenguaje en sí mismo nos proporciona toda la flexibilidad que necesitamos para
crear de una manera elegante y suficiente, rara vez necesitamos implementar algo en la parte
superior, como singleton o Factory.
Además, estos patrones proporcionan una forma de crear objetos mientras se oculta la lógica de
creación, en lugar de crear instancias de objetos directamente utilizando un nuevo operador.
Patrones estructurales
A veces, en lugar de comenzar desde cero, debe construir estructuras más grandes utilizando un
conjunto de clases existente. Ahí es donde los patrones de clase estructural usan la herencia para
construir una nueva estructura. Los patrones de objetos estructurales usan composición / agregación
para obtener una nueva funcionalidad. Adaptador, Puente, Compuesto, Decorador, Fachada,
Flyweight y Proxy son Patrones Estructurales. Ofrecen las mejores formas de organizar la jerarquía
de clases.
Patrones de comportamiento
Los patrones de comportamiento ofrecen las mejores formas de manejar la comunicación entre
objetos. Los patrones que se incluyen en estas categorías son: visitante, cadena de responsabilidad,
comando, intérprete, iterador, mediador, recuerdo, observador, estado, estrategia y método de
plantilla son patrones de comportamiento.
único
Es uno de los patrones de diseño más controvertidos y famosos. Se utiliza en lenguajes demasiado
orientados a objetos, y es una parte vital de la programación tradicional orientada a objetos.
El patrón Singleton se usa para,
Cuando el registro necesita ser implementado. La instancia del registrador es compartida por
todos los componentes del sistema.
Los archivos de configuración lo utilizan porque todos los componentes del sistema deben
mantener y compartir la memoria caché de la información.
class Logger(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_logger'):
cls._logger = super(Logger, cls).__new__(cls, *args, **kwargs)
return cls._logger
Cuando se llama __new__, normalmente construye una nueva instancia de esa clase. Cuando lo
anulamos, primero verificamos si nuestra instancia singleton se ha creado o no. Si no, lo creamos
usando una súper llamada. Por lo tanto, cada vez que llamamos al constructor en Logger, siempre
obtenemos exactamente la misma instancia.
>>>
>>> obj1 = Logger()
>>> obj2 = Logger()
>>> obj1 == obj2
True
>>>
>>> obj1
<__main__.Logger object at 0x03224090>
>>> obj2
<__main__.Logger object at 0x03224090>
Entonces, si tenemos que agregar el método mágico __add__ a nuestras propias clases, ¿podríamos
hacerlo también? Intentemos hacer eso.
Tenemos una clase llamada Sumlist que tiene un constructor __init__ que toma la lista como un
argumento llamado my_list.
class SumList(object):
def __init__(self, my_list):
self.mylist = my_list
def __add__(self, other):
new_list = [ x + y for x, y in zip(self.mylist, other.mylist)]
return SumList(new_list)
def __repr__(self):
return str(self.mylist)
Salida
Pero hay muchos métodos que son manejados internamente por otros métodos mágicos. A
continuación hay algunos de ellos,
En el siguiente ejemplo estamos heredando del diccionario pero luego estamos implementando uno
de sus métodos __setitem__. Este (setitem) se invoca cuando establecemos clave y valor en el
diccionario. Como este es un método mágico, esto se llamará implícitamente.
class MyDict(dict):
dd = MyDict()
dd['a'] = 10
dd['b'] = 20
Salida
Extendamos nuestro ejemplo anterior, a continuación hemos llamado dos métodos mágicos llamados
__getitem__ y __setitem__ mejor invocados cuando tratamos con el índice de lista.
# Mylist inherits from 'list' object but indexes from 1 instead for 0!
class Mylist(list): # inherits from list
def __getitem__(self, index):
if index == 0:
raise IndexError
if index > 0:
index = index - 1
return list.__getitem__(self, index) # this method is called when
Salida
En el ejemplo anterior, establecemos una lista de tres elementos en Mylist e implícitamente se llama
al método __init__ y cuando imprimimos el elemento x, obtenemos la lista de tres elementos (['a', 'b',
'c']). Luego agregamos otro elemento a esta lista. Más tarde pedimos el índice 1 y el índice 4. Pero si
ve el resultado, estamos obteniendo elementos del (índice-1) de lo que hemos pedido. Como
sabemos, la indexación de la lista comienza desde 0, pero aquí la indexación comienza desde 1 (es
por eso que estamos obteniendo el primer elemento de la lista).
Convenciones de nombres
En esto analizaremos los nombres que usaremos para las variables, especialmente las variables
privadas y las convenciones utilizadas por los programadores de Python en todo el mundo. Aunque
las variables se designan como privadas, no hay privacidad en Python y esto por diseño. Al igual que
cualquier otro lenguaje bien documentado, Python tiene convenciones de nomenclatura y estilo que
promueve, aunque no las impone. Hay una guía de estilo escrita por " Guido van Rossum", el
creador de Python, que describe las mejores prácticas y el uso del nombre y se llama PEP8.
Aquí está el enlace para esto, https://www.python.org/dev/peps/pep-0008/
PEP significa propuesta de mejora de Python y es una serie de documentación que se distribuye
entre la comunidad de Python para discutir los cambios propuestos. Por ejemplo, se recomienda todo,
Nombres de módulos - all_lower_case
Nombres de clase y nombres de excepción - CamelCase
Nombres globales y locales - all_lower_case
Funciones y nombres de métodos - all_lower_case
Constantes: ALL_UPPER_CASE
Estas son solo la recomendación, puede variar si lo desea. Pero como la mayoría de los
desarrolladores siguen estas recomendaciones, podría ser que su código sea menos legible.
En Python, cuando tratamos con módulos y clases, designamos algunas variables o atributos como
privados. En Python, no existe una variable de instancia "Privada" a la que no se pueda acceder
excepto dentro de un objeto. Privado simplemente significa que simplemente no están destinados a
ser utilizados por los usuarios del código, sino que están destinados a ser utilizados internamente. En
general, la mayoría de los desarrolladores de Python siguen una convención, es decir, un nombre con
un guión bajo, por ejemplo. _attrval (ejemplo a continuación) debe tratarse como una parte no pública
de la API o cualquier código de Python, ya sea una función, un método o un miembro de datos. A
continuación se muestra la convención de nomenclatura que seguimos,
Atributos o variables públicas (destinados a ser utilizados por el importador de este módulo o
usuario de esta clase) - regular_lower_case
class GetSet(object):
instance_count = 0 # public
@property
def var(self):
print('Getting the "var" attribute')
return self._attrval
@var.setter
def var(self, value):
print('setting the "var" attribute')
self._attrval = value
@var.deleter
def var(self):
print('deleting the "var" attribute')
self._attrval = None
cc = GetSet(5)
cc.var = 10 # public name
print(cc._attrval)
print(cc._GetSet__mangled_name)
Salida
Instrumentos de cuerda
Las cadenas son los tipos de datos más populares utilizados en cada lenguaje de programación. ¿Por
qué? Porque entendemos el texto mejor que los números, por lo que al escribir y hablar usamos texto
y palabras, de manera similar en la programación también usamos cadenas. En la cadena analizamos
el texto, analizamos la semántica del texto y hacemos minería de datos, y todos estos datos son texto
consumido por humanos. La cadena en Python es inmutable.
Manipulación de cuerdas
En Python, la cadena se puede marcar de múltiples maneras, usando comillas simples ('), comillas
dobles (“) o incluso comillas triples (' '') en el caso de cadenas de líneas múltiples.
La manipulación de cadenas es muy útil y muy utilizada en todos los idiomas. A menudo, los
programadores deben descomponer las cadenas y examinarlas de cerca.
Las cadenas pueden ser iteradas (carácter por carácter), cortadas o concatenadas. La sintaxis es la
misma que para las listas.
La clase str tiene numerosos métodos para facilitar la manipulación de cadenas. Los comandos dir y
help proporcionan orientación en el intérprete de Python sobre cómo usarlos.
1
isalpha ()
Comprueba si todos los personajes son alfabetos
2
isdigit ()
3
isdecimal ()
44
isnumeric ()
comprueba caracteres numéricos
55
encontrar()
Devuelve el índice más alto de subcadenas
66
istitle ()
77
unirse()
Devuelve una cadena concatenada
8
inferior()
devuelve una cadena en minúsculas
99
Superior()
10
partion ()
Devuelve una tupla
11
bytearray ()
Devuelve la matriz del tamaño de byte dado
12
enumerar()
Devuelve un objeto de enumeración
13
isprintable ()
Comprueba el carácter imprimible
Formato de cadena
En Python 3.x el formato de las cadenas ha cambiado, ahora es más lógico y es más flexible. El
formateo se puede hacer usando el método format () o el signo% (estilo antiguo) en la cadena de
formato.
La cadena puede contener texto literal o campos de reemplazo delimitados por llaves {} y cada campo
de reemplazo puede contener el índice numérico de un argumento posicional o el nombre de un
argumento de palabra clave.
sintaxis
str.format(*args, **kwargs)
Formato básico
El siguiente ejemplo permite reorganizar el orden de visualización sin cambiar los argumentos.
Cadenas como colecciones de caracteres Unicode inmutables. Las cadenas Unicode brindan la
oportunidad de crear software o programas que funcionan en todas partes porque las cadenas
Unicode pueden representar cualquier carácter posible, no solo los caracteres ASCII.
Muchas operaciones de E / S solo saben cómo tratar con bytes, incluso si el objeto de bytes se refiere
a datos textuales. Por lo tanto, es muy importante saber cómo intercambiar entre bytes y Unicode.
>>>
>>> # Python code to demonstrate Byte Decoding
>>>
>>> #Initialise a String
>>> x = 'TutorialsPoint'
>>>
>>> #Initialising a byte object
>>> y = b'TutorialsPoint'
>>>
>>> #using decode() to decode the Byte object
>>> # decoded version of y is stored in z using ASCII mapping
>>> z = y.decode('ASCII')
>>> #Check if y is converted to String or not
>>> if (z == x):
print('Decoding Successful!')
else:
print('Decoding Unsuccessful!') Decoding Successful!
>>>
E / S de archivo
Los sistemas operativos representan los archivos como una secuencia de bytes, no como texto.
Un archivo es una ubicación con nombre en el disco para almacenar información relacionada. Se
utiliza para almacenar permanentemente datos en su disco.
En Python, una operación de archivo tiene lugar en el siguiente orden.
Abrir un archivo
Leer o escribir en un archivo (operación). Abrir un archivo
Cierra el archivo.
Python envuelve el flujo entrante (o saliente) de bytes con llamadas de decodificación (o codificación)
apropiadas para que podamos tratar directamente con los objetos str.
Abrir un archivo
Python tiene una función incorporada open () para abrir un archivo. Esto generará un objeto de
archivo, también llamado un identificador, ya que se utiliza para leer o modificar el archivo en
consecuencia.
>>> f = open(r'c:\users\rajesh\Desktop\index.webm','rb')
>>> f
<_io.BufferedReader name='c:\\users\\rajesh\\Desktop\\index.webm'>
>>> f.mode
'rb'
>>> f.name
'c:\\users\\rajesh\\Desktop\\index.webm'
Para leer el texto de un archivo, solo necesitamos pasar el nombre del archivo a la función. El archivo
se abrirá para su lectura y los bytes se convertirán a texto utilizando la codificación predeterminada de
la plataforma.
En general, una excepción es cualquier condición inusual. La excepción generalmente indica errores,
pero a veces pone intencionalmente en el programa, en casos como terminar un procedimiento antes
o recuperarse de una escasez de recursos. Hay varias excepciones integradas, que indican
condiciones como leer más allá del final de un archivo o dividir por cero. Podemos definir nuestras
propias excepciones llamadas excepción personalizada.
El manejo de excepciones le permite manejar errores con gracia y hacer algo significativo al respecto.
El manejo de excepciones tiene dos componentes: "lanzar" y "atrapar".
Cada error que se produce en Python resulta en una excepción que será una condición de error
identificada por su tipo de error.
>>> #Exception
>>> 1/0
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
1/0
ZeroDivisionError: division by zero
>>>
>>> var = 20
>>> print(ver)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
print(ver)
NameError: name 'ver' is not defined
>>> #Above as we have misspelled a variable name so we get an NameError.
>>>
>>> print('hello)
Cuando ocurre algo inusual en su programa y desea manejarlo utilizando el mecanismo de excepción,
'lanza una excepción'. Las palabras clave try y except se utilizan para detectar excepciones. Cada vez
que ocurre un error dentro de un bloque de prueba, Python busca una coincidencia, excepto el bloque
para manejarlo. Si hay uno, la ejecución salta allí.
sintaxis
try:
#write some code
#that might throw some exception
except <ExceptionType>:
# Exception handler, alert the user
try:
some statement here
except:
exception handling
Escribamos un código para ver qué sucede cuando no utiliza ningún mecanismo de manejo de
errores en su programa.
El programa anterior funcionará correctamente siempre que el usuario ingrese un número, pero qué
sucede si los usuarios intentan poner algún otro tipo de datos (como una cadena o una lista).
Ahora ValueError es un tipo de excepción. Intentemos reescribir el código anterior con manejo de
excepciones.
import sys
try:
number = int(input('Enter number between 1 > 10: '))
except(ValueError):
print('Error..numbers only')
sys.exit()
Si ejecutamos el programa e ingresamos una cadena (en lugar de un número), podemos ver que
obtenemos un resultado diferente.
Elevar excepciones
Para aumentar sus excepciones de sus propios métodos, debe usar la palabra clave raise como esta
Tomemos un ejemplo.
def enterAge(age):
if age<0:
raise ValueError('Only positive integers are allowed')
if age % 2 ==0:
print('Entered Age is even')
else:
print('Entered Age is odd')
try:
num = int(input('Enter your age: '))
enterAge(num)
except ValueError:
print('Only positive integers are allowed')
Rendimiento esperado
Rendimiento esperado
class NegativeNumberException(RuntimeError):
def __init__(self, age):
super().__init__()
self.age = age
El código anterior crea una nueva clase de excepción llamada NegativeNumberException, que consta
de un solo constructor que llama al constructor de la clase padre usando super () __ init __ () y
establece la edad.
Ahora, para crear su propia clase de excepción personalizada, escribirá un código e importará la
nueva clase de excepción.
if age % 2 == 0:
print('Age is Even')
else:
print('Age is Odd')
try:
num = int(input('Enter your age: '))
enterage(num)
except NegativeNumberException:
print('Only positive integers are allowed')
except:
print('Something is wrong')
Salida
class customException(Exception):
def __init__(self, value):
self.parameter = value
def __str__(self):
return repr(self.parameter)
try:
raise customException('My Useful Error Message!')
except customException as instance:
print('Caught: ' + instance.parameter)
Salida
Jerarquía de excepción
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
Pepinillo
El decapado es el proceso mediante el cual una jerarquía de objetos de Python se convierte en una
secuencia de bytes (generalmente no legible por humanos) para escribirse en un archivo, esto
también se conoce como serialización. Unpickling es la operación inversa, mediante la cual una
secuencia de bytes se convierte nuevamente en una jerarquía de objetos Python en funcionamiento.
Pickle es la forma operacionalmente más simple de almacenar el objeto. El módulo Python Pickle es
una forma orientada a objetos para almacenar objetos directamente en un formato de
almacenamiento especial.
En resumen, podemos decir que el decapado es una forma de almacenar y recuperar variables de
datos dentro y fuera de archivos donde las variables pueden ser listas, clases, etc.
donde el protocolo del tercer argumento es opcional Para desempaquetar algo debe:
Encurtido de importación
myString = pickle.load(inputfile)
Métodos
La interfaz de pickle proporciona cuatro métodos diferentes.
dump () : el método dump () se serializa en un archivo abierto (objeto similar a un archivo).
Salida
Entonces, en el ejemplo anterior, hemos creado una instancia de una clase Cat y luego la hemos
encurtido, transformando nuestra instancia "Cat" en una simple matriz de bytes.
[….]
binary_file = open(my_pickled_Pussy.bin', mode='wb')
my_pickled_Pussy = pickle.dump(Pussy, binary_file)
binary_file.close()
Unpickling
El proceso que toma una matriz binaria y la convierte en una jerarquía de objetos se llama
descortezado.
El proceso de desempaquetado se realiza utilizando la función load () del módulo pickle y devuelve
una jerarquía de objetos completa desde una matriz de bytes simple.
Usemos la función de carga en nuestro ejemplo anterior.
Salida
MeOw is black
Pussy is white
JSON
JSON (JavaScript Object Notation) ha sido parte de la biblioteca estándar de Python, es un formato
ligero de intercambio de datos. Es fácil para los humanos leer y escribir. Es fácil de analizar y generar.
Debido a su simplicidad, JSON es una forma en la que almacenamos e intercambiamos datos, lo cual
se logra a través de su sintaxis JSON y se usa en muchas aplicaciones web. Como está en formato
legible para humanos, y esta puede ser una de las razones para usarlo en la transmisión de datos,
además de su efectividad al trabajar con API.
Un ejemplo de datos con formato JSON es el siguiente:
Python simplifica el trabajo con archivos Json. El módulo sused para este propósito es el módulo
JSON. Este módulo debe incluirse (integrado) dentro de su instalación de Python.
JSON a Python
Leer JSON significa convertir JSON en un valor de Python (objeto). La biblioteca json analiza JSON
en un diccionario o lista en Python. Para hacer eso, usamos la función cargas () (carga desde una
cadena), como sigue:
Salida
A continuación se muestra un archivo json de muestra,
data1.json
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
El contenido anterior (Data1.json) se parece a un diccionario convencional. Podemos usar pickle para
almacenar este archivo, pero el resultado no es legible por humanos.
JSON (Java Script Object Notification) es un formato muy simple y esa es una de las razones de su
popularidad. Ahora veamos la salida de json a través del siguiente programa.
Salida
Arriba abrimos el archivo json (data1.json) para leer, obtener el controlador de archivos y pasar a
json.load y recuperar el objeto. Cuando intentamos imprimir la salida del objeto, es lo mismo que el
archivo json. Aunque el tipo del objeto es diccionario, sale como un objeto Python. Escribir a JSON es
simple, ya que vimos este pepinillo. Arriba cargamos el archivo json, agregamos otro par de valores
clave y lo escribimos de nuevo en el mismo archivo json. Ahora, si vemos data1.json, se ve diferente
.ie no en el mismo formato que vemos anteriormente.
Para que nuestra salida se vea igual (formato legible por humanos), agregue el par de argumentos en
nuestra última línea del programa,
Del mismo modo que Pickle, podemos imprimir la cadena con volcados y cargar con cargas. A
continuación se muestra un ejemplo de eso,
Ñame
YAML puede ser el estándar de serialización de datos más amigable para los humanos para todos los
lenguajes de programación.
Código legible por humanos : YAML es el formato más legible por humanos, de modo que
incluso su contenido de primera plana se muestra en YAML para aclarar esto.
Código compacto : en YAML usamos sangría de espacios en blanco para denotar la
estructura, no los corchetes.
Sintaxis para datos relacionales : para referencias internas utilizamos anclas (&) y alias (*).
Una de las áreas donde se usa ampliamente es para ver / editar estructuras de datos ,
por ejemplo, archivos de configuración, volcado durante la depuración y encabezados de
documentos.
Instalando YAML
Como yaml no es un módulo incorporado, necesitamos instalarlo manualmente. La mejor manera de
instalar yaml en la máquina de Windows es a través de pip. Ejecute el siguiente comando en su
terminal de Windows para instalar yaml,
Al ejecutar el comando anterior, la pantalla mostrará algo como a continuación en función de cuál es
la última versión actual.
Collecting pyaml
Using cached pyaml-17.12.1-py2.py3-none-any.whl
Collecting PyYAML (from pyaml)
Using cached PyYAML-3.12.tar.gz
Installing collected packages: PyYAML, pyaml
Running setup.py install for PyYAML ... done
Successfully installed PyYAML-3.12 pyaml-17.12.1
Para probarlo, vaya al shell de Python e importe el módulo yaml, importe yaml, si no se encuentra
ningún error, entonces podemos decir que la instalación fue exitosa.
Después de instalar pyaml, veamos el siguiente código,
script_yaml1.py
Arriba creamos tres estructuras de datos diferentes, diccionario, lista y tupla. En cada una de las
estructuras, hacemos yaml.dump. El punto importante es cómo se muestra la salida en la pantalla.
Salida
La salida del diccionario se ve limpia .ie. valor clave.
Espacio en blanco para separar diferentes objetos.
La tupla se indica primero con !! Python / tuple y luego en el mismo formato que las listas.
Cargando un archivo yaml
---
# An employee record
name: Raagvendra Joshi
job: Developer
skill: Oracle
employed: True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
Oracle: Elite
power_builder: Elite
Full Stack Developer: Lame
education:
4 GCSEs
3 A-Levels
MCA in something called com
Ahora escribamos un código para cargar este archivo yaml a través de la función yaml.load. A
continuación hay un código para lo mismo.
Como la salida no parece tan legible, la presento usando json al final. Compare la salida que
obtuvimos y el archivo yaml real que tenemos.
Salida
Uno de los aspectos más importantes del desarrollo de software es la depuración. En esta sección
veremos diferentes formas de depuración de Python, ya sea con depurador incorporado o con
depuradores de terceros.
pdb.set_trace()
Ejemplo
pdb_example1.py
import pdb
x = 9
y = 7
pdb.set_trace()
total = x + y
pdb.set_trace()
Hemos insertado algunos puntos de interrupción en este programa. El programa hará una pausa en
cada punto de interrupción (pdb.set_trace ()). Para ver el contenido de una variable, simplemente
escriba el nombre de la variable.
c:\Python\Python361>Python pdb_example1.py
> c:\Python\Python361\pdb_example1.py(8)<module>()
-> total = x + y
(Pdb) x
9
(Pdb) y
7
(Pdb) total
*** NameError: name 'total' is not defined
(Pdb)
Presione co o continúe con la ejecución de los programas hasta el próximo punto de interrupción.
(Pdb) c
--Return--
> c:\Python\Python361\pdb_example1.py(8)<module>()->None
-> total = x + y
(Pdb) total
16
Eventualmente, necesitará depurar programas mucho más grandes, programas que usan subrutinas.
Y a veces, el problema que está tratando de encontrar se encuentra dentro de una subrutina.
Considere el siguiente programa.
import pdb
def squar(x, y):
out_squared = x^2 + y^2
return out_squared
if __name__ == "__main__":
#pdb.set_trace()
print (squar(4, 5))
c:\Python\Python361>Python pdb_example2.py
> c:\Python\Python361\pdb_example2.py(10)<module>()
-> print (squar(4, 5))
(Pdb)
Podemos usar ? para obtener ayuda, pero la flecha indica la línea que se va a ejecutar. En este
punto, es útil presionar s to s para entrar en esa línea.
(Pdb) s
--Call--
>c:\Python\Python361\pdb_example2.py(3)squar()
-> def squar(x, y):
Esta es una llamada a una función. Si desea una descripción general de dónde se encuentra en su
código, pruebe l -
(Pdb) l
1 import pdb
2
3 def squar(x, y):
4 -> out_squared = x^2 + y^2
5
6 return out_squared
7
8 if __name__ == "__main__":
9 pdb.set_trace()
10 print (squar(4, 5))
[EOF]
(Pdb)
Puede presionar n para avanzar a la siguiente línea. En este punto, está dentro del método
out_squared y tiene acceso a la variable declarada dentro de la función .ie x e y.
(Pdb) x
4
(Pdb) y
5
(Pdb) x^2
6
(Pdb) y^2
7
(Pdb) x**2
16
(Pdb) y**2
25
(Pdb)
Entonces podemos ver que el operador ^ no es lo que queríamos, sino que necesitamos usar el
operador ** para hacer cuadrados.
De esta manera podemos depurar nuestro programa dentro de las funciones / métodos.
Inicio sesión
El módulo de registro ha sido parte de la Biblioteca estándar de Python desde Python versión 2.3.
Como es un módulo incorporado, todos los módulos de Python pueden participar en el registro, de
modo que nuestro registro de aplicaciones puede incluir su propio mensaje integrado con los
mensajes del módulo de terceros. Proporciona mucha flexibilidad y funcionalidad.
Beneficios de la tala
import logging
logging.basicConfig(level=logging.INFO)
Salida de logging1.py
logging.basicConfig(level = logging.DEBUG)
#logging.basicConfig(level = logging.DEBUG)
Salida
WARNING:root:And this, too
Ahora todos los mensajes de registro irán al archivo (logging.log) en su directorio de trabajo actual en
lugar de la pantalla. Este es un enfoque mucho mejor, ya que nos permite hacer un análisis posterior
de los mensajes que recibimos.
Benchmarking
La evaluación comparativa o la creación de perfiles es básicamente para probar qué tan rápido se
ejecuta su código y dónde están los cuellos de botella. La razón principal para hacer esto es para la
optimización.
cronométralo
Python viene con un módulo incorporado llamado timeit. Puede usarlo para cronometrar pequeños
fragmentos de código. El módulo timeit utiliza funciones de tiempo específicas de la plataforma para
que obtenga los tiempos más precisos posibles.
Por lo tanto, nos permite comparar dos envíos de código tomados por cada uno y luego optimizar los
scripts para obtener un mejor rendimiento.
El módulo timeit tiene una interfaz de línea de comandos, pero también se puede importar.
Hay dos formas de llamar a un script. Primero usemos el script, para eso ejecute el siguiente código y
vea la Salida.
import timeit
print ( 'by index: ', timeit.timeit(stmt = "mydict['c']", setup = "mydict = {'a':5, 'b':10,
print ( 'by get: ', timeit.timeit(stmt = 'mydict.get("c")', setup = 'mydict = {"a":5, "b":10,
"b":10
Salida
by index: 0.1809192126703489
by get: 0.6088525265034692
Above we use two different method .i.e. by subscript and get to access the dictionary key value. We
execute statement 1 million times as it executes too fast for a very small data. Now we can see the
index access much faster as compared to the get. We can run the code multiply times and there will
be slight variation in the time execution to get the better understanding.
Another way is to run the above test in the command line. Let’s do it,
Above output may vary based on your system hardware and what all applications are running currently
in your system.
Below we can use the timeit module, if we want to call to a function. As we can add multiple statement
inside the function to test.
import timeit
Output
0.7713474590139164
Requests es un módulo de Python que es una biblioteca HTTP elegante y simple para Python. Con
esto puede enviar todo tipo de solicitudes HTTP. Con esta biblioteca podemos agregar encabezados,
datos de formularios, archivos y parámetros de varias partes y acceder a los datos de respuesta.
Como Requests no es un módulo integrado, debemos instalarlo primero.
Una vez que haya instalado el módulo, puede verificar si la instalación se realizó correctamente
escribiendo el siguiente comando en el shell de Python.
import requests
Salida -
Los métodos de la biblioteca de solicitudes para todos los verbos HTTP actualmente en uso. Si desea
realizar una simple solicitud POST a un punto final de la API, puede hacerlo así:
datos que se pueden completar con digamos un diccionario, un archivo o bytes que se
pasarán en el cuerpo HTTP de nuestra solicitud POST.
json que se puede completar con un objeto json que también se pasará en el cuerpo de
nuestra solicitud HTTP.
Construido sobre el paquete Numpy y la estructura de datos clave se llama DataFrame. Estos marcos
de datos nos permiten almacenar y manipular datos tabulares en filas de observaciones y columnas
de variables.
Hay varias formas de crear un DataFrame. Una forma es usar un diccionario. Por ejemplo
Salida
De la salida podemos ver el nuevo Data Frame de brics, Pandas ha asignado una clave para cada
país como los valores numéricos del 0 al 4.
Salida
Marcos de datos de indexación
Salida
Pygame
Pygame es la biblioteca de código abierto y multiplataforma que sirve para crear aplicaciones
multimedia, incluidos juegos. Incluye gráficos de computadora y bibliotecas de sonido diseñadas para
ser utilizadas con el lenguaje de programación Python. Puedes desarrollar muchos juegos geniales
con Pygame '.
Visión general
Pygame se compone de varios módulos, cada uno de los cuales se ocupa de un conjunto específico
de tareas. Por ejemplo, el módulo de visualización se ocupa de la ventana y la pantalla de
visualización, el módulo de dibujo proporciona funciones para dibujar formas y el módulo de teclas
funciona con el teclado. Estos son solo algunos de los módulos de la biblioteca.
import pygame
pygame.init()
screen = Pygame.display.set_mode((560,480))
Pygame.display.set_caption(‘First Pygame Game’)
Es solo un ciclo donde manejamos eventos continuamente, verificamos la entrada, movemos objetos
y los dibujamos. Cada iteración del bucle se llama marco.
Pongamos toda la lógica anterior en un programa a continuación,
Pygame_script.py
Salida
Es una biblioteca de Python para extraer datos de archivos HTML o XML. Con su analizador favorito,
proporciona formas idiomáticas de navegar, buscar y modificar el árbol de análisis.
Como BeautifulSoup no es una biblioteca incorporada, necesitamos instalarla antes de intentar usarla.
Para instalar BeautifulSoup, ejecute el siguiente comando
$ apt-get install Python-bs4 # For Linux and Python2
$ apt-get install Python3-bs4 # for Linux based system and Python3.
Una vez que se realiza la instalación, estamos listos para ejecutar algunos ejemplos y explora
Beautifulsoup en detalle,
Salida