Python 3 - Guía rápida
El módulo __future__
Python 3.x introdujo algunas palabras clave y características incompatibles con Python 2 que se pueden importar a través del módulo __future__ incorporado en Python 2. Se recomienda usar importaciones __future__, si está planeando la compatibilidad con Python 3.x para su código.
Por ejemplo, si queremos el comportamiento de división de enteros de Python 3.x en Python 2, agregue la siguiente declaración de importación.
from __future__ import division
La función de impresión
El cambio más notable y más conocido en Python 3 es cómo printse utiliza la función. El uso de paréntesis () con la función de impresión ahora es obligatorio. Era opcional en Python 2.
print "Hello World" #is acceptable in Python 2
print ("Hello World") # in Python 3, print must be followed by ()
La función print () inserta una nueva línea al final, por defecto. En Python 2, se puede suprimir poniendo ',' al final. En Python 3, "end = ''" agrega espacio en lugar de nueva línea.
print x, # Trailing comma suppresses newline in Python 2
print(x, end=" ") # Appends a space instead of a newline in Python 3
Leer entrada desde el teclado
Python 2 tiene dos versiones de funciones de entrada, input() y raw_input(). La función input () trata los datos recibidos como una cadena si se incluyen entre comillas '' o ""; de lo contrario, los datos se tratan como un número.
En Python 3, la función raw_input () está obsoleta. Además, los datos recibidos siempre se tratan como una cadena.
In Python 2
>>> x = input('something:')
something:10 #entered data is treated as number
>>> x
10
>>> x = input('something:')
something:'10' #entered data is treated as string
>>> x
'10'
>>> x = raw_input("something:")
something:10 #entered data is treated as string even without ''
>>> x
'10'
>>> x = raw_input("something:")
something:'10' #entered data treated as string including ''
>>> x
"'10'"
In Python 3
>>> x = input("something:")
something:10
>>> x
'10'
>>> x = input("something:")
something:'10' #entered data treated as string with or without ''
>>> x
"'10'"
>>> x = raw_input("something:") # will result NameError
Traceback (most recent call last):
File "<pyshell#3>", line 1, in
<module>
x = raw_input("something:")
NameError: name 'raw_input' is not defined
División entera
En Python 2, el resultado de la división de dos enteros se redondea al entero más cercano. Como resultado, 3/2 mostrará 1. Para obtener una división de punto flotante, el numerador o denominador debe usarse explícitamente como flotante. Por lo tanto, 3.0 / 2 o 3 / 2.0 o 3.0 / 2.0 resultarán en 1.5
Python 3 evalúa 3/2 como 1.5 por defecto, lo que es más intuitivo para los nuevos programadores.
Representación Unicode
Python 2 requiere que marque una cadena con au si desea almacenarla como Unicode.
Python 3 almacena cadenas como Unicode, de forma predeterminada. Tenemos cadenas Unicode (utf-8) y clases de 2 bytes: bytes y matrices de bytes.
Función xrange () eliminada
En Python 2 range () devuelve una lista, y xrange () devuelve un objeto que solo generará los elementos en el rango cuando sea necesario, ahorrando memoria.
En Python 3, la función range () se elimina y xrange () se renombra como range (). Además, el objeto range () admite la división en Python 3.2 y versiones posteriores.
levantar excepción
Python 2 acepta ambas notaciones, la sintaxis 'antigua' y la 'nueva'; Python 3 genera un SyntaxError si no encerramos el argumento de excepción entre paréntesis.
raise IOError, "file error" #This is accepted in Python 2
raise IOError("file error") #This is also accepted in Python 2
raise IOError, "file error" #syntax error is raised in Python 3
raise IOError("file error") #this is the recommended syntax in Python 3
Argumentos en excepciones
En Python 3, los argumentos de la excepción deben declararse con la palabra clave 'as'.
except Myerror, err: # In Python2
except Myerror as err: #In Python 3
next () Función y .next () Método
En Python 2, next () como método de objeto generador, está permitido. En Python 2, también se acepta la función next (), para iterar sobre el objeto generador. En Python 3, sin embargo, next (0 como método generador se descontinúa y genera AttributeError.
gen = (letter for letter in 'Hello World') # creates generator object
next(my_generator) #allowed in Python 2 and Python 3
my_generator.next() #allowed in Python 2. raises AttributeError in Python 3
Utilidad 2to3
Junto con el intérprete de Python 3, el script 2to3.py generalmente se instala en la carpeta tools / scripts. Lee el código fuente de Python 2.xy aplica una serie de correctores para transformarlo en un código válido de Python 3.x.
Here is a sample Python 2 code (area.py):
def area(x,y = 3.14):
a = y*x*x
print a
return a
a = area(10)
print "area",a
To convert into Python 3 version:
$2to3 -w area.py
Converted code :
def area(x,y = 3.14): # formal parameters
a = y*x*x
print (a)
return a
a = area(10)
print("area",a)
Python es un lenguaje de scripting de alto nivel, interpretado, interactivo y orientado a objetos. Python está diseñado para ser muy legible. Utiliza palabras clave en inglés con frecuencia, mientras que los otros idiomas utilizan signos de puntuación. Tiene menos construcciones sintácticas que otros lenguajes.
Python is Interpreted- El intérprete procesa Python en tiempo de ejecución. No es necesario que compile su programa antes de ejecutarlo. Esto es similar a PERL y PHP.
Python is Interactive - De hecho, puede sentarse en un indicador de Python e interactuar con el intérprete directamente para escribir sus programas.
Python is Object-Oriented - Python admite el estilo o la técnica de programación orientada a objetos que encapsula el código dentro de los objetos.
Python is a Beginner's Language - Python es un gran lenguaje para los programadores de nivel principiante y admite el desarrollo de una amplia gama de aplicaciones, desde el procesamiento de texto simple hasta navegadores WWW y juegos.
Historia de Python
Python fue desarrollado por Guido van Rossum a finales de los ochenta y principios de los noventa en el Instituto Nacional de Investigación de Matemáticas e Informática de los Países Bajos.
Python se deriva de muchos otros lenguajes, incluidos ABC, Modula-3, C, C ++, Algol-68, SmallTalk y Unix shell y otros lenguajes de scripting.
Python tiene derechos de autor. Al igual que Perl, el código fuente de Python ahora está disponible bajo la Licencia Pública General GNU (GPL).
Python ahora es mantenido por un equipo de desarrollo central en el instituto, aunque Guido van Rossum todavía tiene un papel vital en la dirección de su progreso.
Python 1.0 se lanzó en noviembre de 1994. En 2000, se lanzó Python 2.0. Python 2.7.11 es la última edición de Python 2.
Mientras tanto, Python 3.0 se lanzó en 2008. Python 3 no es compatible con versiones anteriores de Python 2. El énfasis en Python 3 había estado en la eliminación de construcciones y módulos de programación duplicados para que "Debería haber uno, y preferiblemente solo uno, forma obvia de hacerlo ". Python 3.5.1 es la última versión de Python 3.
Funciones de Python
Las características de Python incluyen:
Easy-to-learn- Python tiene pocas palabras clave, estructura simple y una sintaxis claramente definida. Esto permite que un estudiante aprenda el idioma rápidamente.
Easy-to-read - El código Python está más claramente definido y es visible para los ojos.
Easy-to-maintain - El código fuente de Python es bastante fácil de mantener.
A broad standard library - La mayor parte de la biblioteca de Python es muy portátil y compatible con varias plataformas en UNIX, Windows y Macintosh.
Interactive Mode - Python tiene soporte para un modo interactivo que permite pruebas interactivas y depuración de fragmentos de código.
Portable - Python puede ejecutarse en una amplia variedad de plataformas de hardware y tiene la misma interfaz en todas las plataformas.
Extendable- Puede agregar módulos de bajo nivel al intérprete de Python. Estos módulos permiten a los programadores agregar o personalizar sus herramientas para que sean más eficientes.
Databases - Python proporciona interfaces a las principales bases de datos comerciales.
GUI Programming - Python admite aplicaciones GUI que se pueden crear y portar a muchas llamadas al sistema, bibliotecas y sistemas Windows, como Windows MFC, Macintosh y el sistema X Window de Unix.
Scalable - Python proporciona una mejor estructura y soporte para programas grandes que los scripts de shell.
Además de las características mencionadas anteriormente, Python tiene una gran lista de buenas características. A, algunos se enumeran a continuación:
Es compatible con métodos de programación estructurados y funcionales, así como con POO.
Se puede utilizar como lenguaje de programación o se puede compilar en código de bytes para crear aplicaciones grandes.
Proporciona tipos de datos dinámicos de muy alto nivel y admite la verificación dinámica de tipos.
Es compatible con la recolección automática de basura.
Se puede integrar fácilmente con C, C ++, COM, ActiveX, CORBA y Java.
Python 3 está disponible para Windows, Mac OS y la mayoría de las versiones del sistema operativo Linux. Aunque Python 2 está disponible para muchos otros sistemas operativos, el soporte de Python 3 no está disponible para ellos o se ha eliminado.
Configuración del entorno local
Abra una ventana de terminal y escriba "python" para averiguar si ya está instalado y qué versión está instalada.
Obtener Python
Plataforma Windows
Los binarios de la última versión de Python 3 (Python 3.5.1) están disponibles en esta página de descarga
Están disponibles las siguientes opciones de instalación diferentes.
- Archivo zip incrustable de Windows x86-64
- Instalador ejecutable de Windows x86-64
- Instalador basado en web de Windows x86-64
- Archivo zip incrustable de Windows x86
- Instalador ejecutable de Windows x86
- Instalador basado en web de Windows x86
Note- Para instalar Python 3.5.1, los requisitos mínimos del sistema operativo son Windows 7 con SP1. Para las versiones 3.0 a 3.4.x, Windows XP es aceptable.
Plataforma Linux
Los diferentes tipos de Linux utilizan diferentes administradores de paquetes para la instalación de nuevos paquetes.
En Ubuntu Linux, Python 3 se instala usando el siguiente comando desde la terminal.
$sudo apt-get install python3-minimal
Instalación desde la fuente
Descargue el tarball fuente comprimido en Gzip desde la URL de descarga de Python - https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
Extract the tarball
tar xvfz Python-3.5.1.tgz
Configure and Install:
cd Python-3.5.1
./configure --prefix = /opt/python3.5.1
make
sudo make install
Mac OS
Descargue los instaladores de Mac OS desde esta URL: https://www.python.org/downloads/mac-osx/
- Instalador de Mac OS X de 64 bits / 32 bits: python-3.5.1-macosx10.6.pkg
- Instalador de Mac OS X de 32 bits i386 / PPC - python-3.5.1-macosx10.5.pkg
Haga doble clic en este archivo de paquete y siga las instrucciones del asistente para instalarlo.
El código fuente, los binarios, la documentación, las noticias, etc. más actualizados y actualizados están disponibles en el sitio web oficial de Python:
Python Official Website - https://www.python.org/
Puede descargar la documentación de Python desde el siguiente sitio. La documentación está disponible en formatos HTML, PDF y PostScript.
Python Documentation Website- www.python.org/doc/
Configurando PATH
Los programas y otros archivos ejecutables pueden estar en muchos directorios. Por lo tanto, los sistemas operativos proporcionan una ruta de búsqueda que enumera los directorios en los que busca ejecutables.
Las características importantes son:
La ruta se almacena en una variable de entorno, que es una cadena con nombre mantenida por el sistema operativo. Esta variable contiene información disponible para el shell de comandos y otros programas.
La variable de ruta se denomina PATH en Unix o Path en Windows (Unix distingue entre mayúsculas y minúsculas; Windows no).
En Mac OS, el instalador maneja los detalles de la ruta. Para invocar al intérprete de Python desde cualquier directorio en particular, debe agregar el directorio de Python a su ruta.
Configuración de ruta en Unix / Linux
Para agregar el directorio de Python a la ruta de una sesión en particular en Unix:
In the csh shell - escriba setenv PATH "$ PATH: / usr / local / bin / python3" y presione Enter.
In the bash shell (Linux) - escriba export PYTHONPATH = / usr / local / bin / python3.4 y presione Enter.
In the sh or ksh shell - escriba PATH = "$ PATH: / usr / local / bin / python3" y presione Enter.
Note - / usr / local / bin / python3 es la ruta del directorio de Python.
Establecer ruta en Windows
Para agregar el directorio de Python a la ruta de una sesión en particular en Windows:
At the command prompt - escriba path% path%; C: \ Python y presione Enter.
Note - C: \ Python es la ruta del directorio de Python
Variables de entorno de Python
Aquí hay importantes variables de entorno, que son reconocidas por Python:
No Señor. | Variable y descripción |
---|---|
1 | PYTHONPATH Tiene una función similar a PATH. Esta variable le dice al intérprete de Python dónde ubicar los archivos de módulo importados a un programa. Debe incluir el directorio de la biblioteca fuente de Python y los directorios que contienen el código fuente de Python. PYTHONPATH a veces está predeterminado por el instalador de Python. |
2 | PYTHONSTARTUP Contiene la ruta de un archivo de inicialización que contiene el código fuente de Python. Se ejecuta cada vez que inicia el intérprete. Se denomina .pythonrc.py en Unix y contiene comandos que cargan utilidades o modifican PYTHONPATH. |
3 | PYTHONCASEOK Se usa en Windows para indicarle a Python que busque la primera coincidencia que no distinga entre mayúsculas y minúsculas en una declaración de importación. Establezca esta variable en cualquier valor para activarla. |
4 | PYTHONHOME Es una ruta de búsqueda de módulos alternativa. Por lo general, está integrado en los directorios PYTHONSTARTUP o PYTHONPATH para facilitar el cambio de bibliotecas de módulos. |
Ejecutando Python
Hay tres formas diferentes de iniciar Python:
Intérprete interactivo
Puede iniciar Python desde Unix, DOS o cualquier otro sistema que le proporcione un intérprete de línea de comandos o una ventana de shell.
Entrar python la línea de comando.
Comience a codificar de inmediato en el intérprete interactivo.
$python # Unix/Linux
or
python% # Unix/Linux
or
C:>python # Windows/DOS
Aquí está la lista de todas las opciones de línea de comando disponibles:
No Señor. | Opción y descripción |
---|---|
1 | -d proporcionar salida de depuración |
2 | -O generar código de bytes optimizado (dando como resultado archivos .pyo) |
3 | -S no ejecute el sitio de importación para buscar rutas de Python al inicio |
4 | -v salida detallada (seguimiento detallado en declaraciones de importación) |
5 | -X deshabilitar las excepciones integradas basadas en clases (solo use cadenas); obsoleto a partir de la versión 1.6 |
6 | -c cmd ejecutar el script de Python enviado como cmd string |
7 | file ejecutar el script de Python desde el archivo dado |
Script de la línea de comandos
Se puede ejecutar una secuencia de comandos de Python en la línea de comando invocando al intérprete en su aplicación, como se muestra en el siguiente ejemplo.
$python script.py # Unix/Linux
or
python% script.py # Unix/Linux
or
C:>python script.py # Windows/DOS
Note - Asegúrese de que el modo de permiso de archivo permita la ejecución.
Entorno de desarrollo integrado
También puede ejecutar Python desde un entorno de interfaz gráfica de usuario (GUI), si tiene una aplicación GUI en su sistema que admita Python.
Unix - IDLE es el primer IDE de Unix para Python.
Windows - PythonWin es la primera interfaz de Windows para Python y es un IDE con una GUI.
Macintosh - La versión Macintosh de Python junto con IDLE IDE está disponible en el sitio web principal, descargable como archivos MacBinary o BinHex'd.
Si no puede configurar el entorno correctamente, puede solicitar la ayuda del administrador de su sistema. Asegúrese de que el entorno de Python esté configurado correctamente y funcione perfectamente.
Note - Todos los ejemplos que se dan en los capítulos siguientes se ejecutan con la versión Python 3.4.1 disponible en Windows 7 y Ubuntu Linux.
Ya hemos configurado el entorno de programación de Python en línea, para que pueda ejecutar todos los ejemplos disponibles en línea mientras aprende teoría. Siéntase libre de modificar cualquier ejemplo y ejecutarlo en línea.
El lenguaje Python tiene muchas similitudes con Perl, C y Java. Sin embargo, existen algunas diferencias definidas entre los idiomas.
Primer programa de Python
Ejecutemos los programas en diferentes modos de programación.
Programación en modo interactivo
Al invocar al intérprete sin pasar un archivo de script como parámetro, aparece el siguiente mensaje:
$ python
Python 3.3.2 (default, Dec 10 2013, 11:35:01)
[GCC 4.6.3] on Linux
Type "help", "copyright", "credits", or "license" for more information.
>>>
On Windows:
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
Escriba el siguiente texto en el indicador de Python y presione Entrar -
>>> print ("Hello, Python!")
Si está ejecutando la versión anterior de Python (Python 2.x), use paréntesis como inprintla función es opcional. Esto produce el siguiente resultado:
Hello, Python!
Programación en modo script
La invocación del intérprete con un parámetro de secuencia de comandos inicia la ejecución de la secuencia de comandos y continúa hasta que finaliza. Cuando finaliza el guión, el intérprete ya no está activo.
Escribamos un programa Python simple en un script. Los archivos de Python tienen la extensión.py. Escriba el siguiente código fuente en un archivo test.py:
print ("Hello, Python!")
Suponemos que tiene el intérprete de Python configurado en PATHvariable. Ahora, intente ejecutar este programa de la siguiente manera:
On Linux
$ python test.py
Esto produce el siguiente resultado:
Hello, Python!
On Windows
C:\Python34>Python test.py
Esto produce el siguiente resultado:
Hello, Python!
Probemos otra forma de ejecutar un script de Python en Linux. Aquí está el archivo test.py modificado:
#!/usr/bin/python3
print ("Hello, Python!")
Suponemos que tiene un intérprete de Python disponible en el directorio / usr / bin. Ahora, intente ejecutar este programa de la siguiente manera:
$ chmod +x test.py # This is to make file executable $./test.py
Esto produce el siguiente resultado:
Hello, Python!
Identificadores de Python
Un identificador de Python es un nombre que se usa para identificar una variable, función, clase, módulo u otro objeto. Un identificador comienza con una letra de la A a la Z o de la aa la z o un guión bajo (_) seguido de cero o más letras, guiones bajos y dígitos (0 a 9).
Python no permite caracteres de puntuación como @, $ y% dentro de los identificadores. Python es un lenguaje de programación sensible a mayúsculas y minúsculas. Así,Manpower y manpower son dos identificadores diferentes en Python.
Aquí hay convenciones de nomenclatura para identificadores de Python:
Los nombres de las clases comienzan con una letra mayúscula. Todos los demás identificadores comienzan con una letra minúscula.
Comenzar un identificador con un solo subrayado inicial indica que el identificador es privado.
Comenzar un identificador con dos guiones bajos iniciales indica un identificador privado fuerte.
Si el identificador también termina con dos guiones bajos al final, el identificador es un nombre especial definido por el idioma.
Palabras reservadas
La siguiente lista muestra las palabras clave de Python. Estas son palabras reservadas y no puede usarlas como constantes o variables o cualquier otro nombre de identificador. Todas las palabras clave de Python contienen solo letras minúsculas.
y | ejecutivo | no |
como | finalmente | o |
afirmar | para | pasar |
romper | desde | impresión |
clase | global | aumento |
Seguir | Si | regreso |
def | importar | tratar |
del | en | mientras |
elif | es | con |
más | lambda | rendimiento |
excepto |
Líneas y sangría
Python no usa llaves ({}) para indicar bloques de código para definiciones de clases y funciones o control de flujo. Los bloques de código se indican mediante sangría de línea, que se aplica de forma rígida.
El número de espacios en la sangría es variable, pero todas las declaraciones dentro del bloque deben tener la misma sangría. Por ejemplo
if True:
print ("True")
else:
print ("False")
Sin embargo, el siguiente bloque genera un error:
if True:
print ("Answer")
print ("True")
else:
print "(Answer")
print ("False")
Por lo tanto, en Python todas las líneas continuas sangradas con el mismo número de espacios formarían un bloque. El siguiente ejemplo tiene varios bloques de instrucciones:
Note- No intente comprender la lógica en este momento. Solo asegúrese de comprender los distintos bloques, incluso si no tienen tirantes.
#!/usr/bin/python3
import sys
file_finish = "end"
file_text = ""
contents=[]
file_name=input("Enter filename: ")
if len(file_name) == 0:
print("Please enter filename")
sys.exit()
try:
# open file stream
file = open(file_name, "w")
except IOError:
print ("There was an error writing to", file_name)
sys.exit()
print ("Enter '", file_finish,)
print ("' When finished")
while file_text != file_finish:
file_text = input("Enter text: ")
contents.append(file_text)
if file_text == file_finish:
# close the file
file.close()
break
print(contents)
data = ' '.join([str(elem) for elem in contents])
print(data)
file.write(data)
file.close()
file_name = input("Enter filename: ")
if len(file_name) == 0:
print ("Next time please enter something")
sys.exit()
try:
file = open(file_name, "r")
except IOError:
print ("There was an error reading file")
sys.exit()
file_text = file.read()
file.close()
print (file_text)
Declaraciones de varias líneas
Las declaraciones en Python generalmente terminan con una nueva línea. Python, sin embargo, permite el uso del carácter de continuación de línea (\) para indicar que la línea debe continuar. Por ejemplo
total = item_one + \
item_two + \
item_three
Las declaraciones contenidas entre los corchetes [], {} o () no necesitan usar el carácter de continuación de línea. Por ejemplo
days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
Cita en Python
Python acepta comillas simples ('), dobles (") y triples (' '' o" "") para denotar cadenas literales, siempre que el mismo tipo de comillas comience y termine la cadena.
Las comillas triples se utilizan para extender la cadena a lo largo de varias líneas. Por ejemplo, todo lo siguiente es legal:
word = 'word'
sentence = "This is a sentence."
paragraph = """This is a paragraph. It is
made up of multiple lines and sentences."""
Comentarios en Python
Un signo de almohadilla (#) que no está dentro de una cadena literal es el comienzo de un comentario. Todos los caracteres después del #, hasta el final de la línea física, son parte del comentario y el intérprete de Python los ignora.
#!/usr/bin/python3
# First comment
print ("Hello, Python!") # second comment
Esto produce el siguiente resultado:
Hello, Python!
Puede escribir un comentario en la misma línea después de una declaración o expresión:
name = "Madisetti" # This is again comment
Python no tiene la función de comentarios de varias líneas. Tienes que comentar cada línea individualmente de la siguiente manera:
# This is a comment.
# This is a comment, too.
# This is a comment, too.
# I said that already.
Usando líneas en blanco
Una línea que contiene solo espacios en blanco, posiblemente con un comentario, se conoce como línea en blanco y Python la ignora por completo.
En una sesión de intérprete interactiva, debe ingresar una línea física vacía para terminar una declaración de varias líneas.
Esperando al usuario
La siguiente línea del programa muestra el mensaje y la declaración que dice "Presione la tecla Intro para salir", y luego espera a que el usuario actúe:
#!/usr/bin/python3
input("\n\nPress the enter key to exit.")
Aquí, "\ n \ n" se usa para crear dos nuevas líneas antes de mostrar la línea real. Una vez que el usuario presiona la tecla, el programa finaliza. Este es un buen truco para mantener una ventana de consola abierta hasta que el usuario haya terminado con una aplicación.
Varios estados de cuenta en una sola línea
El punto y coma (;) permite múltiples declaraciones en una sola línea dado que ninguna instrucción inicia un nuevo bloque de código. A continuación, se muestra un recorte de muestra con punto y coma:
import sys; x = 'foo'; sys.stdout.write(x + '\n')
Varios grupos de estados de cuenta como conjuntos
Los grupos de declaraciones individuales, que forman un solo bloque de código, se denominan suitesen Python. Declaraciones compuestas o complejas, como if, while, def y class requieren una línea de encabezado y una suite.
Las líneas de encabezado comienzan la declaración (con la palabra clave) y terminan con dos puntos (:) y son seguidas por una o más líneas que componen la suite. Por ejemplo
if expression :
suite
elif expression :
suite
else :
suite
Argumentos de la línea de comandos
Se pueden ejecutar muchos programas para proporcionarle información básica sobre cómo deben ejecutarse. Python le permite hacer esto con:h -
$ python -h
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-c cmd : program passed in as string (terminates option list)
-d : debug output from parser (also PYTHONDEBUG=x)
-E : ignore environment variables (such as PYTHONPATH)
-h : print this help message and exit
[ etc. ]
También puede programar su script de tal manera que acepte varias opciones. Los argumentos de la línea de comandos es un tema avanzado. Vamos a entenderlo.
Las variables no son más que ubicaciones de memoria reservadas para almacenar valores. Significa que cuando creas una variable, reservas algo de espacio en la memoria.
Según el tipo de datos de una variable, el intérprete asigna memoria y decide qué se puede almacenar en la memoria reservada. Por lo tanto, al asignar diferentes tipos de datos a las variables, puede almacenar números enteros, decimales o caracteres en estas variables.
Asignar valores a variables
Las variables de Python no necesitan una declaración explícita para reservar espacio en la memoria. La declaración ocurre automáticamente cuando asigna un valor a una variable. El signo igual (=) se utiliza para asignar valores a las variables.
El operando a la izquierda del operador = es el nombre de la variable y el operando a la derecha del operador = es el valor almacenado en la variable. Por ejemplo
#!/usr/bin/python3
counter = 100 # An integer assignment
miles = 1000.0 # A floating point
name = "John" # A string
print (counter)
print (miles)
print (name)
Aquí, 100, 1000.0 y "John" son los valores asignados a las variables de contador, millas y nombre, respectivamente. Esto produce el siguiente resultado:
100
1000.0
John
Asignación múltiple
Python le permite asignar un solo valor a varias variables simultáneamente.
Por ejemplo
a = b = c = 1
Aquí, se crea un objeto entero con el valor 1, y las tres variables se asignan a la misma ubicación de memoria. También puede asignar varios objetos a varias variables. Por ejemplo
a, b, c = 1, 2, "john"
Aquí, dos objetos enteros con valores 1 y 2 se asignan a las variables ayb respectivamente, y un objeto de cadena con el valor "john" se asigna a la variable c.
Tipos de datos estándar
Los datos almacenados en la memoria pueden ser de muchos tipos. Por ejemplo, la edad de una persona se almacena como un valor numérico y su dirección se almacena como caracteres alfanuméricos. Python tiene varios tipos de datos estándar que se utilizan para definir las operaciones posibles en ellos y el método de almacenamiento para cada uno de ellos.
Python tiene cinco tipos de datos estándar:
- Numbers
- String
- List
- Tuple
- Dictionary
Números de Python
Los tipos de datos numéricos almacenan valores numéricos. Los objetos numéricos se crean cuando les asigna un valor. Por ejemplo
var1 = 1
var2 = 10
También puede eliminar la referencia a un objeto numérico utilizando el deldeclaración. La sintaxis deldel declaración es -
del var1[,var2[,var3[....,varN]]]]
Puede eliminar un solo objeto o varios objetos utilizando el del declaración.
Por ejemplo
del var
del var_a, var_b
Python admite tres tipos numéricos diferentes:
- int (enteros con signo)
- float (valores reales de coma flotante)
- complejo (números complejos)
Todos los enteros en Python3 se representan como enteros largos. Por lo tanto, no existe un tipo de número separado tan largo.
Ejemplos
Aquí hay algunos ejemplos de números:
En t | flotador | complejo |
---|---|---|
10 | 0.0 | 3,14j |
100 | 15.20 | 45.j |
-786 | -21,9 | 9.322e-36j |
080 | 32,3 + e18 | .876j |
-0490 | -90. | -.6545 + 0J |
-0x260 | -32.54e100 | 3e + 26J |
0x69 | 70.2-E12 | 4.53e-7j |
Un número complejo consiste en un par ordenado de números reales en coma flotante denotados por x + yj, donde xey son números reales y j es la unidad imaginaria.
Cadenas de Python
Las cadenas en Python se identifican como un conjunto contiguo de caracteres representados entre comillas. Python permite un par de comillas simples o dobles. Los subconjuntos de cadenas se pueden tomar usando el operador de corte ([] y [:]) con índices que comienzan en 0 al principio de la cadena y van desde -1 hasta el final.
El signo más (+) es el operador de concatenación de cadenas y el asterisco (*) es el operador de repetición. Por ejemplo
#!/usr/bin/python3
str = 'Hello World!'
print (str) # Prints complete string
print (str[0]) # Prints first character of the string
print (str[2:5]) # Prints characters starting from 3rd to 5th
print (str[2:]) # Prints string starting from 3rd character
print (str * 2) # Prints string two times
print (str + "TEST") # Prints concatenated string
Esto producirá el siguiente resultado:
Hello World!
H
llo
llo World!
Hello World!Hello World!
Hello World!TEST
Listas de Python
Las listas son los tipos de datos compuestos más versátiles de Python. Una lista contiene elementos separados por comas y encerrados entre corchetes ([]). Hasta cierto punto, las listas son similares a las matrices en C. Una de las diferencias entre ellas es que todos los elementos que pertenecen a una lista pueden ser de diferentes tipos de datos.
Se puede acceder a los valores almacenados en una lista usando el operador de corte ([] y [:]) con índices que comienzan en 0 al principio de la lista y van hasta el final -1. El signo más (+) es el operador de concatenación de lista y el asterisco (*) es el operador de repetición. Por ejemplo
#!/usr/bin/python3
list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
tinylist = [123, 'john']
print (list) # Prints complete list
print (list[0]) # Prints first element of the list
print (list[1:3]) # Prints elements starting from 2nd till 3rd
print (list[2:]) # Prints elements starting from 3rd element
print (tinylist * 2) # Prints list two times
print (list + tinylist) # Prints concatenated lists
Esto produce el siguiente resultado:
['abcd', 786, 2.23, 'john', 70.200000000000003]
abcd
[786, 2.23]
[2.23, 'john', 70.200000000000003]
[123, 'john', 123, 'john']
['abcd', 786, 2.23, 'john', 70.200000000000003, 123, 'john']
Tuplas de Python
Una tupla es otro tipo de datos de secuencia similar a la lista. Una tupla consta de varios valores separados por comas. Sin embargo, a diferencia de las listas, las tuplas se incluyen entre paréntesis.
La principal diferencia entre listas y tuplas es que las listas se incluyen entre corchetes ([]) y sus elementos y tamaño se pueden cambiar, mientras que las tuplas se incluyen entre paréntesis (()) y no se pueden actualizar. Las tuplas se pueden considerar comoread-onlyliza. Por ejemplo
#!/usr/bin/python3
tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
tinytuple = (123, 'john')
print (tuple) # Prints complete tuple
print (tuple[0]) # Prints first element of the tuple
print (tuple[1:3]) # Prints elements starting from 2nd till 3rd
print (tuple[2:]) # Prints elements starting from 3rd element
print (tinytuple * 2) # Prints tuple two times
print (tuple + tinytuple) # Prints concatenated tuple
Esto produce el siguiente resultado:
('abcd', 786, 2.23, 'john', 70.200000000000003)
abcd
(786, 2.23)
(2.23, 'john', 70.200000000000003)
(123, 'john', 123, 'john')
('abcd', 786, 2.23, 'john', 70.200000000000003, 123, 'john')
El siguiente código no es válido con tupla, porque intentamos actualizar una tupla, lo cual no está permitido. Un caso similar es posible con listas:
#!/usr/bin/python3
tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
tuple[2] = 1000 # Invalid syntax with tuple
list[2] = 1000 # Valid syntax with list
Diccionario de Python
Los diccionarios de Python son una especie de tabla hash. Funcionan como matrices asociativas o hashes que se encuentran en Perl y consisten en pares clave-valor. Una clave de diccionario puede ser casi cualquier tipo de Python, pero generalmente son números o cadenas. Los valores, por otro lado, pueden ser cualquier objeto Python arbitrario.
Los diccionarios están entre llaves ({}) y los valores se pueden asignar y acceder a ellos usando llaves ([]). Por ejemplo
#!/usr/bin/python3
dict = {}
dict['one'] = "This is one"
dict[2] = "This is two"
tinydict = {'name': 'john','code':6734, 'dept': 'sales'}
print (dict['one']) # Prints value for 'one' key
print (dict[2]) # Prints value for 2 key
print (tinydict) # Prints complete dictionary
print (tinydict.keys()) # Prints all the keys
print (tinydict.values()) # Prints all the values
Esto produce el siguiente resultado:
This is one
This is two
{'name': 'john', 'dept': 'sales', 'code': 6734}
dict_keys(['name', 'dept', 'code'])
dict_values(['john', 'sales', 6734])
Los diccionarios no tienen concepto de orden entre los elementos. Es incorrecto decir que los elementos están "fuera de servicio"; simplemente están desordenados.
Conversión de tipo de datos
A veces, es posible que deba realizar conversiones entre los tipos integrados. Para convertir entre tipos, simplemente use los nombres de los tipos como una función.
Hay varias funciones integradas para realizar la conversión de un tipo de datos a otro. Estas funciones devuelven un nuevo objeto que representa el valor convertido.
No Señor. | Función descriptiva |
---|---|
1 | int(x [,base]) Convierte x en un número entero. La base especifica la base si x es una cadena. |
2 | float(x) Convierte x en un número de coma flotante. |
3 | complex(real [,imag]) Crea un número complejo. |
4 | str(x) Convierte el objeto x en una representación de cadena. |
5 | repr(x) Convierte el objeto x en una cadena de expresión. |
6 | eval(str) Evalúa una cadena y devuelve un objeto. |
7 | tuple(s) Convierte sa una tupla. |
8 | list(s) Convierte s en una lista. |
9 | set(s) Convierte s en un conjunto. |
10 | dict(d) Crea un diccionario. d debe ser una secuencia de tuplas (clave, valor). |
11 | frozenset(s) Convierte s en un conjunto congelado. |
12 | chr(x) Convierte un número entero en un carácter. |
13 | unichr(x) Convierte un número entero en un carácter Unicode. |
14 | ord(x) Convierte un solo carácter en su valor entero. |
15 | hex(x) Convierte un número entero en una cadena hexadecimal. |
dieciséis | oct(x) Convierte un número entero en una cadena octal. |
Los operadores son las construcciones que pueden manipular el valor de los operandos. Considere la expresión 4 + 5 = 9. Aquí, 4 y 5 se llaman operandos y + se llama operador.
Tipos de operador
El lenguaje Python admite los siguientes tipos de operadores:
- Operadores aritméticos
- Operadores de comparación (relacionales)
- Operadores de Asignación
- Operadores logicos
- Operadores bit a bit
- Operadores de membresía
- Operadores de identidad
Echemos un vistazo a todos los operadores uno por uno.
Operadores aritméticos de Python
Asumir variable a tiene el valor 10 y la variable b tiene el valor 21, entonces -
Mostrar ejemplo
Operador | Descripción | Ejemplo |
---|---|---|
+ Adición | Agrega valores a ambos lados del operador. | a + b = 31 |
- resta | Resta el operando de la mano derecha del operando de la mano izquierda. | a - b = -11 |
* Multiplicación | Multiplica los valores a ambos lados del operador | a * b = 210 |
/ División | Divide el operando de la izquierda por el operando de la derecha | b / a = 2,1 |
% Módulo | Divide el operando de la izquierda por el operando de la derecha y devuelve el resto | b% a = 1 |
** exponente | Realiza cálculos exponenciales (potencia) en los operadores | a ** b = 10 elevado a 20 |
// | Floor Division: la división de operandos donde el resultado es el cociente en el que se eliminan los dígitos después del punto decimal. Pero si uno de los operandos es negativo, el resultado es floored, es decir, se redondea desde cero (hacia el infinito negativo): | 9 // 2 = 4 y 9.0 // 2.0 = 4.0, -11 // 3 = -4, -11.0 // 3 = -4.0 |
Operadores de comparación de Python
Estos operadores comparan los valores a cada lado de ellos y deciden la relación entre ellos. También se denominan operadores relacionales.
Asumir variable a tiene el valor 10 y la variable b tiene el valor 20, entonces -
Mostrar ejemplo
Operador | Descripción | Ejemplo |
---|---|---|
== | Si los valores de dos operandos son iguales, la condición se cumple. | (a == b) no es cierto. |
! = | Si los valores de dos operandos no son iguales, la condición se vuelve verdadera. | (a! = b) es cierto. |
> | Si el valor del operando izquierdo es mayor que el valor del operando derecho, la condición se vuelve verdadera. | (a> b) no es cierto. |
< | Si el valor del operando izquierdo es menor que el valor del operando derecho, la condición se vuelve verdadera. | (a <b) es cierto. |
> = | Si el valor del operando izquierdo es mayor o igual que el valor del operando derecho, la condición se convierte en verdadera. | (a >= b) is not true. |
<= | If the value of left operand is less than or equal to the value of right operand, then condition becomes true. | (a <= b) is true. |
Python Assignment Operators
Assume variable a holds the value 10 and variable b holds the value 20, then −
Show Example
Operator | Description | Example |
---|---|---|
= | Assigns values from right side operands to left side operand | c = a + b assigns value of a + b into c |
+= Add AND | It adds right operand to the left operand and assign the result to left operand | c += a is equivalent to c = c + a |
-= Subtract AND | It subtracts right operand from the left operand and assign the result to left operand | c -= a is equivalent to c = c - a |
*= Multiply AND | It multiplies right operand with the left operand and assign the result to left operand | c *= a is equivalent to c = c * a |
/= Divide AND | It divides left operand with the right operand and assign the result to left operand | c /= a is equivalent to c = c / ac /= a is equivalent to c = c / a |
%= Modulus AND | It takes modulus using two operands and assign the result to left operand | c %= a is equivalent to c = c % a |
**= Exponent AND | Performs exponential (power) calculation on operators and assign value to the left operand | c **= a is equivalent to c = c ** a |
//= Floor Division | It performs floor division on operators and assign value to the left operand | c //= a is equivalent to c = c // a |
Python Bitwise Operators
Bitwise operator works on bits and performs bit-by-bit operation. Assume if a = 60; and b = 13; Now in binary format they will be as follows −
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
Python's built-in function bin() can be used to obtain binary representation of an integer number.
The following Bitwise operators are supported by Python language −
Show Example
Operator | Description | Example |
---|---|---|
& Binary AND | Operator copies a bit, to the result, if it exists in both operands | (a & b) (means 0000 1100) |
| Binary OR | It copies a bit, if it exists in either operand. | (a | b) = 61 (means 0011 1101) |
^ Binary XOR | It copies the bit, if it is set in one operand but not both. | (a ^ b) = 49 (means 0011 0001) |
~ Binary Ones Complement | It is unary and has the effect of 'flipping' bits. | (~a ) = -61 (means 1100 0011 in 2's complement form due to a signed binary number. |
<< Binary Left Shift | The left operand's value is moved left by the number of bits specified by the right operand. | a << 2 = 240 (means 1111 0000) |
>> Binary Right Shift | The left operand's value is moved right by the number of bits specified by the right operand. | a >> 2 = 15 (means 0000 1111) |
Python Logical Operators
The following logical operators are supported by Python language. Assume variable a holds True and variable b holds False then −
Show Example
Operator | Description | Example |
---|---|---|
and Logical AND | If both the operands are true then condition becomes true. | (a and b) is False. |
or Logical OR | If any of the two operands are non-zero then condition becomes true. | (a or b) is True. |
not Logical NOT | Used to reverse the logical state of its operand. | Not(a and b) is True. |
Python Membership Operators
Python’s membership operators test for membership in a sequence, such as strings, lists, or tuples. There are two membership operators as explained below −
Show Example
Operator | Description | Example |
---|---|---|
in | Evaluates to true if it finds a variable in the specified sequence and false otherwise. | x in y, here in results in a 1 if x is a member of sequence y. |
not in | Evaluates to true if it does not finds a variable in the specified sequence and false otherwise. | x not in y, here not in results in a 1 if x is not a member of sequence y. |
Python Identity Operators
Identity operators compare the memory locations of two objects. There are two Identity operators as explained below −
Show Example
Operator | Description | Example |
---|---|---|
is | Evaluates to true if the variables on either side of the operator point to the same object and false otherwise. | x is y, here is results in 1 if id(x) equals id(y). |
is not | Evaluates to false if the variables on either side of the operator point to the same object and true otherwise. | x is not y, here is not results in 1 if id(x) is not equal to id(y). |
Precedencia de operadores de Python
La siguiente tabla enumera todos los operadores desde la precedencia más alta hasta la más baja.
Mostrar ejemplo
No Señor. | Operador y descripción |
---|---|
1 | ** Exponenciación (subir al poder) |
2 | ~ + - Complemento, unario más y menos (los nombres de los dos últimos métodos son + @ y - @) |
3 | * / % // Multiplica, divide, módulo y división de piso |
4 | + - Adición y sustracción |
5 | >> << Desplazamiento bit a bit a derecha e izquierda |
6 | & Bit a bit 'Y' |
7 | ^ | "OR" exclusivo bit a bit y "OR" regular |
8 | <= < > >= Operadores de comparación |
9 | <> == != Operadores de igualdad |
10 | = %= /= //= -= += *= **= Operadores de Asignación |
11 | is is not Operadores de identidad |
12 | in not in Operadores de membresía |
13 | not or and Operadores logicos |
La toma de decisiones es la anticipación de las condiciones que ocurren durante la ejecución de un programa y las acciones específicas tomadas de acuerdo con las condiciones.
Las estructuras de decisión evalúan múltiples expresiones, que producen VERDADERO o FALSO como resultado. Debe determinar qué acción tomar y qué declaraciones ejecutar si el resultado es VERDADERO o FALSO en caso contrario.
A continuación se muestra la forma general de una estructura de toma de decisiones típica que se encuentra en la mayoría de los lenguajes de programación:
El lenguaje de programación Python asume cualquier non-zero y non-null valores como VERDADERO, y cualquier zero o null values como valor FALSO.
El lenguaje de programación Python proporciona los siguientes tipos de declaraciones para la toma de decisiones.
No Señor. | Declaración y descripción |
---|---|
1 | si declaraciones Un if statement consta de una expresión booleana seguida de una o más declaraciones. |
2 | declaraciones if ... else Un if statement puede ir seguido de un opcional else statement, que se ejecuta cuando la expresión booleana es FALSE. |
3 | declaraciones if anidadas Puedes usar uno if o else if declaración dentro de otra if o else if declaración (s). |
Repasemos rápidamente cada declaración de toma de decisiones.
Suites de declaración única
Si la suite de un if La cláusula consta solo de una línea, puede ir en la misma línea que la declaración del encabezado.
Ejemplo
Aquí hay un ejemplo de one-line if cláusula -
#!/usr/bin/python3
var = 100
if ( var == 100 ) : print ("Value of expression is 100")
print ("Good bye!")
Salida
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Value of expression is 100
Good bye!
En general, las sentencias se ejecutan secuencialmente: la primera sentencia de una función se ejecuta primero, seguida de la segunda, y así sucesivamente. Puede haber una situación en la que necesite ejecutar un bloque de código varias veces.
Los lenguajes de programación proporcionan varias estructuras de control que permiten rutas de ejecución más complicadas.
Una declaración de bucle nos permite ejecutar una declaración o grupo de declaraciones varias veces. El siguiente diagrama ilustra una declaración de bucle:
El lenguaje de programación Python proporciona los siguientes tipos de bucles para manejar los requisitos de bucles.
No Señor. | Tipo de bucle y descripción |
---|---|
1 | while loop Repite una declaración o grupo de declaraciones mientras una condición determinada es VERDADERA. Prueba la condición antes de ejecutar el cuerpo del bucle. |
2 | en bucle Ejecuta una secuencia de declaraciones varias veces y abrevia el código que administra la variable de ciclo. |
3 | bucles anidados Puede usar uno o más bucles dentro de cualquier otro bucle while o for. |
Declaraciones de control de bucle
Las sentencias de control de bucle cambian la ejecución de su secuencia normal. Cuando la ejecución sale de un ámbito, todos los objetos automáticos que se crearon en ese ámbito se destruyen.
Python admite las siguientes declaraciones de control.
No Señor. | Declaración de control y descripción |
---|---|
1 | declaración de ruptura Termina la instrucción de bucle y transfiere la ejecución a la instrucción que sigue inmediatamente al bucle. |
2 | Continuar declaración Hace que el bucle omita el resto de su cuerpo e inmediatamente vuelva a probar su condición antes de reiterar. |
3 | pasar declaración La declaración de paso en Python se usa cuando se requiere una declaración sintácticamente pero no desea que se ejecute ningún comando o código. |
Repasemos brevemente las declaraciones de control de bucle.
Iterador y generador
Iteratores un objeto que permite a un programador atravesar todos los elementos de una colección, independientemente de su implementación específica. En Python, un objeto iterador implementa dos métodos,iter() y next().
Los objetos String, List o Tuple se pueden utilizar para crear un iterador.
list = [1,2,3,4]
it = iter(list) # this builds an iterator object
print (next(it)) #prints next available element in iterator
Iterator object can be traversed using regular for statement
!usr/bin/python3
for x in it:
print (x, end=" ")
or using next() function
while True:
try:
print (next(it))
except StopIteration:
sys.exit() #you have to import sys module for this
UN generator es una función que produce o produce una secuencia de valores usando el método de rendimiento.
Cuando se llama a una función generadora, devuelve un objeto generador sin siquiera comenzar la ejecución de la función. Cuando se llama al método next () por primera vez, la función comienza a ejecutarse hasta que alcanza la declaración de rendimiento, que devuelve el valor obtenido. El rendimiento realiza un seguimiento, es decir, recuerda la última ejecución y la segunda llamada next () continúa desde el valor anterior.
Ejemplo
El siguiente ejemplo define un generador, que genera un iterador para todos los números de Fibonacci.
#!usr/bin/python3
import sys
def fibonacci(n): #generator function
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(5) #f is iterator object
while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()
Los tipos de datos numéricos almacenan valores numéricos. Son tipos de datos inmutables. Esto significa que cambiar el valor de un tipo de datos numérico da como resultado un objeto recién asignado.
Los objetos numéricos se crean cuando les asigna un valor. Por ejemplo
var1 = 1
var2 = 10
También puede eliminar la referencia a un objeto numérico utilizando el deldeclaración. La sintaxis deldel declaración es -
del var1[,var2[,var3[....,varN]]]]
Puede eliminar un solo objeto o varios objetos utilizando el deldeclaración. Por ejemplo
del var
del var_a, var_b
Python admite diferentes tipos numéricos:
int (signed integers) - A menudo se les llama simplemente números enteros o ints. Son números enteros positivos o negativos sin punto decimal. Los enteros en Python 3 son de tamaño ilimitado. Python 2 tiene dos tipos de enteros: int y long. No hay 'long integer'en Python 3 ya.
float (floating point real values)- También llamados flotantes, representan números reales y se escriben con un punto decimal dividiendo el entero y la fracción. Los flotadores también pueden estar en notación científica, con E o e indicando la potencia de 10 (2.5e2 = 2.5 x 10 2 = 250).
complex (complex numbers)- son de la forma a + bJ, donde a y b son flotantes y J (o j) representa la raíz cuadrada de -1 (que es un número imaginario). La parte real del número es a y la parte imaginaria es b. Los números complejos no se usan mucho en la programación de Python.
Es posible representar un número entero en forma hexadecimal u octal
>>> number = 0xA0F #Hexa-decimal
>>> number
2575
>>> number = 0o37 #Octal
>>> number
31
Ejemplos
A continuación se muestran algunos ejemplos de números.
En t | flotador | complejo |
---|---|---|
10 | 0.0 | 3,14j |
100 | 15.20 | 45.j |
-786 | -21,9 | 9.322e-36j |
080 | 32,3 + e18 | .876j |
-0490 | -90. | -.6545 + 0J |
-0 × 260 | -32.54e100 | 3e + 26J |
0 × 69 | 70.2-E12 | 4.53e-7j |
Un número complejo consiste en un par ordenado de números reales en coma flotante denotados por a + bj, donde a es la parte real y b es la parte imaginaria del número complejo.
Conversión de tipo de número
Python convierte los números internamente en una expresión que contiene tipos mixtos a un tipo común para su evaluación. A veces, es necesario forzar un número explícitamente de un tipo a otro para satisfacer los requisitos de un operador o parámetro de función.
Tipo int(x) para convertir x en un entero llano.
Tipo long(x) para convertir x en un entero largo.
Tipo float(x) para convertir x en un número de punto flotante.
Tipo complex(x) para convertir x en un número complejo con parte real x y parte imaginaria cero.
Tipo complex(x, y)para convertir xey en un número complejo con parte real xy parte imaginaria y. xey son expresiones numéricas
Funciones Matemáticas
Python incluye las siguientes funciones que realizan cálculos matemáticos.
No Señor. | Función y devoluciones (descripción) |
---|---|
1 | abs (x) El valor absoluto de x: la distancia (positiva) entre x y cero. |
2 | techo (x) El techo de x: el número entero más pequeño no menor que x. |
3 | cmp(x, y) -1 si x <y, 0 si x == y, o 1 si x> y. Deprecated en Python 3. En su lugar, utilice return (x>y)-(x<y). |
4 | exp (x) El exponencial de x: e x |
5 | fabulosos (x) El valor absoluto de x. |
6 | piso (x) El piso de x: el entero más grande no mayor que x. |
7 | registro (x) El logaritmo natural de x, para x> 0. |
8 | log10 (x) El logaritmo en base 10 de x para x> 0. |
9 | máx (x1, x2, ...) El mayor de sus argumentos: el valor más cercano al infinito positivo |
10 | min (x1, x2, ...) El más pequeño de sus argumentos: el valor más cercano al infinito negativo. |
11 | modf (x) Las partes fraccionarias y enteras de x en una tupla de dos elementos. Ambas partes tienen el mismo signo que x. La parte entera se devuelve como flotante. |
12 | pow (x, y) El valor de x ** y. |
13 | ronda (x [, n]) xredondeado an dígitos desde el punto decimal. Python se redondea desde cero como un desempate: la ronda (0.5) es 1.0 y la ronda (-0.5) es -1.0. |
14 | sqrt (x) La raíz cuadrada de x para x> 0. |
Funciones de números aleatorios
Los números aleatorios se utilizan para juegos, simulaciones, pruebas, aplicaciones de seguridad y privacidad. Python incluye las siguientes funciones que se utilizan comúnmente.
No Señor. | Función descriptiva |
---|---|
1 | elección (seq) Un elemento aleatorio de una lista, tupla o cadena. |
2 | rango aleatorio ([inicio,] parada [, paso]) Un elemento seleccionado al azar del rango (inicio, parada, paso). |
3 | aleatorio() Un flotante aleatorio r, tal que 0 es menor o igual que r y r es menor que 1 |
4 | semilla ([x]) Establece el valor inicial entero que se utiliza para generar números aleatorios. Llame a esta función antes de llamar a cualquier otra función de módulo aleatorio. Devuelve Ninguno. |
5 | barajar (lst) Aleatoriza los elementos de una lista en su lugar. Devuelve Ninguno. |
6 | uniforme (x, y) Un flotador aleatorio r, tal que x es menor o igual que r y r es menor que y. |
Funciones trigonométricas
Python incluye las siguientes funciones que realizan cálculos trigonométricos.
No Señor. | Función descriptiva |
---|---|
1 | acos (x) Devuelve el arco coseno de x, en radianes. |
2 | asin (x) Devuelve el arco seno de x, en radianes. |
3 | atan (x) Devuelve el arco tangente de x, en radianes. |
4 | atan2 (y, x) Devuelve atan (y / x), en radianes. |
5 | cos (x) Devuelve el coseno de x radianes. |
6 | hipot (x, y) Devuelve la norma euclidiana, sqrt (x * x + y * y). |
7 | pecado (x) Devuelve el seno de x radianes. |
8 | bronceado (x) Devuelve la tangente de x radianes. |
9 | grados (x) Convierte el ángulo x de radianes a grados. |
10 | radianes (x) Convierte el ángulo x de grados a radianes. |
Constantes Matemáticas
El módulo también define dos constantes matemáticas:
No Señor. | Constantes y descripción |
---|---|
1 | pi La constante matemática pi. |
2 | e La constante matemática e. |
Las cadenas se encuentran entre los tipos más populares de Python. Podemos crearlos simplemente entre comillas. Python trata las comillas simples de la misma forma que las comillas dobles. Crear cadenas es tan simple como asignar un valor a una variable. Por ejemplo
var1 = 'Hello World!'
var2 = "Python Programming"
Acceder a valores en cadenas
Python no admite un tipo de carácter; estos se tratan como cadenas de longitud uno, por lo que también se consideran una subcadena.
Para acceder a las subcadenas, use los corchetes para cortar junto con el índice o índices para obtener su subcadena. Por ejemplo
#!/usr/bin/python3
var1 = 'Hello World!'
var2 = "Python Programming"
print ("var1[0]: ", var1[0])
print ("var2[1:5]: ", var2[1:5])
Cuando se ejecuta el código anterior, produce el siguiente resultado:
var1[0]: H
var2[1:5]: ytho
Actualizar cadenas
Puede "actualizar" una cadena existente (re) asignando una variable a otra cadena. El nuevo valor puede estar relacionado con su valor anterior o con una cadena completamente diferente. Por ejemplo
#!/usr/bin/python3
var1 = 'Hello World!'
print ("Updated String :- ", var1[:6] + 'Python')
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Updated String :- Hello Python
Personajes de escape
La siguiente tabla es una lista de caracteres de escape o no imprimibles que se pueden representar con notación de barra invertida.
Se interpreta un carácter de escape; en cadenas de comillas simples y dobles.
Notación de barra invertida | Carácter hexadecimal | Descripción |
---|---|---|
\un | 0x07 | Campana o alerta |
\segundo | 0x08 | Retroceso |
\ cx | Control-x | |
\ Cx | Control-x | |
\mi | 0x1b | Escapar |
\F | 0x0c | Formfeed |
\ M- \ Cx | Meta-Control-x | |
\norte | 0x0a | Nueva línea |
\ nnn | Notación octal, donde n está en el rango 0,7 | |
\ r | 0x0d | Retorno de carro |
\ s | 0x20 | Espacio |
\ t | 0x09 | Lengüeta |
\ v | 0x0b | Pestaña vertical |
\X | Personaje x | |
\ xnn | Notación hexadecimal, donde n está en el rango 0,9, af o AF |
Operadores especiales de cadena
Asumir variable de cadena a contiene 'Hola' y variable b sostiene 'Python', luego -
Operador | Descripción | Ejemplo |
---|---|---|
+ | Concatenación: agrega valores a ambos lados del operador | a + b dará HelloPython |
* | Repetición: crea nuevas cadenas, concatenando varias copias de la misma cadena | un * 2 dará -Hola, hola |
[] | Slice: da el carácter del índice dado | a [1] dará e |
[:] | Rebanada de rango: da a los personajes del rango dado | a [1: 4] dará ell |
en | Membresía: devuelve verdadero si existe un carácter en la cadena dada | H en a dará 1 |
no en | Membresía: devuelve verdadero si un carácter no existe en la cadena dada | M no en un daré 1 |
r / R | Cadena sin formato: suprime el significado real de los caracteres de escape. La sintaxis de las cadenas sin formato es exactamente la misma que la de las cadenas normales con la excepción del operador de cadena sin formato, la letra "r", que precede a las comillas. La "r" puede ser minúscula (r) o mayúscula (R) y debe colocarse inmediatamente antes de la primera comilla. | imprime r '\ n' impresiones \ ny imprime R '\ n' impresiones \ n |
% | Formato: realiza el formato de cadena | Ver en la siguiente sección |
Operador de formato de cadena
Una de las mejores características de Python es el operador de formato de cadena%. Este operador es exclusivo de las cadenas y compensa el paquete de funciones de la familia printf () de C. A continuación se muestra un ejemplo simple:
#!/usr/bin/python3
print ("My name is %s and weight is %d kg!" % ('Zara', 21))
Cuando se ejecuta el código anterior, produce el siguiente resultado:
My name is Zara and weight is 21 kg!
Aquí está la lista del conjunto completo de símbolos que se pueden usar junto con% -
No Señor. | Símbolo de formato y conversión |
---|---|
1 | %c personaje |
2 | %s conversión de cadenas a través de str () antes de formatear |
3 | %i entero decimal con signo |
4 | %d entero decimal con signo |
5 | %u entero decimal sin signo |
6 | %o entero octal |
7 | %x entero hexadecimal (letras minúsculas) |
8 | %X entero hexadecimal (letras MAYÚSCULAS) |
9 | %e notación exponencial (con 'e' minúscula) |
10 | %E notación exponencial (con MAYÚSCULAS 'E') |
11 | %f número real de coma flotante |
12 | %g el más corto de% f y% e |
13 | %G el más corto de% f y% E |
Otros símbolos y funciones compatibles se enumeran en la siguiente tabla:
No Señor. | Símbolo y funcionalidad |
---|---|
1 | * argumento especifica ancho o precisión |
2 | - justificación a la izquierda |
3 | + mostrar el letrero |
4 | <sp> dejar un espacio en blanco antes de un número positivo |
5 | # agregue el cero inicial octal ('0') o el inicial hexadecimal '0x' o '0X', dependiendo de si se usaron 'x' o 'X'. |
6 | 0 pad de izquierda a derecha con ceros (en lugar de espacios) |
7 | % '%%' te deja con un solo literal '%' |
8 | (var) variable de mapeo (argumentos de diccionario) |
9 | m.n. m es el ancho total mínimo yn es el número de dígitos que se mostrarán después del punto decimal (si corresponde) |
Cotizaciones triples
Las comillas triples de Python vienen al rescate al permitir que las cadenas abarquen varias líneas, incluidas las NEWLINEs textuales, TAB y cualquier otro carácter especial.
La sintaxis de las comillas triples consta de tres single or double citas.
#!/usr/bin/python3
para_str = """this is a long string that is made up of
several lines and non-printable characters such as
TAB ( \t ) and they will show up that way when displayed.
NEWLINEs within the string, whether explicitly given like
this within the brackets [ \n ], or just a NEWLINE within
the variable assignment will also show up.
"""
print (para_str)
Cuando se ejecuta el código anterior, produce el siguiente resultado. Observe cómo cada carácter especial se ha convertido a su forma impresa, hasta la última NEWLINE al final de la cadena entre "arriba". y cierre de comillas triples. También tenga en cuenta que las NEWLINEs ocurren con un retorno de carro explícito al final de una línea o su código de escape (\ n) -
this is a long string that is made up of
several lines and non-printable characters such as
TAB ( ) and they will show up that way when displayed.
NEWLINEs within the string, whether explicitly given like
this within the brackets [
], or just a NEWLINE within
the variable assignment will also show up.
Las cadenas sin formato no tratan la barra invertida como un carácter especial en absoluto. Cada carácter que pones en una cadena cruda permanece como lo escribiste:
#!/usr/bin/python3
print ('C:\\nowhere')
Cuando se ejecuta el código anterior, produce el siguiente resultado:
C:\nowhere
Ahora hagamos uso de una cuerda sin procesar. Pondríamos expresión enr'expression' como sigue -
#!/usr/bin/python3
print (r'C:\\nowhere')
Cuando se ejecuta el código anterior, produce el siguiente resultado:
C:\\nowhere
Cadena Unicode
En Python 3, todas las cadenas están representadas en Unicode, en Python 2 se almacenan internamente como ASCII de 8 bits, por lo que es necesario adjuntar 'u' para convertirlo en Unicode. Ya no es necesario ahora.
Métodos de cadena incorporados
Python incluye los siguientes métodos integrados para manipular cadenas:
No Señor. | Métodos y descripción |
---|---|
1 | capitalizar() Capitaliza la primera letra de la cadena |
2 | centro (ancho, relleno) Devuelve una cadena rellenada con fillchar con la cadena original centrada en un total de columnas de ancho . |
3 | count (str, beg = 0, end = len (string)) Cuenta cuántas veces aparece str en una cadena o en una subcadena de cadena si se dan inicio del índice inicial y final del índice final. |
4 | decodificar (codificación = 'UTF-8', errores = 'estricto') Decodifica la cadena utilizando el códec registrado para la codificación. codificación tiene como valor predeterminado la codificación de cadena predeterminada. |
5 | codificar (codificación = 'UTF-8', errores = 'estricto') Devuelve la versión de cadena codificada de la cadena; en caso de error, el valor predeterminado es generar un ValueError a menos que se indique un error con 'ignorar' o 'reemplazar'. |
6 | termina con (sufijo, inicio = 0, final = longitud (cadena)) Determina si la cadena o una subcadena de cadena (si se dan el inicio del índice inicial y el final del índice final) termina con sufijo; devuelve verdadero si es así y falso en caso contrario. |
7 | expandtabs (tabsize = 8) Expande las pestañas en cadena a varios espacios; el valor predeterminado es 8 espacios por pestaña si no se proporciona el tamaño de la pestaña. |
8 | buscar (str, beg = 0 end = len (string)) Determine si str ocurre en una cadena o en una subcadena de cadena si se dan inicio del índice inicial y final del índice final devuelve índice si se encuentra y -1 en caso contrario. |
9 | índice (str, beg = 0, end = len (string)) Igual que find (), pero genera una excepción si no se encuentra str. |
10 | isalnum () Devuelve verdadero si la cadena tiene al menos 1 carácter y todos los caracteres son alfanuméricos y falso en caso contrario. |
11 | isalpha () Devuelve verdadero si la cadena tiene al menos 1 carácter y todos los caracteres son alfabéticos y falso en caso contrario. |
12 | isdigit () Devuelve verdadero si la cadena contiene solo dígitos y falso en caso contrario. |
13 | es bajo() Devuelve verdadero si la cadena tiene al menos 1 carácter en mayúscula y todos los caracteres en mayúscula están en minúsculas y falso en caso contrario. |
14 | isnumeric () Devuelve verdadero si una cadena Unicode contiene solo caracteres numéricos y falso en caso contrario. |
15 | isspace () Devuelve verdadero si la cadena contiene solo caracteres de espacio en blanco y falso en caso contrario. |
dieciséis | istitle () Devuelve verdadero si la cadena está correctamente "titulada" y falsa en caso contrario. |
17 | isupper () Devuelve verdadero si la cadena tiene al menos un carácter en mayúscula y todos los caracteres en mayúscula están en mayúsculas y falso en caso contrario. |
18 | unirse (seq) Fusiona (concatena) las representaciones de cadena de elementos en secuencia seq en una cadena, con cadena de separación. |
19 | len (cuerda) Devuelve la longitud de la cadena. |
20 | ljust (ancho [, fillchar]) Devuelve una cadena rellenada con espacios con la cadena original justificada a la izquierda hasta un total de columnas de ancho. |
21 | inferior() Convierte todas las letras mayúsculas en una cadena a minúsculas. |
22 | lstrip () Elimina todos los espacios en blanco iniciales de la cadena. |
23 | maketrans () Devuelve una tabla de traducción que se utilizará en la función de traducción. |
24 | max (str) Devuelve el carácter alfabético máximo de la cadena str. |
25 | min (str) Devuelve el carácter alfabético mínimo de la cadena str. |
26 | reemplazar (antiguo, nuevo [, máx.]) Reemplaza todas las apariciones de lo antiguo en la cadena por nuevas o como máximo las apariciones máximas si se indica el máximo. |
27 | rfind (str, beg = 0, end = len (string)) Igual que find (), pero busca hacia atrás en una cadena. |
28 | rindex (str, beg = 0, end = len (string)) Igual que index (), pero busca hacia atrás en la cadena. |
29 | rjust (ancho, [, fillchar]) Devuelve una cadena rellenada con espacios con la cadena original justificada a la derecha hasta un total de columnas de ancho. |
30 | rstrip () Elimina todos los espacios en blanco finales de la cadena. |
31 | split (str = "", num = string.count (str)) Divide la cadena de acuerdo con el delimitador str (espacio si no se proporciona) y devuelve la lista de subcadenas; dividir en un máximo de num subcadenas si se dan. |
32 | splitlines (num = string.count ('\ n')) Divide la cadena en todas (o en número) NEWLINEs y devuelve una lista de cada línea sin NEWLINEs. |
33 | empieza con (str, beg = 0, end = len (string)) Determina si la cadena o una subcadena de cadena (si se dan el inicio del índice inicial y el final del índice final) comienza con la subcadena str; devuelve verdadero si es así y falso en caso contrario. |
34 | tira ([caracteres]) Realiza tanto lstrip () como rstrip () en una cadena |
35 | swapcase () Invierte mayúsculas y minúsculas para todas las letras de la cadena. |
36 | título() Devuelve la versión "con título" de la cadena, es decir, todas las palabras comienzan en mayúsculas y el resto en minúsculas. |
37 | traducir (tabla, deletechars = "") Traduce la cadena de acuerdo con la tabla de traducción str (256 caracteres), eliminando los de la cadena del. |
38 | Superior() Convierte letras minúsculas en una cadena a mayúsculas. |
39 | zfill (ancho) Devuelve la cadena original rellenada a la izquierda con ceros hasta un total de caracteres de ancho; destinado a números, zfill () conserva cualquier signo dado (menos un cero). |
40 | isdecimal () Devuelve verdadero si una cadena Unicode contiene solo caracteres decimales y falso en caso contrario. |
La estructura de datos más básica en Python es la sequence. A cada elemento de una secuencia se le asigna un número: su posición o índice. El primer índice es cero, el segundo índice es uno y así sucesivamente.
Python tiene seis tipos de secuencias integradas, pero las más comunes son listas y tuplas, que veríamos en este tutorial.
Hay ciertas cosas que puede hacer con todos los tipos de secuencia. Estas operaciones incluyen indexar, dividir, agregar, multiplicar y verificar la pertenencia. Además, Python tiene funciones integradas para encontrar la longitud de una secuencia y para encontrar sus elementos más grandes y más pequeños.
Listas de Python
La lista es el tipo de datos más versátil disponible en Python, que se puede escribir como una lista de valores (elementos) separados por comas entre corchetes. Lo importante de una lista es que los elementos de una lista no necesitan ser del mismo tipo.
Crear una lista es tan simple como poner diferentes valores separados por comas entre corchetes. Por ejemplo
list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5 ];
list3 = ["a", "b", "c", "d"];
De manera similar a los índices de cadena, los índices de lista comienzan en 0 y las listas se pueden dividir, concatenar, etc.
Acceder a valores en listas
Para acceder a los valores en las listas, use los corchetes para cortar junto con el índice o índices para obtener el valor disponible en ese índice. Por ejemplo
#!/usr/bin/python3
list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5, 6, 7 ]
print ("list1[0]: ", list1[0])
print ("list2[1:5]: ", list2[1:5])
Cuando se ejecuta el código anterior, produce el siguiente resultado:
list1[0]: physics
list2[1:5]: [2, 3, 4, 5]
Actualización de listas
Puede actualizar uno o varios elementos de listas dando el segmento en el lado izquierdo del operador de asignación, y puede agregar elementos en una lista con el método append (). Por ejemplo
#!/usr/bin/python3
list = ['physics', 'chemistry', 1997, 2000]
print ("Value available at index 2 : ", list[2])
list[2] = 2001
print ("New value available at index 2 : ", list[2])
Note - El método append () se analiza en la sección siguiente.
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Value available at index 2 : 1997
New value available at index 2 : 2001
Eliminar elementos de la lista
Para eliminar un elemento de la lista, puede utilizar el deldeclaración si sabe exactamente qué elemento (s) está eliminando. Puede utilizar el método remove () si no sabe exactamente qué elementos eliminar. Por ejemplo
#!/usr/bin/python3
list = ['physics', 'chemistry', 1997, 2000]
print (list)
del list[2]
print ("After deleting value at index 2 : ", list)
Cuando se ejecuta el código anterior, produce el siguiente resultado:
['physics', 'chemistry', 1997, 2000]
After deleting value at index 2 : ['physics', 'chemistry', 2000]
Note - El método remove () se analiza en la sección siguiente.
Operaciones básicas de lista
Las listas responden a los operadores + y * como cadenas; también aquí se refieren a la concatenación y la repetición, excepto que el resultado es una nueva lista, no una cadena.
De hecho, las listas responden a todas las operaciones generales de secuencia que usamos en cadenas en el capítulo anterior.
Expresión de Python | Resultados | Descripción |
---|---|---|
len ([1, 2, 3]) | 3 | Longitud |
[1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | Concatenación |
['¡Hola!'] * 4 | ['¡Hola!', '¡Hola!', '¡Hola!', '¡Hola!'] | Repetición |
3 en [1, 2, 3] | Cierto | Afiliación |
para x en [1,2,3]: print (x, end = '') | 1 2 3 | Iteración |
Indexación, rebanado y matrices
Dado que las listas son secuencias, la indexación y el corte funcionan de la misma manera para las listas que para las cadenas.
Suponiendo la siguiente entrada:
L = ['C++'', 'Java', 'Python']
Expresión de Python | Resultados | Descripción |
---|---|---|
L [2] | 'Pitón' | Las compensaciones comienzan en cero |
L [-2] | 'Java' | Negativo: cuenta desde la derecha |
L [1:] | ['Java', 'Python'] | Cortar recupera secciones |
Funciones y métodos de lista integrados
Python incluye las siguientes funciones de lista:
No Señor. | Función descriptiva |
---|---|
1 | len (lista) Da la longitud total de la lista. |
2 | max (lista) Devuelve el artículo de la lista con el valor máximo. |
3 | min (lista) Devuelve el artículo de la lista con valor mínimo. |
4 | lista (seq) Convierte una tupla en una lista. |
Python incluye los siguientes métodos de lista:
No Señor. | Métodos y descripción |
---|---|
1 | list.append (obj) Agrega el objeto obj a la lista |
2 | list.count (obj) Devuelve el recuento de cuántas veces aparece obj en la lista |
3 | list.extend (seq) Agrega el contenido de seq a la lista |
4 | list.index (obj) Devuelve el índice más bajo en la lista que aparece obj |
5 | list.insert (índice, obj) Inserta el objeto obj en la lista en el índice de desplazamiento |
6 | list.pop (obj = list [-1]) Elimina y devuelve el último objeto u obj de la lista |
7 | list.remove (obj) Elimina el objeto obj de la lista |
8 | list.reverse () Invierte los objetos de la lista en su lugar |
9 | list.sort ([func]) Ordena los objetos de la lista, use la función de comparación si se proporciona |
Una tupla es una colección de objetos ordenados e inmutables. Las tuplas son secuencias, como listas. La principal diferencia entre las tuplas y las listas es que las tuplas no se pueden cambiar a diferencia de las listas. Las tuplas usan paréntesis, mientras que las listas usan corchetes.
Crear una tupla es tan simple como poner diferentes valores separados por comas. Opcionalmente, también puede poner estos valores separados por comas entre paréntesis. Por ejemplo
tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"
La tupla vacía se escribe como dos paréntesis que no contienen nada:
tup1 = ();
Para escribir una tupla que contenga un solo valor, debe incluir una coma, aunque solo haya un valor:
tup1 = (50,)
Al igual que los índices de cadena, los índices de tupla comienzan en 0 y se pueden cortar, concatenar, etc.
Acceder a valores en tuplas
Para acceder a los valores en tupla, use los corchetes para cortar junto con el índice o índices para obtener el valor disponible en ese índice. Por ejemplo
#!/usr/bin/python3
tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])
Cuando se ejecuta el código anterior, produce el siguiente resultado:
tup1[0]: physics
tup2[1:5]: (2, 3, 4, 5)
Actualizar tuplas
Las tuplas son inmutables, lo que significa que no puede actualizar ni cambiar los valores de los elementos de la tupla. Puede tomar partes de las tuplas existentes para crear nuevas tuplas, como lo demuestra el siguiente ejemplo:
#!/usr/bin/python3
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
# Following action is not valid for tuples
# tup1[0] = 100;
# So let's create a new tuple as follows
tup3 = tup1 + tup2
print (tup3)
Cuando se ejecuta el código anterior, produce el siguiente resultado:
(12, 34.56, 'abc', 'xyz')
Eliminar elementos de tupla
No es posible eliminar elementos de tupla individuales. Por supuesto, no hay nada de malo en armar otra tupla con los elementos no deseados descartados.
Para eliminar explícitamente una tupla completa, simplemente use el deldeclaración. Por ejemplo
#!/usr/bin/python3
tup = ('physics', 'chemistry', 1997, 2000);
print (tup)
del tup;
print ("After deleting tup : ")
print (tup)
Esto produce el siguiente resultado.
Note- Se plantea una excepción. Esto es porque despuesdel tup, la tupla ya no existe.
('physics', 'chemistry', 1997, 2000)
After deleting tup :
Traceback (most recent call last):
File "test.py", line 9, in <module>
print tup;
NameError: name 'tup' is not defined
Operaciones básicas de tuplas
Las tuplas responden a los operadores + y * como cadenas; aquí también se refieren a la concatenación y la repetición, excepto que el resultado es una nueva tupla, no una cadena.
De hecho, las tuplas responden a todas las operaciones de secuencia generales que usamos en cadenas en el capítulo anterior.
Expresión de Python | Resultados | Descripción |
---|---|---|
len ((1, 2, 3)) | 3 | Longitud |
(1, 2, 3) + (4, 5, 6) | (1, 2, 3, 4, 5, 6) | Concatenación |
('¡Hola!',) * 4 | ('¡Hola!', '¡Hola!', '¡Hola!', '¡Hola!') | Repetición |
3 pulgadas (1, 2, 3) | Cierto | Afiliación |
para x en (1,2,3): print (x, end = '') | 1 2 3 | Iteración |
Indexación, corte y matrices
Dado que las tuplas son secuencias, la indexación y el corte funcionan de la misma manera para las tuplas que para las cadenas, asumiendo la siguiente entrada:
T=('C++', 'Java', 'Python')
Expresión de Python | Resultados | Descripción |
---|---|---|
T [2] | 'Pitón' | Las compensaciones comienzan en cero |
T [-2] | 'Java' | Negativo: cuenta desde la derecha |
T [1:] | ('Java', 'Python') | Cortar recupera secciones |
Sin delimitadores adjuntos
Sin Delimitadores adjuntos es cualquier conjunto de objetos múltiples, separados por comas, escritos sin símbolos identificativos, es decir, corchetes para listas, paréntesis para tuplas, etc., por defecto a tuplas, como se indica en estos breves ejemplos.
Funciones de tupla integradas
Python incluye las siguientes funciones de tupla:
No Señor. | Función descriptiva |
---|---|
1 | cmp (tupla1, tupla2) Compara elementos de ambas tuplas. |
2 | len (tupla) Da la longitud total de la tupla. |
3 | max (tupla) Devuelve el artículo de la tupla con valor máximo. |
4 | min (tupla) Devuelve el artículo de la tupla con valor mínimo. |
5 | tupla (seq) Convierte una lista en tupla. |
Cada clave está separada de su valor por dos puntos (:), los elementos están separados por comas y todo está encerrado entre llaves. Un diccionario vacío sin elementos se escribe con solo dos llaves, como esta: {}.
Las claves son únicas dentro de un diccionario, mientras que los valores pueden no serlo. Los valores de un diccionario pueden ser de cualquier tipo, pero las claves deben ser de un tipo de datos inmutable, como cadenas, números o tuplas.
Acceso a valores en el diccionario
Para acceder a los elementos del diccionario, puede utilizar los familiares corchetes junto con la clave para obtener su valor. A continuación se muestra un ejemplo simple:
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print ("dict['Name']: ", dict['Name'])
print ("dict['Age']: ", dict['Age'])
Cuando se ejecuta el código anterior, produce el siguiente resultado:
dict['Name']: Zara
dict['Age']: 7
Si intentamos acceder a un elemento de datos con una clave, que no es parte del diccionario, obtenemos el siguiente error:
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
print ("dict['Alice']: ", dict['Alice'])
Cuando se ejecuta el código anterior, produce el siguiente resultado:
dict['Zara']:
Traceback (most recent call last):
File "test.py", line 4, in <module>
print "dict['Alice']: ", dict['Alice'];
KeyError: 'Alice'
Actualizar diccionario
Puede actualizar un diccionario agregando una nueva entrada o un par clave-valor, modificando una entrada existente o eliminando una entrada existente como se muestra en un ejemplo simple que se muestra a continuación.
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8; # update existing entry
dict['School'] = "DPS School" # Add new entry
print ("dict['Age']: ", dict['Age'])
print ("dict['School']: ", dict['School'])
Cuando se ejecuta el código anterior, produce el siguiente resultado:
dict['Age']: 8
dict['School']: DPS School
Eliminar elementos del diccionario
Puede eliminar elementos individuales del diccionario o borrar todo el contenido de un diccionario. También puede eliminar el diccionario completo en una sola operación.
Para eliminar explícitamente un diccionario completo, simplemente use el deldeclaración. A continuación se muestra un ejemplo simple:
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
del dict['Name'] # remove entry with key 'Name'
dict.clear() # remove all entries in dict
del dict # delete entire dictionary
print ("dict['Age']: ", dict['Age'])
print ("dict['School']: ", dict['School'])
Esto produce el siguiente resultado.
Se genera una excepción porque después del dict, el diccionario ya no existe.
dict['Age']:
Traceback (most recent call last):
File "test.py", line 8, in <module>
print "dict['Age']: ", dict['Age'];
TypeError: 'type' object is unsubscriptable
Note - El método del () se analiza en la sección siguiente.
Propiedades de las claves del diccionario
Los valores del diccionario no tienen restricciones. Pueden ser cualquier objeto de Python arbitrario, ya sea objetos estándar u objetos definidos por el usuario. Sin embargo, no ocurre lo mismo con las claves.
Hay dos puntos importantes para recordar acerca de las claves del diccionario:
(a)No se permite más de una entrada por clave. Esto significa que no se permiten claves duplicadas. Cuando se encuentran claves duplicadas durante la asignación, la última asignación gana. Por ejemplo
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'}
print ("dict['Name']: ", dict['Name'])
Cuando se ejecuta el código anterior, produce el siguiente resultado:
dict['Name']: Manni
(b)Las claves deben ser inmutables. Esto significa que puede usar cadenas, números o tuplas como claves de diccionario, pero algo como ['clave'] no está permitido. A continuación se muestra un ejemplo simple:
#!/usr/bin/python3
dict = {['Name']: 'Zara', 'Age': 7}
print ("dict['Name']: ", dict['Name'])
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Traceback (most recent call last):
File "test.py", line 3, in <module>
dict = {['Name']: 'Zara', 'Age': 7}
TypeError: list objects are unhashable
Funciones y métodos de diccionario integrados
Python incluye las siguientes funciones de diccionario:
No Señor. | Función descriptiva |
---|---|
1 | cmp (dict1, dict2) Ya no está disponible en Python 3. |
2 | len (dictar) Da la longitud total del diccionario. Esto sería igual al número de elementos del diccionario. |
3 | str (dict) Produce una representación de cadena imprimible de un diccionario. |
4 | tipo (variable) Devuelve el tipo de variable pasada. Si la variable pasada es diccionario, devolverá un tipo de diccionario. |
Python incluye los siguientes métodos de diccionario:
No Señor. | Método y descripción |
---|---|
1 | dict.clear () Elimina todos los elementos del diccionario dict |
2 | dict.copy () Devuelve una copia superficial del diccionario dict |
3 | dict.fromkeys () Cree un nuevo diccionario con claves de seq y valores establecidos en value . |
4 | dict.get (clave, predeterminado = Ninguno) Para clave clave, devuelve valor o predeterminado si la clave no está en el diccionario |
5 | dict.has_key (clave) Eliminado, utilice en su lugar en funcionamiento. |
6 | dict.items () Devuelve una lista de pares de tuplas de dict (clave, valor) |
7 | dict.keys () Devuelve la lista de claves del diccionario dict |
8 | dict.setdefault (clave, predeterminado = Ninguno) Similar a get (), pero establecerá dict [clave] = predeterminado si la clave no está ya en dict |
9 | dict.update (dict2) Agrega pares clave-valor del diccionario dict2 a dict |
10 | dict.values () Devuelve la lista de valores de diccionario dict |
Un programa de Python puede manejar la fecha y la hora de varias formas. La conversión entre formatos de fecha es una tarea común para las computadoras. Los módulos de tiempo y calendario de Python ayudan a rastrear fechas y horas.
¿Qué es Tick?
Los intervalos de tiempo son números de punto flotante en unidades de segundos. Los instantes particulares en el tiempo se expresan en segundos desde las 12:00 am del 1 de enero de 1970 (época).
Hay un popular timemódulo disponible en Python que proporciona funciones para trabajar con tiempos y para convertir entre representaciones. La funcióntime.time() devuelve la hora actual del sistema en ticks desde las 12:00 a. m. del 1 de enero de 1970 (época).
Ejemplo
#!/usr/bin/python3
import time; # This is required to include time module.
ticks = time.time()
print ("Number of ticks since 12:00am, January 1, 1970:", ticks)
Esto produciría un resultado similar a lo siguiente:
Number of ticks since 12:00am, January 1, 1970: 1455508609.34375
La aritmética de fechas es fácil de hacer con tics. Sin embargo, las fechas anteriores a la época no se pueden representar de esta forma. Las fechas en el futuro lejano tampoco se pueden representar de esta manera: el punto de corte es en algún momento en 2038 para UNIX y Windows.
¿Qué es TimeTuple?
Muchas de las funciones de tiempo de Python manejan el tiempo como una tupla de 9 números, como se muestra a continuación:
Índice | Campo | Valores |
---|---|---|
0 | Año de 4 dígitos | 2016 |
1 | Mes | 1 hasta 12 |
2 | Día | 1 hasta 31 |
3 | Hora | 0 hasta 23 |
4 | Minuto | 0 hasta 59 |
5 | Segundo | 0 a 61 (60 o 61 son segundos intercalares) |
6 | Día de la semana | 0 a 6 (0 es lunes) |
7 | Día del año | 1 a 366 (día juliano) |
8 | Horario de verano | -1, 0, 1, -1 significa que la biblioteca determina el horario de verano |
Por ejemplo:
import time
print (time.localtime());
Esto produciría el siguiente resultado:
time.struct_time(tm_year = 2016, tm_mon = 2, tm_mday = 15, tm_hour = 9,
tm_min = 29, tm_sec = 2, tm_wday = 0, tm_yday = 46, tm_isdst = 0)
La tupla anterior es equivalente a struct_timeestructura. Esta estructura tiene los siguientes atributos:
Índice | Atributos | Valores |
---|---|---|
0 | tm_year | 2016 |
1 | tm_mon | 1 hasta 12 |
2 | tm_mday | 1 hasta 31 |
3 | tm_hour | 0 hasta 23 |
4 | tm_min | 0 hasta 59 |
5 | tm_sec | 0 a 61 (60 o 61 son segundos intercalares) |
6 | tm_wday | 0 a 6 (0 es lunes) |
7 | tm_yday | 1 a 366 (día juliano) |
8 | tm_isdst | -1, 0, 1, -1 significa que la biblioteca determina el horario de verano |
Obtener la hora actual
Para traducir un instante de tiempo de segundos desde el valor de punto flotante de época a una tupla de tiempo, pase el valor de punto flotante a una función (por ejemplo, localtime) que devuelve una tupla de tiempo con los nueve elementos válidos.
#!/usr/bin/python3
import time
localtime = time.localtime(time.time())
print ("Local current time :", localtime)
Esto produciría el siguiente resultado, que podría formatearse en cualquier otra forma presentable:
Local current time : time.struct_time(tm_year = 2016, tm_mon = 2, tm_mday = 15,
tm_hour = 9, tm_min = 29, tm_sec = 2, tm_wday = 0, tm_yday = 46, tm_isdst = 0)
Obtener tiempo formateado
Puede formatear en cualquier momento según sus requisitos, pero un método simple para obtener la hora en un formato legible es asctime() -
Demo en vivo#!/usr/bin/python3
import time
localtime = time.asctime( time.localtime(time.time()) )
print ("Local current time :", localtime)
Esto produciría el siguiente resultado:
Local current time : Mon Feb 15 09:34:03 2016
Obtener calendario por un mes
El módulo de calendario ofrece una amplia gama de métodos para jugar con calendarios anuales y mensuales. Aquí, imprimimos un calendario para un mes determinado (enero de 2008):
#!/usr/bin/python3
import calendar
cal = calendar.month(2016, 2)
print ("Here is the calendar:")
print (cal)
Esto produciría el siguiente resultado:
Here is the calendar:
February 2016
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29
El módulo del tiempo
Hay un popular timemódulo disponible en Python, que proporciona funciones para trabajar con tiempos y para convertir entre representaciones. Aquí está la lista de todos los métodos disponibles.
No Señor. | Función descriptiva |
---|---|
1 | time.altzone El desplazamiento de la zona horaria local de DST, en segundos al oeste de UTC, si se define una. Esto es negativo si la zona horaria local de DST está al este de UTC (como en Europa occidental, incluido el Reino Unido). Use esto si la luz del día es distinta de cero. |
2 | time.asctime ([tupletime]) Acepta una tupla de tiempo y devuelve una cadena legible de 24 caracteres como 'Tue Dec 11 18:07:14 2008'. |
3 | time.clock () Devuelve el tiempo de CPU actual como un número de segundos en coma flotante. Para medir los costos computacionales de diferentes enfoques, el valor de time.clock es más útil que el de time.time (). |
4 | time.ctime ([segundos]) Como asctime (localtime (segundos)) y sin argumentos es como asctime () |
5 | time.gmtime ([segundos]) Acepta un instante expresado en segundos desde la época y devuelve una tupla de tiempo t con la hora UTC. Nota: t.tm_isdst siempre es 0 |
6 | time.localtime ([segundos]) Acepta un instante expresado en segundos desde la época y devuelve una tupla de tiempo t con la hora local (t.tm_isdst es 0 o 1, dependiendo de si el DST se aplica a los segundos instantáneos según las reglas locales). |
7 | time.mktime (tupletime) Acepta un instante expresado como una tupla de tiempo en la hora local y devuelve un valor de punto flotante con el instante expresado en segundos desde la época. |
8 | time.sleep (segundos) Suspende el hilo de llamada durante segundos. |
9 | time.strftime (fmt [, tupletime]) Acepta un instante expresado como una tupla de tiempo en la hora local y devuelve una cadena que representa el instante especificado por la cadena fmt. |
10 | time.strptime (str, fmt = '% a% b% d% H:% M:% S% Y') Analiza str de acuerdo con la cadena de formato fmt y devuelve el instante en formato de tupla de tiempo. |
11 | tiempo tiempo( ) Devuelve el instante de tiempo actual, un número de segundos en coma flotante desde la época. |
12 | time.tzset () Restablece las reglas de conversión de tiempo utilizadas por las rutinas de la biblioteca. La variable de entorno TZ especifica cómo se hace esto. |
Hay dos atributos importantes disponibles con el módulo de tiempo. Ellos son -
No Señor. | Atributo y descripción |
---|---|
1 | time.timezone El atributo time.timezone es el desplazamiento en segundos de la zona horaria local (sin DST) de UTC (> 0 en las Américas; <= 0 en la mayor parte de Europa, Asia, África). |
2 | time.tzname El atributo time.tzname es un par de cadenas dependientes de la configuración regional, que son los nombres de la zona horaria local sin y con horario de verano, respectivamente. |
El módulo de calendario
El módulo de calendario proporciona funciones relacionadas con el calendario, incluidas funciones para imprimir un calendario de texto para un mes o año determinado.
De forma predeterminada, el calendario toma el lunes como primer día de la semana y el domingo como el último. Para cambiar esto, llame alcalendar.setfirstweekday() función.
Aquí hay una lista de funciones disponibles con el calendar módulo -
No Señor. | Función descriptiva |
---|---|
1 | calendar.calendar(year,w = 2,l = 1,c = 6) Devuelve una cadena de varias líneas con un calendario para el año y el año formateado en tres columnas separadas por c espacios. w es el ancho en caracteres de cada fecha; cada línea tiene una longitud de 21 * w + 18 + 2 * c. l es el número de líneas de cada semana. |
2 | calendar.firstweekday( ) Devuelve la configuración actual para el día de la semana que comienza cada semana. De forma predeterminada, cuando el calendario se importa por primera vez, es 0, es decir, el lunes. |
3 | calendar.isleap(year) Devuelve True si el año es bisiesto; de lo contrario, Falso. |
4 | calendar.leapdays(y1,y2) Devuelve el número total de días bisiestos en los años dentro del rango (y1, y2). |
5 | calendar.month(year,month,w = 2,l = 1) Devuelve una cadena de varias líneas con un calendario para el mes mes del año, una línea por semana más dos líneas de encabezado. w es el ancho en caracteres de cada fecha; cada línea tiene una longitud de 7 * w + 6. l es el número de líneas de cada semana. |
6 | calendar.monthcalendar(year,month) Devuelve una lista de listas de ints. Cada sublista denota una semana. Los días fuera del mes del año del año se establecen en 0; los días dentro del mes se establecen en su día del mes, 1 en adelante. |
7 | calendar.monthrange(year,month) Devuelve dos enteros. El primero es el código del día de la semana para el primer día del mes mes en año año; el segundo es el número de días del mes. Los códigos de días laborables son del 0 (lunes) al 6 (domingo); los números de los meses van del 1 al 12. |
8 | calendar.prcal(year,w = 2,l = 1,c = 6) Como imprimir calendar.calendar (año, w, l, c). |
9 | calendar.prmonth(year,month,w = 2,l = 1) Como imprimir calendar.month (año, mes, w, l). |
10 | calendar.setfirstweekday(weekday) Establece el primer día de cada semana en el código de día de la semana. Los códigos de los días de semana son del 0 (lunes) al 6 (domingo). |
11 | calendar.timegm(tupletime) El inverso de time.gmtime: acepta un instante de tiempo en forma de tupla de tiempo y devuelve el mismo instante como un número de segundos en coma flotante desde la época. |
12 | calendar.weekday(year,month,day) Devuelve el código del día de la semana para la fecha indicada. Los códigos de días laborables son del 0 (lunes) al 6 (domingo); los números de los meses son del 1 (enero) al 12 (diciembre). |
Otros módulos y funciones
Si está interesado, aquí encontrará una lista de otros módulos y funciones importantes para jugar con la fecha y la hora en Python:
- El módulo de fecha y hora
- El módulo pytz
- El módulo dateutil
Una función es un bloque de código organizado y reutilizable que se utiliza para realizar una única acción relacionada. Las funciones proporcionan una mejor modularidad para su aplicación y un alto grado de reutilización de código.
Como ya sabe, Python le ofrece muchas funciones integradas como print (), etc. pero también puede crear sus propias funciones. Estas funciones se denominan funciones definidas por el usuario.
Definición de una función
Puede definir funciones para proporcionar la funcionalidad requerida. Aquí hay reglas simples para definir una función en Python.
Los bloques de funciones comienzan con la palabra clave def seguido del nombre de la función y paréntesis (()).
Cualquier parámetro o argumento de entrada debe colocarse entre estos paréntesis. También puede definir parámetros dentro de estos paréntesis.
La primera declaración de una función puede ser una declaración opcional - la cadena de documentación de la función o cadena de documentación .
El bloque de código dentro de cada función comienza con dos puntos (:) y está sangrado.
La declaración return [expresión] sale de una función y, opcionalmente, devuelve una expresión al llamador. Una declaración return sin argumentos es lo mismo que return None.
Sintaxis
def functionname( parameters ):
"function_docstring"
function_suite
return [expression]
Por defecto, los parámetros tienen un comportamiento posicional y es necesario informarlos en el mismo orden en que se definieron.
Ejemplo
La siguiente función toma una cadena como parámetro de entrada y la imprime en la pantalla estándar.
def printme( str ):
"This prints a passed string into this function"
print (str)
return
Llamar a una función
La definición de una función le da un nombre, especifica los parámetros que se incluirán en la función y estructura los bloques de código.
Una vez finalizada la estructura básica de una función, puede ejecutarla llamándola desde otra función o directamente desde el indicador de Python. A continuación se muestra un ejemplo para llamar alprintme() función -
#!/usr/bin/python3
# Function definition is here
def printme( str ):
"This prints a passed string into this function"
print (str)
return
# Now you can call printme function
printme("This is first call to the user defined function!")
printme("Again second call to the same function")
Cuando se ejecuta el código anterior, produce el siguiente resultado:
This is first call to the user defined function!
Again second call to the same function
Pasar por referencia vs valor
Todos los parámetros (argumentos) en el lenguaje Python se pasan por referencia. Significa que si cambia a qué se refiere un parámetro dentro de una función, el cambio también se refleja en la función que llama. Por ejemplo
#!/usr/bin/python3
# Function definition is here
def changeme( mylist ):
"This changes a passed list into this function"
print ("Values inside the function before change: ", mylist)
mylist[2]=50
print ("Values inside the function after change: ", mylist)
return
# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)
Aquí, mantenemos la referencia del objeto pasado y agregamos valores en el mismo objeto. Por lo tanto, esto produciría el siguiente resultado:
Values inside the function before change: [10, 20, 30]
Values inside the function after change: [10, 20, 50]
Values outside the function: [10, 20, 50]
Hay un ejemplo más en el que el argumento se pasa por referencia y la referencia se sobrescribe dentro de la función llamada.
#!/usr/bin/python3
# Function definition is here
def changeme( mylist ):
"This changes a passed list into this function"
mylist = [1,2,3,4] # This would assi new reference in mylist
print ("Values inside the function: ", mylist)
return
# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)
El parámetro mylistes local a la función changeme. Cambiar mylist dentro de la función no afecta mylist. La función no logra nada y finalmente esto produciría el siguiente resultado:
Values inside the function: [1, 2, 3, 4]
Values outside the function: [10, 20, 30]
Argumentos de función
Puede llamar a una función utilizando los siguientes tipos de argumentos formales:
- Argumentos requeridos
- Argumentos de palabras clave
- Argumentos predeterminados
- Argumentos de longitud variable
Argumentos requeridos
Los argumentos requeridos son los argumentos pasados a una función en el orden posicional correcto. Aquí, el número de argumentos en la llamada a la función debe coincidir exactamente con la definición de la función.
Para llamar a la función printme(), definitivamente necesita pasar un argumento, de lo contrario, da un error de sintaxis de la siguiente manera:
#!/usr/bin/python3
# Function definition is here
def printme( str ):
"This prints a passed string into this function"
print (str)
return
# Now you can call printme function
printme()
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Traceback (most recent call last):
File "test.py", line 11, in <module>
printme();
TypeError: printme() takes exactly 1 argument (0 given)
Argumentos de palabras clave
Los argumentos de palabras clave están relacionados con las llamadas a funciones. Cuando usa argumentos de palabras clave en una llamada a función, el llamador identifica los argumentos por el nombre del parámetro.
Esto le permite omitir argumentos o colocarlos fuera de orden porque el intérprete de Python puede usar las palabras clave proporcionadas para hacer coincidir los valores con los parámetros. También puede realizar llamadas de palabras clave alprintme() funcionan de las siguientes formas:
#!/usr/bin/python3
# Function definition is here
def printme( str ):
"This prints a passed string into this function"
print (str)
return
# Now you can call printme function
printme( str = "My string")
Cuando se ejecuta el código anterior, produce el siguiente resultado:
My string
El siguiente ejemplo ofrece una imagen más clara. Tenga en cuenta que el orden de los parámetros no importa.
#!/usr/bin/python3
# Function definition is here
def printinfo( name, age ):
"This prints a passed info into this function"
print ("Name: ", name)
print ("Age ", age)
return
# Now you can call printinfo function
printinfo( age = 50, name = "miki" )
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Name: miki
Age 50
Argumentos predeterminados
Un argumento predeterminado es un argumento que asume un valor predeterminado si no se proporciona un valor en la llamada a la función para ese argumento. El siguiente ejemplo da una idea sobre los argumentos predeterminados, imprime la edad predeterminada si no se pasa:
#!/usr/bin/python3
# Function definition is here
def printinfo( name, age = 35 ):
"This prints a passed info into this function"
print ("Name: ", name)
print ("Age ", age)
return
# Now you can call printinfo function
printinfo( age = 50, name = "miki" )
printinfo( name = "miki" )
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Name: miki
Age 50
Name: miki
Age 35
Argumentos de longitud variable
Es posible que deba procesar una función para más argumentos de los que especificó al definir la función. Estos argumentos se denominan argumentos de longitud variable y no se nombran en la definición de la función, a diferencia de los argumentos obligatorios y predeterminados.
La sintaxis para una función con argumentos de variables que no son palabras clave se proporciona a continuación:
def functionname([formal_args,] *var_args_tuple ):
"function_docstring"
function_suite
return [expression]
Se coloca un asterisco (*) antes del nombre de la variable que contiene los valores de todos los argumentos de variables que no son palabras clave. Esta tupla permanece vacía si no se especifican argumentos adicionales durante la llamada a la función. A continuación se muestra un ejemplo simple:
#!/usr/bin/python3
# Function definition is here
def printinfo( arg1, *vartuple ):
"This prints a variable passed arguments"
print ("Output is: ")
print (arg1)
for var in vartuple:
print (var)
return
# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Output is:
10
Output is:
70
60
50
Las funciones anónimas
Estas funciones se denominan anónimas porque no se declaran de la manera estándar mediante el uso de defpalabra clave. Puedes usar ellambda palabra clave para crear pequeñas funciones anónimas.
Las formas lambda pueden tomar cualquier número de argumentos, pero devuelven solo un valor en forma de expresión. No pueden contener comandos ni expresiones múltiples.
Una función anónima no puede ser una llamada directa a imprimir porque lambda requiere una expresión.
Las funciones de Lambda tienen su propio espacio de nombres local y no pueden acceder a otras variables que no sean las de su lista de parámetros y las del espacio de nombres global.
Aunque parece que las lambdas son una versión de una línea de una función, no son equivalentes a las declaraciones en línea en C o C ++, cuyo propósito es apilar la asignación pasando la función durante la invocación por razones de rendimiento.
Sintaxis
La sintaxis de lambda funciones contiene solo una declaración única, que es la siguiente:
lambda [arg1 [,arg2,.....argn]]:expression
A continuación se muestra un ejemplo para mostrar cómo lambda forma de funcionamiento funciona -
#!/usr/bin/python3
# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2
# Now you can call sum as a function
print ("Value of total : ", sum( 10, 20 ))
print ("Value of total : ", sum( 20, 20 ))
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Value of total : 30
Value of total : 40
La declaración de devolución
La declaración return [expresión] sale de una función y, opcionalmente, devuelve una expresión al llamador. Una declaración return sin argumentos es lo mismo que return None.
Todos los ejemplos que se dan a continuación no devuelven ningún valor. Puede devolver un valor de una función de la siguiente manera:
#!/usr/bin/python3
# Function definition is here
def sum( arg1, arg2 ):
# Add both the parameters and return them."
total = arg1 + arg2
print ("Inside the function : ", total)
return total
# Now you can call sum function
total = sum( 10, 20 )
print ("Outside the function : ", total )
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Inside the function : 30
Outside the function : 30
Alcance de las variables
Es posible que no se pueda acceder a todas las variables de un programa en todas las ubicaciones de ese programa. Esto depende de dónde haya declarado una variable.
El alcance de una variable determina la parte del programa donde puede acceder a un identificador particular. Hay dos ámbitos básicos de variables en Python:
- Variables globales
- Variables locales
Variables globales vs locales
Las variables que se definen dentro de un cuerpo de función tienen un alcance local y las definidas fuera tienen un alcance global.
Esto significa que solo se puede acceder a las variables locales dentro de la función en la que están declaradas, mientras que todas las funciones pueden acceder a las variables globales en todo el cuerpo del programa. Cuando llamas a una función, las variables declaradas dentro de ella entran en el ámbito. A continuación se muestra un ejemplo simple:
#!/usr/bin/python3
total = 0 # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
# Add both the parameters and return them."
total = arg1 + arg2; # Here total is local variable.
print ("Inside the function local total : ", total)
return total
# Now you can call sum function
sum( 10, 20 )
print ("Outside the function global total : ", total )
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Inside the function local total : 30
Outside the function global total : 0
Un módulo le permite organizar lógicamente su código Python. Agrupar el código relacionado en un módulo hace que el código sea más fácil de entender y usar. Un módulo es un objeto de Python con atributos nombrados arbitrariamente que puede vincular y hacer referencia.
Simplemente, un módulo es un archivo que consta de código Python. Un módulo puede definir funciones, clases y variables. Un módulo también puede incluir código ejecutable.
Ejemplo
El código Python para un módulo llamado aname normalmente reside en un archivo namedaname.py. Aquí hay un ejemplo de un módulo simple, support.py:
def print_func( par ):
print "Hello : ", par
return
La declaración de importación
Puede utilizar cualquier archivo fuente de Python como módulo ejecutando una declaración de importación en algún otro archivo fuente de Python. losimport tiene la siguiente sintaxis:
import module1[, module2[,... moduleN]
Cuando el intérprete encuentra una declaración de importación, importa el módulo si el módulo está presente en la ruta de búsqueda. Una ruta de búsqueda es una lista de directorios que el intérprete busca antes de importar un módulo. Por ejemplo, para importar el módulo hello.py, debe colocar el siguiente comando en la parte superior del script:
#!/usr/bin/python3
# Import module support
import support
# Now you can call defined function that module as follows
support.print_func("Zara")
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Hello : Zara
Un módulo se carga solo una vez, independientemente del número de veces que se importe. Esto evita que la ejecución del módulo suceda repetidamente, si ocurren múltiples importaciones.
La declaración de ... importación
Python fromLa declaración le permite importar atributos específicos de un módulo al espacio de nombres actual. losfrom...import tiene la siguiente sintaxis:
from modname import name1[, name2[, ... nameN]]
Por ejemplo, para importar la función fibonacci del módulo fib, use la siguiente declaración:
#!/usr/bin/python3
# Fibonacci numbers module
def fib(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a + b
return result
>>> from fib import fib
>>> fib(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
Esta declaración no importa todo el módulo fib al espacio de nombres actual; simplemente introduce el elemento fibonacci del módulo fib en la tabla de símbolos globales del módulo de importación.
La declaración from ... import *
También es posible importar todos los nombres de un módulo en el espacio de nombres actual utilizando la siguiente declaración de importación:
from modname import *
Esto proporciona una manera fácil de importar todos los elementos de un módulo al espacio de nombres actual; sin embargo, esta declaración debe usarse con moderación.
Ejecución de módulos como scripts
Dentro de un módulo, el nombre del módulo (como una cadena) está disponible como el valor de la variable global __name__. El código del módulo se ejecutará, como si lo hubiera importado, pero con el __name__ establecido en "__main__".
Agregue este código al final de su módulo -
#!/usr/bin/python3
# Fibonacci numbers module
def fib(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a + b
return result
if __name__ == "__main__":
f = fib(100)
print(f)
Cuando ejecute el código anterior, se mostrará el siguiente resultado.
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
Localización de módulos
Cuando importa un módulo, el intérprete de Python busca el módulo en las siguientes secuencias:
El directorio actual.
Si no se encuentra el módulo, Python busca cada directorio en la variable de shell PYTHONPATH.
Si todo lo demás falla, Python comprueba la ruta predeterminada. En UNIX, esta ruta predeterminada es normalmente / usr / local / lib / python3 /.
La ruta de búsqueda del módulo se almacena en el módulo del sistema sys como el sys.pathvariable. La variable sys.path contiene el directorio actual, PYTHONPATH, y el predeterminado dependiente de la instalación.
La variable PYTHONPATH
PYTHONPATH es una variable de entorno que consta de una lista de directorios. La sintaxis de PYTHONPATH es la misma que la de la variable de shell PATH.
Aquí hay un PYTHONPATH típico de un sistema Windows:
set PYTHONPATH = c:\python34\lib;
Y aquí hay un PYTHONPATH típico de un sistema UNIX:
set PYTHONPATH = /usr/local/lib/python
Espacios de nombres y alcance
Las variables son nombres (identificadores) que se asignan a objetos. Un espacio de nombres es un diccionario de nombres de variables (claves) y sus objetos correspondientes (valores).
Una declaración de Python puede acceder a variables en un espacio de nombres local y en el espacio de nombres global . Si una variable local y una global tienen el mismo nombre, la variable local sombrea la variable global.
Cada función tiene su propio espacio de nombres local. Los métodos de clase siguen la misma regla de alcance que las funciones ordinarias.
Python hace conjeturas fundamentadas sobre si las variables son locales o globales. Asume que cualquier variable a la que se le asigne un valor en una función es local.
Por lo tanto, para asignar un valor a una variable global dentro de una función, primero debe usar la declaración global.
- La declaración global VarName le dice a Python que VarName es una variable global. Python deja de buscar la variable en el espacio de nombres local.
Por ejemplo, definimos una variable Money en el espacio de nombres global. Dentro de la función Money, asignamos un valor a Money, por lo que Python asume Money como una variable local.
Sin embargo, accedimos al valor de la variable local Money antes de configurarlo, por lo que un UnboundLocalError es el resultado. Descomentar la declaración global soluciona el problema.
#!/usr/bin/python3
Money = 2000
def AddMoney():
# Uncomment the following line to fix the code:
# global Money
Money = Money + 1
print (Money)
AddMoney()
print (Money)
La función dir ()
La función incorporada dir () devuelve una lista ordenada de cadenas que contienen los nombres definidos por un módulo.
La lista contiene los nombres de todos los módulos, variables y funciones que se definen en un módulo. A continuación se muestra un ejemplo simple:
#!/usr/bin/python3
# Import built-in module math
import math
content = dir(math)
print (content)
Cuando se ejecuta el código anterior, produce el siguiente resultado:
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan',
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp',
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh',
'sqrt', 'tan', 'tanh']
Aquí, la variable de cadena especial __name__ es el nombre del módulo, y __file__ es el nombre de archivo desde el cual se cargó el módulo.
Las funciones globals () y locals ()
los globals() y locals() Las funciones se pueden usar para devolver los nombres en los espacios de nombres globales y locales dependiendo de la ubicación desde donde se llaman.
Si locals() se llama desde dentro de una función, devolverá todos los nombres a los que se puede acceder localmente desde esa función.
Si globals() se llama desde dentro de una función, devolverá todos los nombres a los que se puede acceder globalmente desde esa función.
El tipo de retorno de ambas funciones es diccionario. Por lo tanto, los nombres se pueden extraer utilizando elkeys() función.
La función reload ()
Cuando se importa un módulo a un script, el código de la parte de nivel superior de un módulo se ejecuta solo una vez.
Por lo tanto, si desea volver a ejecutar el código de nivel superior en un módulo, puede usar la función reload () . La función reload () vuelve a importar un módulo previamente importado. La sintaxis de la función reload () es la siguiente:
reload(module_name)
Aquí, module_name es el nombre del módulo que desea recargar y no la cadena que contiene el nombre del módulo. Por ejemplo, para volver a cargar el módulo de saludo, haga lo siguiente:
reload(hello)
Paquetes en Python
Un paquete es una estructura de directorio de archivos jerárquica que define un único entorno de aplicación Python que consta de módulos y subpaquetes y sub-subpaquetes, y así sucesivamente.
Considere un archivo Pots.py disponible en el directorio telefónico. Este archivo tiene la siguiente línea de código fuente:
#!/usr/bin/python3
def Pots():
print ("I'm Pots Phone")
De manera similar, tenemos otros dos archivos que tienen funciones diferentes con el mismo nombre que el anterior. Ellos son -
Archivo Phone / Isdn.py con función Isdn ()
Archivo Phone / G3.py con función G3 ()
Ahora, cree un archivo más __init__.py en el directorio telefónico -
- Phone/__init__.py
Para que todas sus funciones estén disponibles cuando haya importado Phone, debe colocar declaraciones de importación explícitas en __init__.py de la siguiente manera:
from Pots import Pots
from Isdn import Isdn
from G3 import G3
Después de agregar estas líneas a __init__.py, tendrá todas estas clases disponibles cuando importe el paquete Phone.
#!/usr/bin/python3
# Now import your Phone Package.
import Phone
Phone.Pots()
Phone.Isdn()
Phone.G3()
Cuando se ejecuta el código anterior, produce el siguiente resultado:
I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone
En el ejemplo anterior, hemos tomado un ejemplo de una sola función en cada archivo, pero puede mantener múltiples funciones en sus archivos. También puede definir diferentes clases de Python en esos archivos y luego puede crear sus paquetes a partir de esas clases.
Este capítulo cubre todas las funciones básicas de E / S disponibles en Python 3. Para obtener más funciones, consulte la documentación estándar de Python.
Imprimir en la pantalla
La forma más sencilla de producir resultados es utilizando la declaración de impresión , donde puede pasar cero o más expresiones separadas por comas. Esta función convierte las expresiones que pasa en una cadena y escribe el resultado en la salida estándar de la siguiente manera:
#!/usr/bin/python3
print ("Python is really a great language,", "isn't it?")
Esto produce el siguiente resultado en su pantalla estándar:
Python is really a great language, isn't it?
Lectura de entrada de teclado
Python 2 tiene dos funciones integradas para leer datos de la entrada estándar, que de forma predeterminada proviene del teclado. Estas funciones soninput() y raw_input()
En Python 3, la función raw_input () está obsoleta. Además, las funciones input () leen datos del teclado como una cadena, independientemente de si están entre comillas ('' o "") o no.
La función de entrada
los input([prompt]) La función es equivalente a raw_input, excepto que asume que la entrada es una expresión válida de Python y le devuelve el resultado evaluado.
#!/usr/bin/python3
>>> x = input("something:")
something:10
>>> x
'10'
>>> x = input("something:")
something:'10' #entered data treated as string with or without ''
>>> x
"'10'"
Abrir y cerrar archivos
Hasta ahora, ha estado leyendo y escribiendo en la entrada y salida estándar. Ahora veremos cómo usar archivos de datos reales.
Python proporciona funciones y métodos básicos necesarios para manipular archivos de forma predeterminada. Puede realizar la mayor parte de la manipulación de archivos utilizando unfile objeto.
La función abierta
Antes de poder leer o escribir un archivo, debe abrirlo utilizando la función open () incorporada de Python. Esta función crea unafile object, que se utilizaría para llamar a otros métodos de soporte asociados con él.
Sintaxis
file object = open(file_name [, access_mode][, buffering])
Aquí están los detalles de los parámetros:
file_name - El argumento file_name es un valor de cadena que contiene el nombre del archivo al que desea acceder.
access_mode- El access_mode determina el modo en el que se debe abrir el archivo, es decir, leer, escribir, adjuntar, etc. A continuación, en la tabla, se proporciona una lista completa de valores posibles. Este es un parámetro opcional y el modo de acceso a archivos predeterminado es lectura (r).
buffering- Si el valor de almacenamiento en búfer se establece en 0, no se realiza ningún almacenamiento en búfer. Si el valor de almacenamiento en búfer es 1, se realiza el almacenamiento en búfer de línea al acceder a un archivo. Si especifica el valor de almacenamiento en búfer como un número entero mayor que 1, la acción de almacenamiento en búfer se realiza con el tamaño de búfer indicado. Si es negativo, el tamaño del búfer es el predeterminado del sistema (comportamiento predeterminado).
Aquí hay una lista de los diferentes modos de abrir un archivo:
No Señor. | Modo y descripción |
---|---|
1 | r Abre un archivo solo para lectura. El puntero de archivo se coloca al principio del archivo. Este es el modo por defecto. |
2 | rb Abre un archivo para lectura solo en formato binario. El puntero de archivo se coloca al principio del archivo. Este es el modo por defecto. |
3 | r+ Abre un archivo para leer y escribir. El puntero de archivo colocado al principio del archivo. |
4 | rb+ Abre un archivo para leer y escribir en formato binario. El puntero de archivo colocado al principio del archivo. |
5 | w Abre un archivo solo para escritura. Sobrescribe el archivo si existe. Si el archivo no existe, crea un nuevo archivo para escribir. |
6 | wb Abre un archivo para escribir solo en formato binario. Sobrescribe el archivo si existe. Si el archivo no existe, crea un nuevo archivo para escribir. |
7 | w+ Abre un archivo para escribir y leer. Sobrescribe el archivo existente si el archivo existe. Si el archivo no existe, crea un nuevo archivo para leer y escribir. |
8 | wb+ Abre un archivo para escribir y leer en formato binario. Sobrescribe el archivo existente si el archivo existe. Si el archivo no existe, crea un nuevo archivo para leer y escribir. |
9 | a Abre un archivo para agregar. El puntero de archivo está al final del archivo si el archivo existe. Es decir, el archivo está en modo adjuntar. Si el archivo no existe, crea un nuevo archivo para escribir. |
10 | ab Abre un archivo para agregar en formato binario. El puntero de archivo está al final del archivo si el archivo existe. Es decir, el archivo está en modo adjuntar. Si el archivo no existe, crea un nuevo archivo para escribir. |
11 | a+ Abre un archivo para agregarlo y leerlo. El puntero de archivo está al final del archivo si el archivo existe. El archivo se abre en el modo anexar. Si el archivo no existe, crea un nuevo archivo para lectura y escritura. |
12 | ab+ Abre un archivo para agregar y leer en formato binario. El puntero de archivo está al final del archivo si el archivo existe. El archivo se abre en el modo anexar. Si el archivo no existe, crea un nuevo archivo para lectura y escritura. |
Los atributos del objeto de archivo
Una vez que se abre un archivo y tiene un objeto de archivo , puede obtener información diversa relacionada con ese archivo.
Aquí hay una lista de todos los atributos relacionados con un objeto de archivo:
No Señor. | Atributo y descripción |
---|---|
1 | file.closed Devuelve verdadero si el archivo está cerrado, falso en caso contrario. |
2 | file.mode Devuelve el modo de acceso con el que se abrió el archivo. |
3 | file.name Devuelve el nombre del archivo. |
Note - el atributo softspace no es compatible con Python 3.x
Ejemplo
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "wb")
print ("Name of the file: ", fo.name)
print ("Closed or not : ", fo.closed)
print ("Opening mode : ", fo.mode)
fo.close()
Esto produce el siguiente resultado:
Name of the file: foo.txt
Closed or not : False
Opening mode : wb
El método close ()
El método close () de un objeto de archivo elimina cualquier información no escrita y cierra el objeto de archivo, después de lo cual no se puede escribir más.
Python cierra automáticamente un archivo cuando el objeto de referencia de un archivo se reasigna a otro archivo. Es una buena práctica utilizar el método close () para cerrar un archivo.
Sintaxis
fileObject.close();
Ejemplo
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "wb")
print ("Name of the file: ", fo.name)
# Close opened file
fo.close()
Esto produce el siguiente resultado:
Name of the file: foo.txt
Leer y escribir archivos
El objeto de archivo proporciona un conjunto de métodos de acceso para hacernos la vida más fácil. Veríamos cómo usarread() y write() métodos para leer y escribir archivos.
El método write ()
los write()El método escribe cualquier cadena en un archivo abierto. Es importante tener en cuenta que las cadenas de Python pueden tener datos binarios y no solo texto.
El método write () no agrega un carácter de nueva línea ('\ n') al final de la cadena -
Sintaxis
fileObject.write(string);
Aquí, el parámetro pasado es el contenido que se escribirá en el archivo abierto.
Ejemplo
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "w")
fo.write( "Python is a great language.\nYeah its great!!\n")
# Close opend file
fo.close()
El método anterior crearía un archivo foo.txt y escribiría el contenido dado en ese archivo y finalmente cerraría ese archivo. Si abriera este archivo, tendría el siguiente contenido:
Python is a great language.
Yeah its great!!
El método read ()
los read()El método lee una cadena de un archivo abierto. Es importante tener en cuenta que las cadenas de Python pueden tener datos binarios. además de los datos de texto.
Sintaxis
fileObject.read([count]);
Aquí, el parámetro pasado es el número de bytes que se leerán del archivo abierto. Este método comienza a leer desde el principio del archivo y si falta el recuento , intenta leer tanto como sea posible, tal vez hasta el final del archivo.
Ejemplo
Tomemos un archivo foo.txt , que creamos arriba.
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10)
print ("Read String is : ", str)
# Close opened file
fo.close()
Esto produce el siguiente resultado:
Read String is : Python is
Posiciones de archivo
El método tell () le dice la posición actual dentro del archivo; en otras palabras, la siguiente lectura o escritura ocurrirá en esa cantidad de bytes desde el principio del archivo.
El método seek (offset [, from]) cambia la posición actual del archivo. losoffsetEl argumento indica el número de bytes que se moverán. losfrom El argumento especifica la posición de referencia desde donde se moverán los bytes.
Si desde se establece en 0, el comienzo del archivo se utiliza como posición de referencia. Si se establece en 1, la posición actual se utiliza como posición de referencia. Si se establece en 2, el final del archivo se tomará como posición de referencia.
Ejemplo
Tomemos un archivo foo.txt , que creamos arriba.
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10)
print ("Read String is : ", str)
# Check current position
position = fo.tell()
print ("Current file position : ", position)
# Reposition pointer at the beginning once again
position = fo.seek(0, 0)
str = fo.read(10)
print ("Again read String is : ", str)
# Close opened file
fo.close()
Esto produce el siguiente resultado:
Read String is : Python is
Current file position : 10
Again read String is : Python is
Cambio de nombre y eliminación de archivos
Pitón os El módulo proporciona métodos que le ayudan a realizar operaciones de procesamiento de archivos, como cambiar el nombre y eliminar archivos.
Para usar este módulo, primero debe importarlo y luego puede llamar a cualquier función relacionada.
El método rename ()
los rename() El método toma dos argumentos, el nombre de archivo actual y el nombre de archivo nuevo.
Sintaxis
os.rename(current_file_name, new_file_name)
Ejemplo
A continuación se muestra un ejemplo para cambiar el nombre de un archivo existente test1.txt :
#!/usr/bin/python3
import os
# Rename a file from test1.txt to test2.txt
os.rename( "test1.txt", "test2.txt" )
El método remove ()
Puedes usar el remove() método para eliminar archivos proporcionando el nombre del archivo que se eliminará como argumento.
Sintaxis
os.remove(file_name)
Ejemplo
A continuación se muestra un ejemplo para eliminar un archivo test2.txt existente :
#!/usr/bin/python3
import os
# Delete file test2.txt
os.remove("text2.txt")
Directorios en Python
Todos los archivos están contenidos en varios directorios y Python no tiene problemas para manejarlos también. losos El módulo tiene varios métodos que le ayudan a crear, eliminar y cambiar directorios.
El método mkdir ()
Puedes usar el mkdir() método del osmódulo para crear directorios en el directorio actual. Debe proporcionar un argumento a este método, que contiene el nombre del directorio que se creará.
Sintaxis
os.mkdir("newdir")
Ejemplo
A continuación se muestra un ejemplo para crear una prueba de directorio en el directorio actual:
#!/usr/bin/python3
import os
# Create a directory "test"
os.mkdir("test")
El método chdir ()
Puede usar el método chdir () para cambiar el directorio actual. El método chdir () toma un argumento, que es el nombre del directorio que desea convertir en el directorio actual.
Sintaxis
os.chdir("newdir")
Ejemplo
A continuación se muestra un ejemplo para ir al directorio "/ home / newdir":
#!/usr/bin/python3
import os
# Changing a directory to "/home/newdir"
os.chdir("/home/newdir")
El método getcwd ()
los getcwd() El método muestra el directorio de trabajo actual.
Sintaxis
os.getcwd()
Ejemplo
A continuación se muestra un ejemplo para dar el directorio actual:
#!/usr/bin/python3
import os
# This would give location of the current directory
os.getcwd()
El método rmdir ()
los rmdir() El método elimina el directorio, que se pasa como argumento en el método.
Antes de eliminar un directorio, debe eliminarse todo su contenido.
Sintaxis
os.rmdir('dirname')
Ejemplo
A continuación se muestra un ejemplo para eliminar el directorio "/ tmp / test". Es necesario proporcionar un nombre completo del directorio; de lo contrario, buscaría ese directorio en el directorio actual.
#!/usr/bin/python3
import os
# This would remove "/tmp/test" directory.
os.rmdir( "/tmp/test" )
Métodos relacionados con archivos y directorios
Hay tres fuentes importantes, que proporcionan una amplia gama de métodos de utilidad para manejar y manipular archivos y directorios en los sistemas operativos Windows y Unix. Son los siguientes:
Métodos de objetos de archivo
los file El objeto proporciona funciones para manipular archivos.
Métodos de objetos del SO
Esto proporciona métodos para procesar archivos y directorios.
Python proporciona dos características muy importantes para manejar cualquier error inesperado en sus programas de Python y para agregar capacidades de depuración en ellos:
Exception Handling- Esto se trataría en este tutorial. Aquí hay una lista de Excepciones estándar disponibles en Python: Excepciones estándar .
Assertions- Esto se trataría en el tutorial Afirmaciones en Python 3 .
Excepciones estándar
Aquí hay una lista de excepciones estándar disponibles en Python. -
No Señor. | Nombre y descripción de la excepción |
---|---|
1 | Exception Clase base para todas las excepciones |
2 | StopIteration Se genera cuando el método next () de un iterador no apunta a ningún objeto. |
3 | SystemExit Generado por la función sys.exit (). |
4 | StandardError Clase base para todas las excepciones integradas excepto StopIteration y SystemSalir. |
5 | ArithmeticError Clase base para todos los errores que ocurren para el cálculo numérico. |
6 | OverflowError Se genera cuando un cálculo excede el límite máximo para un tipo numérico. |
7 | FloatingPointError Se genera cuando falla un cálculo de punto flotante. |
8 | ZeroDivisonError Se genera cuando se realiza una división o módulo por cero para todos los tipos numéricos. |
9 | AssertionError Se genera en caso de falla de la declaración Assert. |
10 | AttributeError Se genera en caso de falla de referencia o asignación de atributo. |
11 | EOFError Se genera cuando no hay entrada de la función raw_input () o input () y se alcanza el final del archivo. |
12 | ImportError Se genera cuando falla una declaración de importación. |
13 | KeyboardInterrupt Se genera cuando el usuario interrumpe la ejecución del programa, generalmente presionando Ctrl + c. |
14 | LookupError Clase base para todos los errores de búsqueda. |
15 | IndexError Se genera cuando no se encuentra un índice en una secuencia. |
dieciséis | KeyError Se genera cuando la clave especificada no se encuentra en el diccionario. |
17 | NameError Se genera cuando no se encuentra un identificador en el espacio de nombres local o global. |
18 | UnboundLocalError Se genera cuando se intenta acceder a una variable local en una función o método, pero no se le ha asignado ningún valor. |
19 | EnvironmentError Clase base para todas las excepciones que ocurren fuera del entorno de Python. |
20 | IOError Se genera cuando falla una operación de entrada / salida, como la declaración de impresión o la función open () al intentar abrir un archivo que no existe. |
21 | OSError Criado por errores relacionados con el sistema operativo. |
22 | SyntaxError Se genera cuando hay un error en la sintaxis de Python. |
23 | IndentationError Se eleva cuando la sangría no se especifica correctamente. |
24 | SystemError Se genera cuando el intérprete encuentra un problema interno, pero cuando se encuentra este error, el intérprete de Python no sale. |
25 | SystemExit Se genera cuando se cierra el intérprete de Python mediante la función sys.exit (). Si no se maneja en el código, hace que el intérprete salga. |
26 | TypeError Se genera cuando se intenta una operación o función que no es válida para el tipo de datos especificado. |
27 | ValueError Se genera cuando la función incorporada para un tipo de datos tiene el tipo válido de argumentos, pero los argumentos tienen valores no válidos especificados. |
28 | RuntimeError Se genera cuando un error generado no entra en ninguna categoría. |
29 | NotImplementedError Se genera cuando un método abstracto que debe implementarse en una clase heredada no está realmente implementado. |
Afirmaciones en Python
Una afirmación es una verificación de cordura que puede activar o desactivar cuando haya terminado con la prueba del programa.
La forma más fácil de pensar en una afirmación es compararla con una raise-ifdeclaración (o para ser más precisos, una declaración de aumento si no). Se prueba una expresión y, si el resultado es falso, se genera una excepción.
Las afirmaciones se llevan a cabo mediante la declaración assert, la palabra clave más nueva de Python, introducida en la versión 1.5.
Los programadores a menudo colocan aserciones al comienzo de una función para verificar una entrada válida y después de una llamada a una función para verificar una salida válida.
La declaración de aserción
Cuando encuentra una declaración de aserción, Python evalúa la expresión que la acompaña, que es de esperar que sea verdadera. Si la expresión es falsa, Python genera una excepción AssertionError .
La sintaxis para aseverar es:
assert Expression[, Arguments]
Si la aserción falla, Python usa ArgumentExpression como argumento para AssertionError. Las excepciones AssertionError pueden detectarse y manejarse como cualquier otra excepción, utilizando la declaración try-except. Si no se manejan, terminarán el programa y producirán un rastreo.
Ejemplo
Aquí hay una función que convierte una temperatura dada de grados Kelvin a grados Fahrenheit. Dado que 0 ° K es tan frío como se pone, la función se rescata si ve una temperatura negativa:
#!/usr/bin/python3
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print (KelvinToFahrenheit(273))
print (int(KelvinToFahrenheit(505.78)))
print (KelvinToFahrenheit(-5))
Cuando se ejecuta el código anterior, produce el siguiente resultado:
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
¿Qué es la excepción?
Una excepción es un evento que ocurre durante la ejecución de un programa que interrumpe el flujo normal de las instrucciones del programa. En general, cuando una secuencia de comandos de Python encuentra una situación que no puede afrontar, genera una excepción. Una excepción es un objeto de Python que representa un error.
Cuando un script de Python genera una excepción, debe manejar la excepción inmediatamente, de lo contrario, termina y se cierra.
Manejando una excepción
Si tiene algún código sospechoso que pueda generar una excepción, puede defender su programa colocando el código sospechoso en untry:bloquear. Después del bloque try:, incluya unexcept: declaración, seguida de un bloque de código que maneja el problema de la manera más elegante posible.
Sintaxis
Aquí hay una sintaxis simple de try .... excepto ... bloques else -
try:
You do your operations here
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
Aquí hay algunos puntos importantes sobre la sintaxis mencionada anteriormente:
Una sola declaración try puede tener varias declaraciones except. Esto es útil cuando el bloque try contiene declaraciones que pueden generar diferentes tipos de excepciones.
También puede proporcionar una cláusula except genérica, que maneja cualquier excepción.
Después de la (s) cláusula (s) except, puede incluir una cláusula else. El código del bloque else se ejecuta si el código del bloque try: no genera una excepción.
El bloque else es un buen lugar para el código que no necesita la protección de try: block.
Ejemplo
Este ejemplo abre un archivo, escribe contenido en el archivo, y sale con elegancia porque no hay ningún problema.
#!/usr/bin/python3
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print ("Error: can\'t find file or read data")
else:
print ("Written content in the file successfully")
fh.close()
Esto produce el siguiente resultado:
Written content in the file successfully
Ejemplo
Este ejemplo intenta abrir un archivo donde no tiene el permiso de escritura, por lo que genera una excepción:
#!/usr/bin/python3
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print ("Error: can\'t find file or read data")
else:
print ("Written content in the file successfully")
Esto produce el siguiente resultado:
Error: can't find file or read data
La cláusula except sin excepciones
También puede usar la declaración except sin excepciones definidas de la siguiente manera:
try:
You do your operations here
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
Este tipo de try-exceptdeclaración captura todas las excepciones que ocurren. Sin embargo, el uso de este tipo de declaración try-except no se considera una buena práctica de programación, ya que detecta todas las excepciones pero no hace que el programador identifique la causa raíz del problema que pueda ocurrir.
La cláusula except con múltiples excepciones
También puede usar la misma declaración except para manejar múltiples excepciones de la siguiente manera:
try:
You do your operations here
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
La cláusula de intentar finalmente
Puedes usar un finally: bloque junto con un try:bloquear. losfinally:block es un lugar para colocar cualquier código que deba ejecutarse, ya sea que el bloque try haya generado una excepción o no. La sintaxis de la declaración de intentar finalmente es la siguiente:
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
Note- Puede proporcionar cláusulas excepto, o una cláusula final, pero no ambas. No puede utilizar la cláusula else junto con una cláusula final.
Ejemplo
#!/usr/bin/python3
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print ("Error: can\'t find file or read data")
fh.close()
Si no tiene permiso para abrir el archivo en modo de escritura, esto producirá el siguiente resultado:
Error: can't find file or read data
El mismo ejemplo se puede escribir de manera más clara de la siguiente manera:
#!/usr/bin/python3
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print ("Going to close the file")
fh.close()
except IOError:
print ("Error: can\'t find file or read data")
Esto produce el siguiente resultado:
Going to close the file
Cuando se lanza una excepción en el bloque try , la ejecución pasa inmediatamente al bloque finalmente . Después de que se ejecutan todas las declaraciones en el bloque finalmente , la excepción se genera nuevamente y se maneja en las declaraciones excepto si está presente en la siguiente capa superior de la declaración try-except .
Argumento de una excepción
Una excepción puede tener un argumento , que es un valor que brinda información adicional sobre el problema. El contenido del argumento varía según la excepción. Captura el argumento de una excepción proporcionando una variable en la cláusula except de la siguiente manera:
try:
You do your operations here
......................
except ExceptionType as Argument:
You can print value of Argument here...
Si escribe el código para manejar una sola excepción, puede hacer que una variable siga al nombre de la excepción en la declaración except. Si está capturando varias excepciones, puede hacer que una variable siga a la tupla de la excepción.
Esta variable recibe el valor de la excepción que contiene principalmente la causa de la excepción. La variable puede recibir un valor único o varios valores en forma de tupla. Esta tupla generalmente contiene la cadena de error, el número de error y una ubicación del error.
Ejemplo
A continuación se muestra un ejemplo de una única excepción:
#!/usr/bin/python3
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError as Argument:
print ("The argument does not contain numbers\n", Argument)
# Call above function here.
temp_convert("xyz")
Esto produce el siguiente resultado:
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
Plantear una excepción
Puede generar excepciones de varias formas utilizando la declaración de aumento. La sintaxis general de laraise declaración es la siguiente:
Sintaxis
raise [Exception [, args [, traceback]]]
Aquí, Exception es el tipo de excepción (por ejemplo, NameError) y argumento es un valor para el argumento de excepción. El argumento es opcional; si no se proporciona, el argumento de excepción es Ninguno.
El argumento final, rastreo, también es opcional (y rara vez se usa en la práctica) y, si está presente, es el objeto de rastreo que se usa para la excepción.
Ejemplo
Una excepción puede ser una cadena, una clase o un objeto. La mayoría de las excepciones que genera el núcleo de Python son clases, con un argumento que es una instancia de la clase. Definir nuevas excepciones es bastante fácil y se puede hacer de la siguiente manera:
def functionName( level ):
if level <1:
raise Exception(level)
# The code below to this would not be executed
# if we raise the exception
return level
Note- Para detectar una excepción, una cláusula "excepto" debe referirse a la misma excepción lanzada como un objeto de clase o una cadena simple. Por ejemplo, para capturar la excepción anterior, debemos escribir la cláusula except de la siguiente manera:
try:
Business Logic here...
except Exception as e:
Exception handling here using e.args...
else:
Rest of the code here...
El siguiente ejemplo ilustra el uso de generar una excepción:
#!/usr/bin/python3
def functionName( level ):
if level <1:
raise Exception(level)
# The code below to this would not be executed
# if we raise the exception
return level
try:
l = functionName(-10)
print ("level = ",l)
except Exception as e:
print ("error in level argument",e.args[0])
Esto producirá el siguiente resultado
error in level argument -10
Excepciones definidas por el usuario
Python también le permite crear sus propias excepciones derivando clases de las excepciones estándar integradas.
Aquí hay un ejemplo relacionado con RuntimeError . Aquí, se crea una clase que se subclasifica de RuntimeError . Esto es útil cuando necesita mostrar información más específica cuando se detecta una excepción.
En el bloque try, la excepción definida por el usuario se genera y se captura en el bloque except. La variable e se usa para crear una instancia de la clase Networkerror .
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
Entonces, una vez que haya definido la clase anterior, puede generar la excepción de la siguiente manera:
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args
Python ha sido un lenguaje orientado a objetos desde el momento en que existió. Debido a esto, crear y usar clases y objetos es francamente fácil. Este capítulo le ayuda a convertirse en un experto en el uso del soporte de programación orientada a objetos de Python.
Si no tiene experiencia previa con la programación orientada a objetos (OO), es posible que desee consultar un curso introductorio o al menos un tutorial de algún tipo para que comprenda los conceptos básicos.
Sin embargo, aquí hay una pequeña introducción a la programación orientada a objetos (OOP) para ayudarlo:
Descripción general de la terminología de OOP
Class- Un prototipo definido por el usuario para un objeto que define un conjunto de atributos que caracterizan a cualquier objeto de la clase. Los atributos son miembros de datos (variables de clase y variables de instancia) y métodos, a los que se accede mediante notación de puntos.
Class variable: Una variable que comparten todas las instancias de una clase. Las variables de clase se definen dentro de una clase pero fuera de cualquiera de los métodos de la clase. Las variables de clase no se utilizan con tanta frecuencia como las variables de instancia.
Data member - Una variable de clase o variable de instancia que contiene datos asociados con una clase y sus objetos.
Function overloading- La asignación de más de un comportamiento a una función determinada. La operación realizada varía según los tipos de objetos o argumentos involucrados.
Instance variable - Una variable que se define dentro de un método y pertenece solo a la instancia actual de una clase.
Inheritance - La transferencia de las características de una clase a otras clases que se deriven de ella.
Instance- Un objeto individual de una determinada clase. Un objeto obj que pertenece a una clase Circle, por ejemplo, es una instancia de la clase Circle.
Instantiation - La creación de una instancia de una clase.
Method - Un tipo especial de función que se define en una definición de clase.
Object- Una instancia única de una estructura de datos definida por su clase. Un objeto comprende tanto miembros de datos (variables de clase y variables de instancia) como métodos.
Operator overloading - La asignación de más de una función a un operador en particular.
Creando clases
La declaración de clase crea una nueva definición de clase. El nombre de la clase sigue inmediatamente a la clase de palabra clave seguida de dos puntos de la siguiente manera:
class ClassName:
'Optional class documentation string'
class_suite
La clase tiene una cadena de documentación, a la que se puede acceder a través de ClassName.__doc__.
los class_suite consta de todas las declaraciones de componentes que definen miembros de clase, atributos de datos y funciones.
Ejemplo
A continuación se muestra un ejemplo de una clase Python simple:
class Employee:
'Common base class for all employees'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print ("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print ("Name : ", self.name, ", Salary: ", self.salary)
La variable empCount es una variable de clase cuyo valor se comparte entre todas las instancias de a en esta clase. Se puede acceder a esto como Employee.empCount desde dentro o fuera de la clase.
El primer método __init __ () es un método especial, que se llama constructor de clase o método de inicialización que Python llama cuando crea una nueva instancia de esta clase.
Declaras otros métodos de clase como funciones normales con la excepción de que el primer argumento de cada método es self . Python agrega el argumento self a la lista por usted; no es necesario incluirlo cuando llame a los métodos.
Crear objetos de instancia
Para crear instancias de una clase, llama a la clase usando el nombre de la clase y pasa los argumentos que acepta su método __init__ .
This would create first object of Employee class
emp1 = Employee("Zara", 2000)
This would create second object of Employee class
emp2 = Employee("Manni", 5000)
Acceder a los atributos
Puede acceder a los atributos del objeto utilizando el operador de puntos con objeto. Se accedería a la variable de clase usando el nombre de la clase de la siguiente manera:
emp1.displayEmployee()
emp2.displayEmployee()
print ("Total Employee %d" % Employee.empCount)
Ahora, juntando todos los conceptos -
#!/usr/bin/python3
class Employee:
'Common base class for all employees'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print ("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print ("Name : ", self.name, ", Salary: ", self.salary)
#This would create first object of Employee class"
emp1 = Employee("Zara", 2000)
#This would create second object of Employee class"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print ("Total Employee %d" % Employee.empCount)
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Name : Zara ,Salary: 2000
Name : Manni ,Salary: 5000
Total Employee 2
Puede agregar, eliminar o modificar atributos de clases y objetos en cualquier momento:
emp1.salary = 7000 # Add an 'salary' attribute.
emp1.name = 'xyz' # Modify 'age' attribute.
del emp1.salary # Delete 'age' attribute.
En lugar de usar las declaraciones normales para acceder a los atributos, puede usar las siguientes funciones:
los getattr(obj, name[, default]) - para acceder al atributo de objeto.
los hasattr(obj,name) - para comprobar si un atributo existe o no.
los setattr(obj,name,value)- para establecer un atributo. Si el atributo no existe, se creará.
los delattr(obj, name) - para eliminar un atributo.
hasattr(emp1, 'salary') # Returns true if 'salary' attribute exists
getattr(emp1, 'salary') # Returns value of 'salary' attribute
setattr(emp1, 'salary', 7000) # Set attribute 'salary' at 7000
delattr(emp1, 'salary') # Delete attribute 'salary'
Atributos de clase integrados
Cada clase de Python sigue los atributos incorporados y se puede acceder a ellos usando el operador de puntos como cualquier otro atributo:
__dict__ - Diccionario que contiene el espacio de nombres de la clase.
__doc__ - Cadena de documentación de clase o ninguna, si no está definida.
__name__ - Nombre de la clase.
__module__- Nombre del módulo en el que se define la clase. Este atributo es "__main__" en modo interactivo.
__bases__ - Una tupla posiblemente vacía que contiene las clases base, en el orden en que aparecen en la lista de clases base.
Para la clase anterior, intentemos acceder a todos estos atributos:
#!/usr/bin/python3
class Employee:
'Common base class for all employees'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print ("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print ("Name : ", self.name, ", Salary: ", self.salary)
emp1 = Employee("Zara", 2000)
emp2 = Employee("Manni", 5000)
print ("Employee.__doc__:", Employee.__doc__)
print ("Employee.__name__:", Employee.__name__)
print ("Employee.__module__:", Employee.__module__)
print ("Employee.__bases__:", Employee.__bases__)
print ("Employee.__dict__:", Employee.__dict__ )
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Employee.__doc__: Common base class for all employees
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: (<class 'object'>,)
Employee.__dict__: {
'displayCount': <function Employee.displayCount at 0x0160D2B8>,
'__module__': '__main__', '__doc__': 'Common base class for all employees',
'empCount': 2, '__init__':
<function Employee.__init__ at 0x0124F810>, 'displayEmployee':
<function Employee.displayEmployee at 0x0160D300>,
'__weakref__':
<attribute '__weakref__' of 'Employee' objects>, '__dict__':
<attribute '__dict__' of 'Employee' objects>
}
Destrucción de objetos (recolección de basura)
Python elimina los objetos innecesarios (tipos integrados o instancias de clases) automáticamente para liberar espacio en la memoria. El proceso mediante el cual Python recupera periódicamente bloques de memoria que ya no están en uso se denomina recolección de basura.
El recolector de basura de Python se ejecuta durante la ejecución del programa y se activa cuando el recuento de referencias de un objeto llega a cero. El recuento de referencias de un objeto cambia a medida que cambia el número de alias que apuntan a él.
El recuento de referencias de un objeto aumenta cuando se le asigna un nuevo nombre o se coloca en un contenedor (lista, tupla o diccionario). El recuento de referencias del objeto disminuye cuando se elimina con del , su referencia se reasigna o su referencia sale del alcance. Cuando el recuento de referencias de un objeto llega a cero, Python lo recopila automáticamente.
a = 40 # Create object <40>
b = a # Increase ref. count of <40>
c = [b] # Increase ref. count of <40>
del a # Decrease ref. count of <40>
b = 100 # Decrease ref. count of <40>
c[0] = -1 # Decrease ref. count of <40>
Normalmente no se dará cuenta cuando el recolector de basura destruya una instancia huérfana y reclame su espacio. Sin embargo, una clase puede implementar el método especial __del __ () , llamado destructor, que se invoca cuando la instancia está a punto de ser destruida. Este método puede usarse para limpiar cualquier recurso que no sea de memoria usado por una instancia.
Ejemplo
Este destructor __del __ () imprime el nombre de clase de una instancia que está a punto de ser destruida -
#!/usr/bin/python3
class Point:
def __init__( self, x=0, y=0):
self.x = x
self.y = y
def __del__(self):
class_name = self.__class__.__name__
print (class_name, "destroyed")
pt1 = Point()
pt2 = pt1
pt3 = pt1
print (id(pt1), id(pt2), id(pt3)) # prints the ids of the obejcts
del pt1
del pt2
del pt3
Cuando se ejecuta el código anterior, produce el siguiente resultado:
140338326963984 140338326963984 140338326963984
Point destroyed
Note- Idealmente, debería definir sus clases en un archivo separado, luego debería importarlas en su archivo de programa principal usando la declaración de importación .
En el ejemplo anterior, asumiendo que la definición de una clase Point está contenida en point.py y no hay otro código ejecutable en él.
#!/usr/bin/python3
import point
p1 = point.Point()
Herencia de clase
En lugar de comenzar desde cero, puede crear una clase derivándola de una clase preexistente enumerando la clase principal entre paréntesis después del nombre de la nueva clase.
La clase secundaria hereda los atributos de su clase principal y puede usar esos atributos como si estuvieran definidos en la clase secundaria. Una clase secundaria también puede anular los métodos y miembros de datos del padre.
Sintaxis
Las clases derivadas se declaran de forma muy similar a su clase padre; sin embargo, se proporciona una lista de clases base para heredar después del nombre de la clase:
class SubClassName (ParentClass1[, ParentClass2, ...]):
'Optional class documentation string'
class_suite
Ejemplo
#!/usr/bin/python3
class Parent: # define parent class
parentAttr = 100
def __init__(self):
print ("Calling parent constructor")
def parentMethod(self):
print ('Calling parent method')
def setAttr(self, attr):
Parent.parentAttr = attr
def getAttr(self):
print ("Parent attribute :", Parent.parentAttr)
class Child(Parent): # define child class
def __init__(self):
print ("Calling child constructor")
def childMethod(self):
print ('Calling child method')
c = Child() # instance of child
c.childMethod() # child calls its method
c.parentMethod() # calls parent's method
c.setAttr(200) # again call parent's method
c.getAttr() # again call parent's method
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Calling child constructor
Calling child method
Calling parent method
Parent attribute : 200
De manera similar, puede conducir una clase de varias clases principales de la siguiente manera:
class A: # define your class A
.....
class B: # define your calss B
.....
class C(A, B): # subclass of A and B
.....
Puede usar las funciones issubclass () o isinstance () para verificar las relaciones de dos clases e instancias.
los issubclass(sub, sup) La función booleana devuelve Verdadero, si la subclase dada sub es de hecho una subclase de la superclase sup.
los isinstance(obj, Class)La función booleana devuelve True, si obj es una instancia de la clase Class o es una instancia de una subclase de Class
Métodos primordiales
Siempre puedes anular los métodos de tu clase principal. Una razón para anular los métodos de los padres es que es posible que desee una funcionalidad especial o diferente en su subclase.
Ejemplo
#!/usr/bin/python3
class Parent: # define parent class
def myMethod(self):
print ('Calling parent method')
class Child(Parent): # define child class
def myMethod(self):
print ('Calling child method')
c = Child() # instance of child
c.myMethod() # child calls overridden method
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Calling child method
Métodos de sobrecarga de bases
La siguiente tabla enumera algunas funciones genéricas que puede anular en sus propias clases:
No Señor. | Método, descripción y llamada de muestra |
---|---|
1 | __init__ ( self [,args...] ) Constructor (con argumentos opcionales) Llamada de muestra: obj = className (args) |
2 | __del__( self ) Destructor, elimina un objeto Llamada de muestra: del obj |
3 | __repr__( self ) Representación de cadena evaluable Llamada de muestra: repr (obj) |
4 | __str__( self ) Representación de cadena imprimible Llamada de muestra: str (obj) |
5 | __cmp__ ( self, x ) Comparación de objetos Llamada de muestra: cmp (obj, x) |
Operadores de sobrecarga
Suponga que ha creado una clase Vector para representar vectores bidimensionales. ¿Qué sucede cuando usa el operador más para agregarlos? Lo más probable es que Python te grite.
Sin embargo, podría definir el método __add__ en su clase para realizar la suma de vectores y luego el operador más se comportaría según las expectativas:
Ejemplo
#!/usr/bin/python3
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return 'Vector (%d, %d)' % (self.a, self.b)
def __add__(self,other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Vector(7,8)
Ocultar datos
Los atributos de un objeto pueden ser visibles o no fuera de la definición de clase. Debe nombrar los atributos con un prefijo de subrayado doble, y esos atributos no serán directamente visibles para los forasteros.
Ejemplo
#!/usr/bin/python3
class JustCounter:
__secretCount = 0
def count(self):
self.__secretCount += 1
print (self.__secretCount)
counter = JustCounter()
counter.count()
counter.count()
print (counter.__secretCount)
Cuando se ejecuta el código anterior, produce el siguiente resultado:
1
2
Traceback (most recent call last):
File "test.py", line 12, in <module>
print counter.__secretCount
AttributeError: JustCounter instance has no attribute '__secretCount'
Python protege a esos miembros cambiando internamente el nombre para incluir el nombre de la clase. Puede acceder a atributos como object._className__attrName . Si reemplaza su última línea de la siguiente manera, entonces funciona para usted:
.........................
print (counter._JustCounter__secretCount)
Cuando se ejecuta el código anterior, produce el siguiente resultado:
1
2
2
Una expresión regular es una secuencia especial de caracteres que le ayuda a hacer coincidir o encontrar otras cadenas o conjuntos de cadenas, utilizando una sintaxis especializada contenida en un patrón. Las expresiones regulares se utilizan ampliamente en el mundo UNIX.
El módulo reproporciona soporte completo para expresiones regulares similares a Perl en Python. losre el módulo genera la excepción re.error si ocurre un error al compilar o usar una expresión regular.
Cubriremos dos funciones importantes, que se usarían para manejar expresiones regulares. Sin embargo, una pequeña cosa primero: hay varios caracteres, que tendrían un significado especial cuando se usan en expresiones regulares. Para evitar confusiones al tratar con expresiones regulares, usaríamos Raw Strings comor'expression'.
Patrones básicos que coinciden con caracteres individuales
No Señor. | Expresión y coincidencias |
---|---|
1 | a, X, 9, < los personajes ordinarios simplemente coinciden exactamente entre sí. |
2 | . (a period) coincide con cualquier carácter excepto la nueva línea '\ n' |
3 | \w coincide con un carácter de "palabra": una letra, un dígito o una barra inferior [a-zA-Z0-9_]. |
4 | \W coincide con cualquier carácter que no sea una palabra. |
5 | \b límite entre palabra y no palabra |
6 | \s coincide con un solo carácter de espacio en blanco: espacio, nueva línea, retorno, tabulación |
7 | \S coincide con cualquier carácter que no sea un espacio en blanco. |
8 | \t, \n, \r pestaña, nueva línea, volver |
9 | \d dígito decimal [0-9] |
10 | ^ coincide con el comienzo de la cadena |
11 | $ coincidir con el final de la cadena |
12 | \ inhibir la "especialidad" de un personaje. |
Banderas de compilación
Los indicadores de compilación le permiten modificar algunos aspectos de cómo funcionan las expresiones regulares. Las banderas están disponibles en el módulo re con dos nombres, un nombre largo comoIGNORECASE y un formulario corto de una letra como I.
No Señor. | Bandera y significado |
---|---|
1 | ASCII, A Hace que varios escapes como \ w, \ b, \ sy \ d coincidan solo en caracteres ASCII con la propiedad respectiva. |
2 | DOTALL, S Crea, combina cualquier personaje, incluidas las nuevas líneas |
3 | IGNORECASE, I Hacer coincidencias que no distingan entre mayúsculas y minúsculas |
4 | LOCALE, L Haga una coincidencia con reconocimiento de configuración regional |
5 | MULTILINE, M Coincidencia de varias líneas, que afecta a ^ y $ |
6 | VERBOSE, X (for ‘extended’) Habilite RE detallados, que se pueden organizar de manera más limpia y comprensible |
La función de coincidencia
Esta función intenta hacer coincidir el patrón RE con la cadena con banderas opcionales .
Aquí está la sintaxis de esta función:
re.match(pattern, string, flags = 0)
Aquí está la descripción de los parámetros:
No Señor. | Descripción de parámetros |
---|---|
1 | pattern Esta es la expresión regular que debe coincidir. |
2 | string Esta es la cadena, que se buscará para que coincida con el patrón al principio de la cadena. |
3 | flags Puede especificar diferentes banderas usando OR bit a bit (|). Estos son modificadores, que se enumeran en la tabla siguiente. |
La función re.match devuelve unmatch objetar el éxito, Noneen caso de falla. Usamos grupo (num) o grupos () función dematch objeto para obtener una expresión coincidente.
No Señor. | Método y descripción del objeto de coincidencia |
---|---|
1 | group(num = 0) Este método devuelve una coincidencia completa (o un número de subgrupo específico) |
2 | groups() Este método devuelve todos los subgrupos coincidentes en una tupla (vacío si no había ninguno) |
Ejemplo
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print ("matchObj.group() : ", matchObj.group())
print ("matchObj.group(1) : ", matchObj.group(1))
print ("matchObj.group(2) : ", matchObj.group(2))
else:
print ("No match!!")
Cuando se ejecuta el código anterior, produce el siguiente resultado:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
La función de búsqueda
Esta función busca la primera aparición del patrón RE dentro de una cadena con banderas opcionales .
Aquí está la sintaxis de esta función:
re.search(pattern, string, flags = 0)
Aquí está la descripción de los parámetros:
No Señor. | Descripción de parámetros |
---|---|
1 | pattern Esta es la expresión regular que debe coincidir. |
2 | string Esta es la cadena, que se buscará para que coincida con el patrón en cualquier parte de la cadena. |
3 | flags Puede especificar diferentes banderas usando OR bit a bit (|). Estos son modificadores, que se enumeran en la tabla siguiente. |
La función re.search devuelve unmatch objetar el éxito, noneen caso de falla. Usamos grupo (num) o grupos () función dematch objeto para obtener la expresión coincidente.
No Señor. | Método y descripción del objeto de coincidencia |
---|---|
1 | group(num = 0) Este método devuelve una coincidencia completa (o un número de subgrupo específico) |
2 | groups() Este método devuelve todos los subgrupos coincidentes en una tupla (vacío si no había ninguno) |
Ejemplo
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print ("searchObj.group() : ", searchObj.group())
print ("searchObj.group(1) : ", searchObj.group(1))
print ("searchObj.group(2) : ", searchObj.group(2))
else:
print ("Nothing found!!")
Cuando se ejecuta el código anterior, produce el siguiente resultado:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
Coincidencia versus búsqueda
Python ofrece dos operaciones primitivas diferentes basadas en expresiones regulares: match busca una coincidencia solo al principio de la cadena, mientras que search busca una coincidencia en cualquier parte de la cadena (esto es lo que hace Perl por defecto).
Ejemplo
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
print ("search --> searchObj.group() : ", searchObj.group())
else:
print ("Nothing found!!")
Cuando se ejecuta el código anterior, produce el siguiente resultado:
No match!!
search --> matchObj.group() : dogs
Buscar y reemplazar
Uno de los mas importantes re Los métodos que usan expresiones regulares son sub.
Sintaxis
re.sub(pattern, repl, string, max=0)
Este método reemplaza todas las apariciones del patrón RE en la cadena con repl , sustituyendo todas las apariciones a menos que se proporcione max . Este método devuelve una cadena modificada.
Ejemplo
#!/usr/bin/python3
import re
phone = "2004-959-559 # This is Phone Number"
# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print ("Phone Num : ", num)
# Remove anything other than digits
num = re.sub(r'\D', "", phone)
print ("Phone Num : ", num)
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Phone Num : 2004-959-559
Phone Num : 2004959559
Modificadores de expresiones regulares: banderas de opciones
Los literales de expresión regular pueden incluir un modificador opcional para controlar varios aspectos de la coincidencia. Los modificadores se especifican como una bandera opcional. Puede proporcionar varios modificadores utilizando OR exclusivo (|), como se mostró anteriormente y puede estar representado por uno de estos:
No Señor. | Modificador y descripción |
---|---|
1 | re.I Realiza una coincidencia que no distingue entre mayúsculas y minúsculas. |
2 | re.L Interpreta palabras de acuerdo con la ubicación actual. Esta interpretación afecta al grupo alfabético (\ w y \ W), así como al comportamiento de los límites de las palabras (\ by \ B). |
3 | re.M Hace que $ coincida con el final de una línea (no solo el final de la cadena) y hace que ^ coincida con el comienzo de cualquier línea (no solo el comienzo de la cadena). |
4 | re.S Hace que un punto (punto) coincida con cualquier carácter, incluido un salto de línea. |
5 | re.U Interpreta letras según el juego de caracteres Unicode. Esta bandera afecta el comportamiento de \ w, \ W, \ b, \ B. |
6 | re.X Permite una sintaxis de expresión regular "más linda". Ignora los espacios en blanco (excepto dentro de un conjunto [] o cuando se escapa por una barra invertida) y trata el # sin escape como un marcador de comentario. |
Patrones de expresión regular
Excepto por los personajes de control, (+ ? . * ^ $ ( ) [ ] { } | \), todos los personajes coinciden. Puede escapar de un carácter de control precediéndolo con una barra invertida.
La siguiente tabla enumera la sintaxis de expresiones regulares que está disponible en Python:
No Señor. | Descripción de parámetros |
---|---|
1 | ^ Coincide con el comienzo de la línea. |
2 | $ Coincide con el final de la línea. |
3 | . Coincide con cualquier carácter, excepto la nueva línea. El uso de la opción m también le permite hacer coincidir la nueva línea. |
4 | [...] Coincide con cualquier carácter individual entre paréntesis. |
5 | [^...] Coincide con cualquier carácter individual que no esté entre corchetes |
6 | re* Coincide con 0 o más apariciones de la expresión anterior. |
7 | re+ Coincide con 1 o más ocurrencias de la expresión anterior. |
8 | re? Coincide con 0 o 1 aparición de la expresión anterior. |
9 | re{ n} Coincide exactamente con n número de apariciones de la expresión anterior. |
10 | re{ n,} Coincide con no más apariciones de la expresión anterior. |
11 | re{ n, m} Coincide con al menos n y como máximo m apariciones de la expresión anterior. |
12 | a|b Coincide con a o b. |
13 | (re) Agrupa expresiones regulares y recuerda texto coincidente. |
14 | (?imx) Alterna temporalmente entre las opciones i, m o x dentro de una expresión regular. Si está entre paréntesis, solo esa área se ve afectada. |
15 | (?-imx) Desactiva temporalmente las opciones i, m o x dentro de una expresión regular. Si está entre paréntesis, solo esa área se ve afectada. |
dieciséis | (?: re) Agrupa expresiones regulares sin recordar el texto coincidente. |
17 | (?imx: re) Cambia temporalmente las opciones i, m o x entre paréntesis. |
18 | (?-imx: re) Desactiva temporalmente las opciones i, m o x entre paréntesis. |
19 | (?#...) Comentario. |
20 | (?= re) Especifica la posición mediante un patrón. No tiene rango. |
21 | (?! re) Especifica la posición mediante la negación del patrón. No tiene rango. |
22 | (?> re) Coincide con el patrón independiente sin retroceso. |
23 | \w Coincide con caracteres de palabra. |
24 | \W Coincide con caracteres que no son palabras. |
25 | \s Coincide con los espacios en blanco. Equivalente a [\ t \ n \ r \ f]. |
26 | \S Coincide con espacios que no son en blanco. |
27 | \d Coincide con dígitos. Equivalente a [0-9]. |
28 | \D Coincide con no dígitos. |
29 | \A Coincide con el comienzo de la cadena. |
30 | \Z Coincide con el final de la cuerda. Si existe una nueva línea, coincide justo antes de la nueva línea. |
31 | \z Coincide con el final de la cuerda. |
32 | \G Los partidos apuntan donde terminó el último partido. |
33 | \b Coincide con los límites de las palabras cuando están fuera de los corchetes. Coincide con el retroceso (0x08) cuando está dentro de los corchetes. |
34 | \B Coincide con los límites que no son palabras. |
35 | \n, \t, etc. Coincide con nuevas líneas, retornos de carro, pestañas, etc. |
36 | \1...\9 Coincide con la enésima subexpresión agrupada. |
37 | \10 Coincide con la enésima subexpresión agrupada si ya coincidió. De lo contrario, se refiere a la representación octal de un código de carácter. |
Ejemplos de expresiones regulares
Caracteres literales
No Señor. | Ejemplo y descripción |
---|---|
1 | python Coincide con "pitón". |
Clases de personajes
No Señor. | Ejemplo y descripción |
---|---|
1 | [Pp]ython Coincidir con "Python" o "python" |
2 | rub[ye] Coincidir con "ruby" o "rube" |
3 | [aeiou] Coincidir con cualquier vocal minúscula |
4 | [0-9] Coincidir con cualquier dígito; igual que [0123456789] |
5 | [a-z] Coincidir con cualquier letra ASCII minúscula |
6 | [A-Z] Coincide con cualquier letra ASCII mayúscula |
7 | [a-zA-Z0-9] Coincide con cualquiera de los anteriores |
8 | [^aeiou] Coincidir con cualquier cosa que no sea una vocal minúscula |
9 | [^0-9] Coincide con cualquier cosa que no sea un dígito |
Clases de personajes especiales
No Señor. | Ejemplo y descripción |
---|---|
1 | . Coincidir con cualquier carácter excepto nueva línea |
2 | \d Coincide con un dígito: [0-9] |
3 | \D Coincidir con un no dígito: [^ 0-9] |
4 | \s Coincide con un carácter de espacio en blanco: [\ t \ r \ n \ f] |
5 | \S Coincidir con espacios que no son en blanco: [^ \ t \ r \ n \ f] |
6 | \w Coincide con un carácter de una sola palabra: [A-Za-z0-9_] |
7 | \W Coincide con un carácter que no es una palabra: [^ A-Za-z0-9_] |
Casos de repetición
No Señor. | Ejemplo y descripción |
---|---|
1 | ruby? Coincidir con "rub" o "ruby": la y es opcional |
2 | ruby* Coincide con "frotar" más 0 o más ys |
3 | ruby+ Coincide con "frotar" más 1 o más ys |
4 | \d{3} Coincidir exactamente con 3 dígitos |
5 | \d{3,} Coincide con 3 o más dígitos |
6 | \d{3,5} Coincide con 3, 4 o 5 dígitos |
Repetición no maligna
Esto coincide con el menor número de repeticiones:
No Señor. | Ejemplo y descripción |
---|---|
1 | <.*> Repetición codiciosa: coincide con "<python> perl>" |
2 | <.*?> Nongreedy: coincide con "<python>" en "<python> perl>" |
Agrupar con paréntesis
No Señor. | Ejemplo y descripción |
---|---|
1 | \D\d+ Sin grupo: + repeticiones \ d |
2 | (\D\d)+ Agrupados: + repeticiones \ D \ d par |
3 | ([Pp]ython(,)?)+ Coincidir con "Python", "Python, python, python", etc. |
Referencias anteriores
Esto vuelve a coincidir con un grupo previamente emparejado:
No Señor. | Ejemplo y descripción |
---|---|
1 | ([Pp])ython&\1ails Coincidir con Python y cubos o Python y cubos |
2 | (['"])[^\1]*\1 Cadena de comillas simples o dobles. \ 1 coincide con lo que coincida con el primer grupo. \ 2 coincide con lo que coincida con el segundo grupo, etc. |
Alternativas
No Señor. | Ejemplo y descripción |
---|---|
1 | python|perl Coincidir con "python" o "perl" |
2 | rub(y|le) Coincidir con "rubí" o "rublo" |
3 | Python(!+|\?) "Python" seguido de uno o más. o uno ? |
Anclas
Esto debe especificar la posición de coincidencia.
No Señor. | Ejemplo y descripción |
---|---|
1 | ^Python Coincide con "Python" al comienzo de una cadena o línea interna |
2 | Python$ Coincide con "Python" al final de una cadena o línea |
3 | \APython Coincide con "Python" al comienzo de una cadena |
4 | Python\Z Coincide con "Python" al final de una cadena |
5 | \bPython\b Coincidir con "Python" en el límite de una palabra |
6 | \brub\B \ B es un límite sin palabras: coincide con "rub" en "rube" y "ruby" pero no solo |
7 | Python(?=!) Coincide con "Python", si va seguido de un signo de exclamación. |
8 | Python(?!!) Coincide con "Python", si no va seguido de un signo de exclamación. |
Sintaxis especial con paréntesis
No Señor. | Ejemplo y descripción |
---|---|
1 | R(?#comment) Coincide con "R". Todo lo demás es un comentario. |
2 | R(?i)uby No distingue entre mayúsculas y minúsculas al coincidir con "uby" |
3 | R(?i:uby) Lo mismo que arriba |
4 | rub(?:y|le)) Agrupar solo sin crear \ 1 referencia inversa |
La interfaz de puerta de enlace común, o CGI, es un conjunto de estándares que definen cómo se intercambia la información entre el servidor web y un script personalizado. Las especificaciones CGI las mantiene actualmente la NCSA.
¿Qué es CGI?
La Interfaz de puerta de enlace común, o CGI, es un estándar para que los programas de puerta de enlace externos interactúen con servidores de información como los servidores HTTP.
La versión actual es CGI / 1.1 y CGI / 1.2 está en proceso.
Buscando en la web
Para comprender el concepto de CGI, veamos qué sucede cuando hacemos clic en un hipervínculo para navegar por una página web o URL en particular.
Su navegador se comunica con el servidor web HTTP y solicita la URL, es decir, el nombre del archivo.
Web Server analiza la URL y busca el nombre del archivo. Si encuentra ese archivo, lo envía de vuelta al navegador; de lo contrario, envía un mensaje de error que indica que solicitó un archivo incorrecto.
El navegador web recibe la respuesta del servidor web y muestra el archivo recibido o el mensaje de error.
Sin embargo, es posible configurar el servidor HTTP para que cada vez que se solicite un archivo en un directorio determinado, ese archivo no se devuelva; en su lugar, se ejecuta como un programa, y todo lo que genera ese programa se envía de vuelta para que lo muestre su navegador. Esta función se llama Common Gateway Interface o CGI y los programas se denominan scripts CGI. Estos programas CGI pueden ser un script de Python, un script PERL, un script de shell, un programa C o C ++, etc.
Diagrama de arquitectura CGI
Soporte y configuración del servidor web
Antes de continuar con la programación CGI, asegúrese de que su servidor web sea compatible con CGI y esté configurado para manejar programas CGI. Todos los programas CGI que ejecutará el servidor HTTP se guardan en un directorio preconfigurado. Este directorio se llama CGI Directory y por convención se denomina / var / www / cgi-bin. Por convención, los archivos CGI tienen la extensión.cgi, pero puedes mantener tus archivos con la extensión python .py también.
De forma predeterminada, el servidor Linux está configurado para ejecutar solo los scripts en el directorio cgi-bin en / var / www. Si desea especificar cualquier otro directorio para ejecutar sus scripts CGI, comente las siguientes líneas en el archivo httpd.conf:
<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
<Directory "/var/www/cgi-bin">
Options All
</Directory>
Aquí, asumimos que tiene Web Server en funcionamiento correctamente y que puede ejecutar cualquier otro programa CGI como Perl o Shell, etc.
Primer programa CGI
Aquí hay un enlace simple, que está vinculado a un script CGI llamado hello.py . Este archivo se guarda en el directorio / var / www / cgi-bin y tiene el siguiente contenido. Antes de ejecutar su programa CGI, asegúrese de haber cambiado el modo de archivo usandochmod 755 hello.py Comando de UNIX para hacer que el archivo sea ejecutable.
#!/usr/bin/python
print ("Content-type:text/html\r\n\r\n")
print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print ('<h2>Hello Word! This is my first CGI program</h2>')
print ('</body>')
print ('</html>')
Note- La primera línea del script debe ser la ruta al ejecutable de Python. En Linux debería ser #! / Usr / bin / python3
Ingrese la siguiente URL en su navegador
http://localhost:8080/cgi-bin/hello.py
¡Hola palabra! Este es mi primer programa CGI |
Este script hello.py es un script Python simple, que escribe su salida en el archivo STDOUT, es decir, la pantalla. Hay una característica importante y adicional disponible que es la primera línea que se imprimiráContent-type:text/html\r\n\r\n. Esta línea se envía de vuelta al navegador y especifica el tipo de contenido que se mostrará en la pantalla del navegador.
A estas alturas, debe haber entendido el concepto básico de CGI y puede escribir muchos programas CGI complicados usando Python. Este script puede interactuar con cualquier otro sistema externo también para intercambiar información como RDBMS.
Encabezado HTTP
La línea Content-type:text/html\r\n\r\nes parte del encabezado HTTP que se envía al navegador para comprender el contenido. Todo el encabezado HTTP tendrá la siguiente forma:
HTTP Field Name: Field Content
For Example
Content-type: text/html\r\n\r\n
Hay algunos otros encabezados HTTP importantes, que utilizará con frecuencia en su programación CGI.
No Señor. | Encabezado y descripción |
---|---|
1 | Content-type: Una cadena MIME que define el formato del archivo que se devuelve. El ejemplo es Content-type: text / html |
2 | Expires: Date La fecha en que la información deja de ser válida. El navegador lo utiliza para decidir cuándo es necesario actualizar una página. Una cadena de fecha válida tiene el formato 01 de enero de 1998 12:00:00 GMT. |
3 | Location: URL La URL que se devuelve en lugar de la URL solicitada. Puede utilizar este campo para redirigir una solicitud a cualquier archivo. |
4 | Last-modified: Date La fecha de la última modificación del recurso. |
5 | Content-length: N La longitud, en bytes, de los datos que se devuelven. El navegador usa este valor para informar el tiempo estimado de descarga de un archivo. |
6 | Set-Cookie: String Establecer la cookie pasada a través de la cadena |
Variables de entorno CGI
Todos los programas CGI tienen acceso a las siguientes variables de entorno. Estas variables juegan un papel importante al escribir cualquier programa CGI.
No Señor. | Nombre y descripción de variable |
---|---|
1 | CONTENT_TYPE El tipo de datos del contenido. Se utiliza cuando el cliente envía contenido adjunto al servidor. Por ejemplo, carga de archivos. |
2 | CONTENT_LENGTH La longitud de la información de la consulta. Está disponible solo para solicitudes POST. |
3 | HTTP_COOKIE Devuelve las cookies configuradas en forma de par clave y valor. |
4 | HTTP_USER_AGENT El campo de encabezado de solicitud de agente de usuario contiene información sobre el agente de usuario que origina la solicitud. Es el nombre del navegador web. |
5 | PATH_INFO La ruta del script CGI. |
6 | QUERY_STRING La información codificada en URL que se envía con la solicitud del método GET. |
7 | REMOTE_ADDR La dirección IP del host remoto que realiza la solicitud. Este es un registro útil o para autenticación. |
8 | REMOTE_HOST El nombre completo del host que realiza la solicitud. Si esta información no está disponible, REMOTE_ADDR se puede utilizar para obtener la dirección de infrarrojos. |
9 | REQUEST_METHOD El método utilizado para realizar la solicitud. Los métodos más comunes son GET y POST. |
10 | SCRIPT_FILENAME La ruta completa al script CGI. |
11 | SCRIPT_NAME El nombre del script CGI. |
12 | SERVER_NAME El nombre de host o la dirección IP del servidor |
13 | SERVER_SOFTWARE El nombre y la versión del software que ejecuta el servidor. |
Aquí hay un pequeño programa CGI para enumerar todas las variables CGI. Haga clic en este enlace para ver el resultado Obtener entorno
#!/usr/bin/python
import os
print ("Content-type: text/html\r\n\r\n");
print ("<font size=+1>Environment</font><\br>");
for param in os.environ.keys():
print ("<b>%20s</b>: %s<\br>" % (param, os.environ[param]))
Métodos GET y POST
Debe haberse encontrado con muchas situaciones en las que necesita pasar información de su navegador al servidor web y, en última instancia, a su programa CGI. Con mayor frecuencia, el navegador utiliza dos métodos: dos pasan esta información al servidor web. Estos métodos son el método GET y el método POST.
Pasando información usando el método GET
El método GET envía la información de usuario codificada adjunta a la solicitud de página. La página y la información codificada están separadas por? personaje de la siguiente manera:
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
El método GET es el método predeterminado para pasar información del navegador al servidor web y produce una cadena larga que aparece en el cuadro Ubicación: de su navegador. Nunca use el método GET si tiene una contraseña u otra información confidencial para pasar al servidor. El método GET tiene una limitación de tamaño: solo se pueden enviar 1024 caracteres en una cadena de solicitud. El método GET envía información usando el encabezado QUERY_STRING y será accesible en su Programa CGI a través de la variable de entorno QUERY_STRING.
Puede pasar información simplemente concatenando pares de clave y valor junto con cualquier URL o puede usar etiquetas HTML <FORM> para pasar información usando el método GET.
Ejemplo de URL simple: método Get
Aquí hay una URL simple, que pasa dos valores al programa hello_get.py usando el método GET.
/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALIA continuación es hello_get.pyscript para manejar la entrada proporcionada por el navegador web. Vamos a usarcgi módulo, que hace que sea muy fácil acceder a la información transmitida -
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print ("Content-type:text/html\r\n\r\n")
print ("<html>")
print ("<head>")
print ("<title>Hello - Second CGI Program</title>")
print ("</head>")
print ("<body>")
print ("<h2>Hello %s %s</h2>" % (first_name, last_name))
print ("</body>")
print ("</html>")
Esto generaría el siguiente resultado:
Hola ZARA ALI |
Ejemplo de FORM simple: método GET
Este ejemplo pasa dos valores usando HTML FORM y el botón enviar. Usamos el mismo script CGI hello_get.py para manejar esta entrada.
<form action = "/cgi-bin/hello_get.py" method = "get">
First Name: <input type = "text" name = "first_name"> <br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
Aquí está el resultado real del formulario anterior, ingrese el nombre y apellido y luego haga clic en el botón Enviar para ver el resultado.
Pasar información mediante el método POST
Un método generalmente más confiable para pasar información a un programa CGI es el método POST. Esto empaqueta la información exactamente de la misma manera que los métodos GET, pero en lugar de enviarla como una cadena de texto después de? en la URL lo envía como un mensaje separado. Este mensaje viene al script CGI en forma de entrada estándar.
A continuación se muestra el mismo script hello_get.py que maneja el método GET y POST.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"
Tomemos de nuevo el mismo ejemplo que el anterior, que pasa dos valores usando HTML FORM y el botón enviar. Usamos el mismo script CGI hello_get.py para manejar esta entrada.
<form action = "/cgi-bin/hello_get.py" method = "post">
First Name: <input type = "text" name = "first_name"><br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
Aquí está la salida real del formulario anterior. Ingrese el nombre y apellido y luego haga clic en el botón enviar para ver el resultado.
Pasar datos de casilla de verificación al programa CGI
Las casillas de verificación se utilizan cuando se requiere seleccionar más de una opción.
Aquí hay un código HTML de ejemplo para un formulario con dos casillas de verificación:
<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on" /> Maths
<input type = "checkbox" name = "physics" value = "on" /> Physics
<input type = "submit" value = "Select Subject" />
</form>
El resultado de este código es el siguiente formulario:
A continuación se muestra el script checkbox.cgi para manejar la entrada proporcionada por el navegador web para el botón de casilla de verificación.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('maths'):
math_flag = "ON"
else:
math_flag = "OFF"
if form.getvalue('physics'):
physics_flag = "ON"
else:
physics_flag = "OFF"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Checkbox - Third CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> CheckBox Maths is : %s</h2>" % math_flag
print "<h2> CheckBox Physics is : %s</h2>" % physics_flag
print "</body>"
print "</html>"
Pasar datos de botones de radio al programa CGI
Los botones de opción se utilizan cuando solo se requiere seleccionar una opción.
Aquí hay un código HTML de ejemplo para un formulario con dos botones de opción:
<form action = "/cgi-bin/radiobutton.py" method = "post" target = "_blank">
<input type = "radio" name = "subject" value = "maths" /> Maths
<input type = "radio" name = "subject" value = "physics" /> Physics
<input type = "submit" value = "Select Subject" />
</form>
El resultado de este código es el siguiente formulario:
A continuación se muestra el script radiobutton.py para manejar la entrada proporcionada por el navegador web para el botón de opción:
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('subject'):
subject = form.getvalue('subject')
else:
subject = "Not set"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Radio - Fourth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"
Pasar datos de área de texto al programa CGI
El elemento TEXTAREA se utiliza cuando el texto de varias líneas se debe pasar al programa CGI.
Aquí hay un código HTML de ejemplo para un formulario con un cuadro TEXTAREA:
<form action = "/cgi-bin/textarea.py" method = "post" target = "_blank">
<textarea name = "textcontent" cols = "40" rows = "4">
Type your text here...
</textarea>
<input type = "submit" value = "Submit" />
</form>
El resultado de este código es el siguiente formulario:
A continuación se muestra el script textarea.cgi para manejar la entrada proporcionada por el navegador web:
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('textcontent'):
text_content = form.getvalue('textcontent')
else:
text_content = "Not entered"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Entered Text Content is %s</h2>" % text_content
print "</body>"
Pasar datos del cuadro desplegable al programa CGI
El cuadro desplegable se utiliza cuando tenemos muchas opciones disponibles, pero solo se seleccionarán una o dos.
Aquí hay un ejemplo de código HTML para un formulario con un cuadro desplegable:
<form action = "/cgi-bin/dropdown.py" method = "post" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit"/>
</form>
El resultado de este código es el siguiente formulario:
A continuación se muestra el script dropdown.py para manejar la entrada proporcionada por el navegador web.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('dropdown'):
subject = form.getvalue('dropdown')
else:
subject = "Not entered"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Dropdown Box - Sixth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"
Uso de cookies en CGI
El protocolo HTTP es un protocolo sin estado. Para un sitio web comercial, se requiere mantener la información de la sesión entre diferentes páginas. Por ejemplo, el registro de un usuario finaliza después de completar muchas páginas. ¿Cómo mantener la información de la sesión del usuario en todas las páginas web?
En muchas situaciones, el uso de cookies es el método más eficiente para recordar y rastrear preferencias, compras, comisiones y otra información requerida para una mejor experiencia del visitante o estadísticas del sitio.
¿Cómo funciona?
Su servidor envía algunos datos al navegador del visitante en forma de cookie. El navegador puede aceptar la cookie. Si es así, se almacena como un registro de texto sin formato en el disco duro del visitante. Ahora, cuando el visitante llega a otra página de su sitio, la cookie está disponible para su recuperación. Una vez recuperado, su servidor sabe / recuerda lo que se almacenó.
Las cookies son un registro de datos de texto sin formato de 5 campos de longitud variable:
Expires- La fecha de caducidad de la cookie. Si está en blanco, la cookie caducará cuando el visitante salga del navegador.
Domain - El nombre de dominio de su sitio.
Path- La ruta al directorio o página web que establece la cookie. Esto puede estar en blanco si desea recuperar la cookie de cualquier directorio o página.
Secure- Si este campo contiene la palabra "seguro", la cookie solo se puede recuperar con un servidor seguro. Si este campo está en blanco, no existe tal restricción.
Name=Value - Las cookies se configuran y recuperan en forma de pares de clave y valor.
Configurar cookies
Es muy fácil enviar cookies al navegador. Estas cookies se envían junto con el encabezado HTTP antes del campo de tipo de contenido. Suponiendo que desea establecer el ID de usuario y la contraseña como cookies. La configuración de las cookies se realiza de la siguiente manera:
#!/usr/bin/python
print "Set-Cookie:UserID = XYZ;\r\n"
print "Set-Cookie:Password = XYZ123;\r\n"
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT;\r\n"
print "Set-Cookie:Domain = www.tutorialspoint.com;\r\n"
print "Set-Cookie:Path = /perl;\n"
print "Content-type:text/html\r\n\r\n"
...........Rest of the HTML Content....
De este ejemplo, debe haber entendido cómo configurar cookies. UsamosSet-Cookie Encabezado HTTP para configurar cookies.
Es opcional establecer atributos de cookies como Caducidad, Dominio y Ruta. Es notable que las cookies se establecen antes de enviar línea mágica."Content-type:text/html\r\n\r\n.
Recuperando cookies
Es muy fácil recuperar todas las cookies configuradas. Las cookies se almacenan en la variable de entorno CGI HTTP_COOKIE y tendrán la siguiente forma:
key1 = value1;key2 = value2;key3 = value3....
A continuación, se muestra un ejemplo de cómo recuperar cookies.
#!/usr/bin/python
# Import modules for CGI handling
from os import environ
import cgi, cgitb
if environ.has_key('HTTP_COOKIE'):
for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
(key, value ) = split(cookie, '=');
if key == "UserID":
user_id = value
if key == "Password":
password = value
print "User ID = %s" % user_id
print "Password = %s" % password
Esto produce el siguiente resultado para las cookies establecidas por el script anterior:
User ID = XYZ
Password = XYZ123
Ejemplo de carga de archivos
Para cargar un archivo, el formulario HTML debe tener el atributo enctype establecido en multipart/form-data. La etiqueta de entrada con el tipo de archivo crea un botón "Examinar".
<html>
<body>
<form enctype = "multipart/form-data"
action = "save_file.py" method = "post">
<p>File: <input type = "file" name = "filename" /></p>
<p><input type = "submit" value = "Upload" /></p>
</form>
</body>
</html>
El resultado de este código es el siguiente formulario:
El ejemplo anterior se ha desactivado intencionalmente para guardar a las personas que cargan archivos en nuestro servidor, pero puede probar el código anterior con su servidor.
Aqui esta el guion save_file.py para manejar la carga de archivos -
#!/usr/bin/python
import cgi, os
import cgitb; cgitb.enable()
form = cgi.FieldStorage()
# Get filename here.
fileitem = form['filename']
# Test if the file was uploaded
if fileitem.filename:
# strip leading path from file name to avoid
# directory traversal attacks
fn = os.path.basename(fileitem.filename)
open('/tmp/' + fn, 'wb').write(fileitem.file.read())
message = 'The file "' + fn + '" was uploaded successfully'
else:
message = 'No file was uploaded'
print """\
Content-Type: text/html\n
<html>
<body>
<p>%s</p>
</body>
</html>
""" % (message,)
Si ejecuta el script anterior en Unix / Linux, entonces debe encargarse de reemplazar el separador de archivos de la siguiente manera; de lo contrario, en su máquina con Windows, la declaración open () debería funcionar bien.
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))
¿Cómo abrir un cuadro de diálogo de "Descarga de archivos"?
A veces, se desea que desee dar una opción en la que un usuario puede hacer clic en un enlace y aparecerá un cuadro de diálogo "Descarga de archivo" para el usuario en lugar de mostrar el contenido real. Esto es muy fácil y se puede lograr a través del encabezado HTTP. Este encabezado HTTP es diferente del encabezado mencionado en la sección anterior.
Por ejemplo, si quieres hacer un FileName archivo descargable desde un enlace determinado, entonces su sintaxis es la siguiente:
#!/usr/bin/python
# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";
# Actual File Content will go here.
fo = open("foo.txt", "rb")
str = fo.read();
print str
# Close opend file
fo.close()
Espero que hayan disfrutado este tutorial. En caso afirmativo, envíeme sus comentarios a: Contáctenos
El estándar de Python para interfaces de bases de datos es Python DB-API. La mayoría de las interfaces de bases de datos de Python se adhieren a este estándar.
Puede elegir la base de datos adecuada para su aplicación. La API de base de datos de Python admite una amplia gama de servidores de bases de datos, como:
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
- SQLite
Aquí está la lista de interfaces de base de datos de Python disponibles: interfaces de base de datos de Python y API . Debe descargar un módulo DB API por separado para cada base de datos a la que necesite acceder. Por ejemplo, si necesita acceder a una base de datos Oracle y una base de datos MySQL, debe descargar los módulos de base de datos Oracle y MySQL.
La API de base de datos proporciona un estándar mínimo para trabajar con bases de datos que utilizan estructuras y sintaxis de Python siempre que sea posible. Esta API incluye lo siguiente:
- Importando el módulo API.
- Adquirir una conexión con la base de datos.
- Emisión de sentencias SQL y procedimientos almacenados.
- Cerrar la conexión
Python tiene un soporte incorporado para SQLite. En esta sección, aprenderíamos todos los conceptos usando MySQL. El módulo MySQLdb, una interfaz popular con MySQL no es compatible con Python 3. En su lugar, usaremos el módulo PyMySQL .
¿Qué es PyMySQL?
PyMySQL es una interfaz para conectarse a un servidor de base de datos MySQL desde Python. Implementa la API de base de datos de Python v2.0 y contiene una biblioteca cliente MySQL de Python puro. El objetivo de PyMySQL es ser un reemplazo directo de MySQLdb.
¿Cómo instalo PyMySQL?
Antes de continuar, asegúrese de tener PyMySQL instalado en su máquina. Simplemente escriba lo siguiente en su secuencia de comandos de Python y ejecútelo:
#!/usr/bin/python3
import pymysql
Si produce el siguiente resultado, significa que el módulo MySQLdb no está instalado:
Traceback (most recent call last):
File "test.py", line 3, in <module>
Import pymysql
ImportError: No module named pymysql
La última versión estable está disponible en PyPI y se puede instalar con pip -
pip install pymysql
Alternativamente (por ejemplo, si pip no está disponible), se puede descargar un tarball de GitHub e instalarlo con Setuptools de la siguiente manera:
$ # X.X is the desired pymysql version (e.g. 0.5 or 0.6).
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz $ cd PyMySQL*
$ python setup.py install $ # The folder PyMySQL* can be safely removed now.
Note - Asegúrese de tener privilegios de root para instalar el módulo anterior.
Conexión de base de datos
Antes de conectarse a una base de datos MySQL, asegúrese de los siguientes puntos:
Ha creado una base de datos TESTDB.
Ha creado una tabla EMPLOYEE en TESTDB.
Esta tabla tiene campos FIRST_NAME, LAST_NAME, EDAD, SEXO e INGRESOS.
El ID de usuario "testuser" y la contraseña "test123" están configurados para acceder a TESTDB.
El módulo Python PyMySQL está instalado correctamente en su máquina.
Ha seguido el tutorial de MySQL para comprender los conceptos básicos de MySQL.
Ejemplo
A continuación se muestra un ejemplo de conexión con la base de datos MySQL "TESTDB":
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")
# Fetch a single row using fetchone() method.
data = cursor.fetchone()
print ("Database version : %s " % data)
# disconnect from server
db.close()
Al ejecutar este script, produce el siguiente resultado.
Database version : 5.5.20-log
Si se establece una conexión con la fuente de datos, se devuelve un objeto de conexión y se guarda en db para uso posterior, de lo contrario dbestá establecido en Ninguno. Próximo,db El objeto se utiliza para crear un cursorobjeto, que a su vez se utiliza para ejecutar consultas SQL. Finalmente, antes de salir, se asegura de que la conexión a la base de datos esté cerrada y se liberen los recursos.
Crear tabla de base de datos
Una vez que se establece una conexión a la base de datos, estamos listos para crear tablas o registros en las tablas de la base de datos utilizando execute método del cursor creado.
Ejemplo
Creemos una tabla de base de datos EMPLEADO -
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# disconnect from server
db.close()
INSERTAR Operación
La operación INSERT es necesaria cuando desea crear sus registros en una tabla de base de datos.
Ejemplo
El siguiente ejemplo, ejecuta la instrucción SQL INSERT para crear un registro en la tabla EMPLOYEE:
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
El ejemplo anterior se puede escribir de la siguiente manera para crear consultas SQL dinámicamente:
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
Ejemplo
El siguiente segmento de código es otra forma de ejecución en la que puede pasar parámetros directamente:
..................................
user_id = "test123"
password = "password"
con.execute('insert into Login values("%s", "%s")' % \
(user_id, password))
..................................
Operación LEER
READ Operar en cualquier base de datos significa obtener información útil de la base de datos.
Una vez que se establece la conexión a la base de datos, está listo para realizar una consulta en esta base de datos. Puedes usar cualquierafetchone() método para buscar un solo registro o fetchall() método para obtener varios valores de una tabla de base de datos.
fetchone()- Obtiene la siguiente fila de un conjunto de resultados de consulta. Un conjunto de resultados es un objeto que se devuelve cuando se utiliza un objeto de cursor para consultar una tabla.
fetchall()- Obtiene todas las filas de un conjunto de resultados. Si ya se han extraído algunas filas del conjunto de resultados, recupera las filas restantes del conjunto de resultados.
rowcount - Este es un atributo de solo lectura y devuelve el número de filas que fueron afectadas por un método execute ().
Ejemplo
El siguiente procedimiento consulta todos los registros de la tabla EMPLOYEE que tienen un salario superior a 1000 -
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > '%d'" % (1000)
try:
# Execute the SQL command
cursor.execute(sql)
# Fetch all the rows in a list of lists.
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# Now print fetched result
print ("fname = %s,lname = %s,age = %d,sex = %s,income = %d" % \
(fname, lname, age, sex, income ))
except:
print ("Error: unable to fetch data")
# disconnect from server
db.close()
Salida
Esto producirá el siguiente resultado:
fname = Mac, lname = Mohan, age = 20, sex = M, income = 2000
Operación de actualización
ACTUALIZAR Operar en cualquier base de datos significa actualizar uno o más registros, que ya están disponibles en la base de datos.
El siguiente procedimiento actualiza todos los registros que tienen SEXO como 'M'. Aquí, aumentamos la EDAD de todos los machos en un año.
Ejemplo
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
WHERE SEX = '%c'" % ('M')
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
Operación DELETE
La operación DELETE es necesaria cuando desea eliminar algunos registros de su base de datos. A continuación se muestra el procedimiento para eliminar todos los registros de EMPLEADO donde la EDAD es mayor de 20:
Ejemplo
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
Realización de transacciones
Las transacciones son un mecanismo que garantiza la coherencia de los datos. Las transacciones tienen las siguientes cuatro propiedades:
Atomicity - O se completa una transacción o no ocurre nada.
Consistency - Una transacción debe comenzar en un estado consistente y dejar el sistema en un estado consistente.
Isolation - Los resultados intermedios de una transacción no son visibles fuera de la transacción actual.
Durability - Una vez que se comprometió una transacción, los efectos son persistentes, incluso después de una falla del sistema.
Python DB API 2.0 proporciona dos métodos para confirmar o revertir una transacción.
Ejemplo
Ya sabes cómo implementar transacciones. Aquí hay un ejemplo similar:
# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
Operación COMMIT
Confirmar es una operación, que da una señal verde a la base de datos para finalizar los cambios, y después de esta operación, ningún cambio puede revertirse.
Aquí hay un ejemplo simple para llamar al commit método.
db.commit()
Operación ROLLBACK
Si no está satisfecho con uno o más de los cambios y desea revertirlos por completo, utilice el rollback() método.
Aquí hay un ejemplo simple para llamar al rollback() método.
db.rollback()
Desconectar la base de datos
Para desconectar la conexión de la base de datos, use el método close ().
db.close()
Si el usuario cierra la conexión a una base de datos con el método close (), la base de datos revierte cualquier transacción pendiente. Sin embargo, en lugar de depender de cualquiera de los detalles de implementación de nivel inferior de la base de datos, sería mejor que su aplicación llamara a commit o rollback explícitamente.
Manejo de errores
Hay muchas fuentes de errores. Algunos ejemplos son un error de sintaxis en una instrucción SQL ejecutada, un error de conexión o una llamada al método de recuperación para un identificador de instrucción ya cancelado o terminado.
La API de base de datos define una serie de errores que deben existir en cada módulo de base de datos. La siguiente tabla enumera estas excepciones.
No Señor. | Excepción y descripción |
---|---|
1 | Warning Se utiliza para problemas no fatales. Debe subclase StandardError. |
2 | Error Clase base para errores. Debe subclase StandardError. |
3 | InterfaceError Se utiliza para errores en el módulo de la base de datos, no en la base de datos en sí. Debe subclase Error. |
4 | DatabaseError Se usa para errores en la base de datos. Debe subclase Error. |
5 | DataError Subclase de DatabaseError que se refiere a errores en los datos. |
6 | OperationalError Subclase de DatabaseError que se refiere a errores como la pérdida de una conexión a la base de datos. Estos errores generalmente están fuera del control del programa de secuencias de comandos de Python. |
7 | IntegrityError Subclase de DatabaseError para situaciones que dañarían la integridad relacional, como restricciones de unicidad o claves externas. |
8 | InternalError Subclase de DatabaseError que se refiere a errores internos del módulo de la base de datos, como un cursor que ya no está activo. |
9 | ProgrammingError Subclase de DatabaseError que se refiere a errores como un nombre de tabla incorrecto y otras cosas de las que se puede culpar de forma segura. |
10 | NotSupportedError Subclase de DatabaseError que se refiere a intentar llamar a una funcionalidad no admitida. |
Sus scripts de Python deben manejar estos errores, pero antes de usar cualquiera de las excepciones anteriores, asegúrese de que su MySQLdb sea compatible con esa excepción. Puede obtener más información sobre ellos leyendo la especificación DB API 2.0.
Python proporciona dos niveles de acceso a los servicios de red. En un nivel bajo, puede acceder al soporte básico de socket en el sistema operativo subyacente, lo que le permite implementar clientes y servidores para protocolos orientados a conexión y sin conexión.
Python también tiene bibliotecas que brindan acceso de nivel superior a protocolos de red de nivel de aplicación específicos, como FTP, HTTP, etc.
Este capítulo le brinda una comprensión del concepto más famoso en redes: la programación de sockets.
¿Qué son los enchufes?
Los sockets son los puntos finales de un canal de comunicaciones bidireccional. Los sockets pueden comunicarse dentro de un proceso, entre procesos en la misma máquina o entre procesos en diferentes continentes.
Los sockets se pueden implementar en varios tipos de canales diferentes: sockets de dominio Unix, TCP, UDP, etc. La biblioteca de sockets proporciona clases específicas para manejar los transportes comunes, así como una interfaz genérica para manejar el resto.
Los enchufes tienen su propio vocabulario:
No Señor. | Término y descripción |
---|---|
1 | domain La familia de protocolos que se utiliza como mecanismo de transporte. Estos valores son constantes como AF_INET, PF_INET, PF_UNIX, PF_X25, etc. |
2 | type El tipo de comunicaciones entre los dos puntos finales, normalmente SOCK_STREAM para protocolos orientados a conexión y SOCK_DGRAM para protocolos sin conexión. |
3 | protocol Normalmente cero, esto puede usarse para identificar una variante de un protocolo dentro de un dominio y tipo. |
4 | hostname El identificador de una interfaz de red -
|
5 | port Cada servidor escucha a los clientes que llaman a uno o más puertos. Un puerto puede ser un número de puerto de Fixnum, una cadena que contenga un número de puerto o el nombre de un servicio. |
El módulo de enchufe
Para crear un socket, debe utilizar la función socket.socket () disponible en el módulo socket, que tiene la sintaxis general:
s = socket.socket (socket_family, socket_type, protocol = 0)
Aquí está la descripción de los parámetros:
socket_family - Esto es AF_UNIX o AF_INET, como se explicó anteriormente.
socket_type - Esto es SOCK_STREAM o SOCK_DGRAM.
protocol - Por lo general, se omite, y el valor predeterminado es 0.
Una vez que tenga el objeto socket , puede usar las funciones requeridas para crear su programa cliente o servidor. A continuación se muestra la lista de funciones necesarias:
Métodos de socket del servidor
No Señor. | Método y descripción |
---|---|
1 | s.bind() Este método vincula la dirección (nombre de host, par de número de puerto) al socket. |
2 | s.listen() Este método configura e inicia el escucha de TCP. |
3 | s.accept() Esto acepta pasivamente la conexión del cliente TCP, esperando hasta que llegue la conexión (bloqueo). |
Métodos de socket de cliente
No Señor. | Método y descripción |
---|---|
1 | s.connect() Este método inicia activamente la conexión del servidor TCP. |
Métodos generales de socket
No Señor. | Método y descripción |
---|---|
1 | s.recv() Este método recibe un mensaje TCP |
2 | s.send() Este método transmite un mensaje TCP |
3 | s.recvfrom() Este método recibe un mensaje UDP |
4 | s.sendto() Este método transmite mensaje UDP |
5 | s.close() Este método cierra el socket |
6 | socket.gethostname() Devuelve el nombre de host. |
Un servidor simple
Para escribir servidores de Internet, usamos el socketfunción disponible en el módulo socket para crear un objeto socket. A continuación, se utiliza un objeto de socket para llamar a otras funciones para configurar un servidor de socket.
Ahora llama al bind(hostname, port)función para especificar un puerto para su servicio en el host dado.
A continuación, llame al método accept del objeto devuelto. Este método espera hasta que un cliente se conecta al puerto que especificó y luego devuelve un objeto de conexión que representa la conexión a ese cliente.
#!/usr/bin/python3 # This is server.py file
import socket
# create a socket object
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
# get local machine name
host = socket.gethostname()
port = 9999
# bind to the port
serversocket.bind((host, port))
# queue up to 5 requests
serversocket.listen(5)
while True:
# establish a connection
clientsocket,addr = serversocket.accept()
print("Got a connection from %s" % str(addr))
msg = 'Thank you for connecting'+ "\r\n"
clientsocket.send(msg.encode('ascii'))
clientsocket.close()
Un cliente simple
Escribamos un programa cliente muy simple que abre una conexión a un puerto dado 12345 y un host dado. Es muy simple crear un cliente de socket usando la función del módulo de socket de Python .
los socket.connect(hosname, port )abre una conexión TCP al nombre de host en el puerto . Una vez que tenga un socket abierto, puede leerlo como cualquier objeto IO. Cuando termine, recuerde cerrarlo, como cerraría un archivo.
Ejemplo
El siguiente código es un cliente muy simple que se conecta a un host y puerto determinados, lee cualquier dato disponible del socket y luego sale:
#!/usr/bin/python3 # This is client.py file
import socket
# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# get local machine name
host = socket.gethostname()
port = 9999
# connection to hostname on the port.
s.connect((host, port))
# Receive no more than 1024 bytes
msg = s.recv(1024)
s.close()
print (msg.decode('ascii'))
Ahora ejecute este server.py en segundo plano y luego ejecute el client.py anterior para ver el resultado.
# Following would start a server in background.
$ python server.py & # Once server is started run client as follows: $ python client.py
Salida
Esto produciría el siguiente resultado:
on server terminal
Got a connection from ('192.168.1.10', 3747)
On client terminal
Thank you for connecting
Módulos de Internet de Python
A continuación se proporciona una lista de algunos módulos importantes en la programación de Python Network / Internet:
Protocolo | Función común | Puerto No | Módulo de Python |
---|---|---|---|
HTTP | páginas web | 80 | httplib, urllib, xmlrpclib |
NNTP | Noticias de Usenet | 119 | nntplib |
FTP | Transferencias de archivos | 20 | ftplib, urllib |
SMTP | Envío de correo electrónico | 25 | smtplib |
POP3 | Obteniendo correo electrónico | 110 | poplib |
IMAP4 | Obteniendo correo electrónico | 143 | imaplib |
Telnet | Líneas de comando | 23 | telnetlib |
Ardilla de tierra | Transferencias de documentos | 70 | gopherlib, urllib |
Verifique todas las bibliotecas mencionadas anteriormente para trabajar con los protocolos FTP, SMTP, POP e IMAP.
Lecturas adicionales
Este fue un comienzo rápido con la programación de sockets. Es un tema vasto. Se recomienda pasar por el siguiente enlace para encontrar más detalles:
Programación de Socket Unix .
Módulos y biblioteca de sockets de Python .
El Protocolo simple de transferencia de correo (SMTP) es un protocolo que gestiona el envío de un correo electrónico y el enrutamiento del correo electrónico entre servidores de correo.
Python proporciona smtplib módulo, que define un objeto de sesión de cliente SMTP que se puede utilizar para enviar correos a cualquier máquina de Internet con un demonio de escucha SMTP o ESMTP.
Aquí hay una sintaxis simple para crear un objeto SMTP, que luego se puede usar para enviar un correo electrónico:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
Aquí está el detalle de los parámetros:
host- Este es el host que ejecuta su servidor SMTP. Puede especificar la dirección IP del host o un nombre de dominio como tutorialspoint.com. Este es un argumento opcional.
port- Si proporciona un argumento de host , debe especificar un puerto, donde el servidor SMTP está escuchando. Por lo general, este puerto sería 25.
local_hostname- Si su servidor SMTP se está ejecutando en su máquina local, puede especificar solo localhost la opción.
Un objeto SMTP tiene un método de instancia llamado sendmail, que normalmente se utiliza para enviar un mensaje por correo. Se necesitan tres parámetros:
El remitente : una cadena con la dirección del remitente.
Los receptores : una lista de cadenas, una para cada destinatario.
El mensaje : un mensaje como una cadena con el formato especificado en las distintas RFC.
Ejemplo
A continuación, se muestra una forma sencilla de enviar un correo electrónico mediante el script Python. Pruébelo una vez -
#!/usr/bin/python3
import smtplib
sender = '[email protected]'
receivers = ['[email protected]']
message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test
This is a test e-mail message.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
except SMTPException:
print "Error: unable to send email"
Aquí, ha colocado un correo electrónico básico en el mensaje, utilizando una comilla triple, teniendo cuidado de formatear los encabezados correctamente. Un correo electrónico requiere unFrom, Toy un Subject encabezado, separado del cuerpo del correo electrónico con una línea en blanco.
Para enviar el correo, use smtpObj para conectarse al servidor SMTP en la máquina local. Luego, use el método sendmail junto con el mensaje, la dirección de remitente y la dirección de destino como parámetros (aunque las direcciones de origen y destino están dentro del correo electrónico, no siempre se usan para enrutar el correo).
Si no está ejecutando un servidor SMTP en su máquina local, puede usar el cliente smtplib para comunicarse con un servidor SMTP remoto. A menos que esté utilizando un servicio de correo web (como gmail o Yahoo! Mail), su proveedor de correo electrónico debe haberle proporcionado los detalles del servidor de correo saliente que puede proporcionar, de la siguiente manera:
mail = smtplib.SMTP('smtp.gmail.com', 587)
Enviar un correo electrónico HTML usando Python
Cuando envía un mensaje de texto utilizando Python, todo el contenido se trata como texto simple. Incluso si incluye etiquetas HTML en un mensaje de texto, se muestra como texto simple y las etiquetas HTML no se formatearán de acuerdo con la sintaxis HTML. Sin embargo, Python ofrece una opción para enviar un mensaje HTML como mensaje HTML real.
Al enviar un mensaje de correo electrónico, puede especificar una versión de Mime, el tipo de contenido y el juego de caracteres para enviar un correo electrónico HTML.
Ejemplo
A continuación, se muestra un ejemplo para enviar el contenido HTML como un correo electrónico. Pruébelo una vez -
#!/usr/bin/python3
import smtplib
message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test
This is an e-mail message to be sent in HTML format
<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
except SMTPException:
print "Error: unable to send email"
Envío de archivos adjuntos como correo electrónico
Para enviar un correo electrónico con contenido mixto, es necesario configurar el Content-type encabezado a multipart/mixed. Luego, el texto y las secciones de adjuntos se pueden especificar dentroboundaries.
Un límite se inicia con dos guiones seguidos de un número único, que no puede aparecer en la parte del mensaje del correo electrónico. Un límite final que indique la sección final del correo electrónico también debe terminar con dos guiones.
Los archivos adjuntos deben estar codificados con la pack("m") función para tener codificación base 64 antes de la transmisión.
Ejemplo
A continuación se muestra un ejemplo, que envía un archivo /tmp/test.txtcomo un archivo adjunto. Pruébelo una vez -
#!/usr/bin/python3
import smtplib
import base64
filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent) # base64
sender = '[email protected]'
reciever = '[email protected]'
marker = "AUNIQUEMARKER"
body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit
%s
--%s
""" % (body,marker)
# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, reciever, message)
print "Successfully sent email"
except Exception:
print ("Error: unable to send email")
Ejecutar varios subprocesos es similar a ejecutar varios programas diferentes al mismo tiempo, pero con los siguientes beneficios:
Varios subprocesos dentro de un proceso comparten el mismo espacio de datos con el subproceso principal y, por lo tanto, pueden compartir información o comunicarse entre sí más fácilmente que si fueran procesos separados.
Los subprocesos a veces se denominan procesos ligeros y no requieren mucha sobrecarga de memoria; son más baratos que los procesos.
Un hilo tiene un comienzo, una secuencia de ejecución y una conclusión. Tiene un puntero de instrucción que realiza un seguimiento de dónde se está ejecutando actualmente dentro de su contexto.
Puede ser sustituido (interrumpido).
Se puede poner en espera temporalmente (también conocido como inactivo) mientras se ejecutan otros subprocesos; esto se denomina ceder.
Hay dos tipos diferentes de hilos:
- hilo de kernel
- hilo de usuario
Los subprocesos del kernel son parte del sistema operativo, mientras que los subprocesos del espacio de usuario no se implementan en el kernel.
Hay dos módulos que admiten el uso de subprocesos en Python3:
- _thread
- threading
El módulo de subprocesos ha estado "en desuso" durante bastante tiempo. Se anima a los usuarios a utilizar el módulo de subprocesos en su lugar. Por lo tanto, en Python 3, el módulo "hilo" ya no está disponible. Sin embargo, ha sido renombrado a "_thread" para compatibilidades con versiones anteriores en Python3.
Comenzando un nuevo hilo
Para generar otro hilo, debe llamar al siguiente método disponible en el módulo del hilo :
_thread.start_new_thread ( function, args[, kwargs] )
Esta llamada al método permite una forma rápida y eficiente de crear nuevos subprocesos tanto en Linux como en Windows.
La llamada al método regresa inmediatamente y el subproceso secundario comienza y llama a la función con la lista pasada de argumentos . Cuando la función regresa, el hilo termina.
Aquí, args es una tupla de argumentos; use una tupla vacía para llamar a la función sin pasar ningún argumento. kwargs es un diccionario opcional de argumentos de palabras clave.
Ejemplo
#!/usr/bin/python3
import _thread
import time
# Define a function for the thread
def print_time( threadName, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print ("%s: %s" % ( threadName, time.ctime(time.time()) ))
# Create two threads as follows
try:
_thread.start_new_thread( print_time, ("Thread-1", 2, ) )
_thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
print ("Error: unable to start thread")
while 1:
pass
Salida
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Thread-1: Fri Feb 19 09:41:39 2016
Thread-2: Fri Feb 19 09:41:41 2016
Thread-1: Fri Feb 19 09:41:41 2016
Thread-1: Fri Feb 19 09:41:43 2016
Thread-2: Fri Feb 19 09:41:45 2016
Thread-1: Fri Feb 19 09:41:45 2016
Thread-1: Fri Feb 19 09:41:47 2016
Thread-2: Fri Feb 19 09:41:49 2016
Thread-2: Fri Feb 19 09:41:53 2016
El programa va en un bucle infinito. Tendrás que presionar ctrl-c para detener
Aunque es muy eficaz para el subprocesamiento de bajo nivel, el módulo de subprocesos es muy limitado en comparación con el módulo de subprocesamiento más nuevo.
El módulo de subprocesamiento
El módulo de subprocesos más nuevo incluido con Python 2.4 proporciona un soporte de alto nivel mucho más poderoso para subprocesos que el módulo de subprocesos discutido en la sección anterior.
El módulo de subprocesos expone todos los métodos del módulo de subprocesos y proporciona algunos métodos adicionales:
threading.activeCount() - Devuelve el número de objetos de hilo que están activos.
threading.currentThread() - Devuelve el número de objetos de hilo en el control de hilo de la persona que llama.
threading.enumerate() - Devuelve una lista de todos los objetos de hilo que están actualmente activos.
Además de los métodos, el módulo de subprocesos tiene la clase Thread que implementa subprocesos. Los métodos proporcionados por la clase Thread son los siguientes:
run() - El método run () es el punto de entrada para un hilo.
start() - El método start () inicia un hilo llamando al método run.
join([time]) - El join () espera a que terminen los hilos.
isAlive() - El método isAlive () comprueba si un hilo aún se está ejecutando.
getName() - El método getName () devuelve el nombre de un hilo.
setName() - El método setName () establece el nombre de un hilo.
Creación de subprocesos mediante el módulo de subprocesos
Para implementar un nuevo hilo usando el módulo de subprocesos, debe hacer lo siguiente:
Defina una nueva subclase de la clase Thread .
Anule el método __init __ (self [, args]) para agregar argumentos adicionales.
Luego, anule el método run (self [, args]) para implementar lo que debería hacer el hilo cuando se inicia.
Una vez que haya creado la nueva subclase Thread , puede crear una instancia de la misma y luego iniciar un nuevo hilo invocando start () , que a su vez llama al método run () .
Ejemplo
#!/usr/bin/python3
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print ("Starting " + self.name)
print_time(self.name, self.counter, 5)
print ("Exiting " + self.name)
def print_time(threadName, delay, counter):
while counter:
if exitFlag:
threadName.exit()
time.sleep(delay)
print ("%s: %s" % (threadName, time.ctime(time.time())))
counter -= 1
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print ("Exiting Main Thread")
Resultado
Cuando ejecutamos el programa anterior, produce el siguiente resultado:
Starting Thread-1
Starting Thread-2
Thread-1: Fri Feb 19 10:00:21 2016
Thread-2: Fri Feb 19 10:00:22 2016
Thread-1: Fri Feb 19 10:00:22 2016
Thread-1: Fri Feb 19 10:00:23 2016
Thread-2: Fri Feb 19 10:00:24 2016
Thread-1: Fri Feb 19 10:00:24 2016
Thread-1: Fri Feb 19 10:00:25 2016
Exiting Thread-1
Thread-2: Fri Feb 19 10:00:26 2016
Thread-2: Fri Feb 19 10:00:28 2016
Thread-2: Fri Feb 19 10:00:30 2016
Exiting Thread-2
Exiting Main Thread
Sincronizar hilos
El módulo de subprocesos proporcionado con Python incluye un mecanismo de bloqueo fácil de implementar que le permite sincronizar subprocesos. Se crea un nuevo bloqueo llamando al método Lock () , que devuelve el nuevo bloqueo.
El método de adquisición (bloqueo) del nuevo objeto de bloqueo se utiliza para forzar que los subprocesos se ejecuten sincrónicamente. El parámetro de bloqueo opcional le permite controlar si el hilo espera para adquirir el bloqueo.
Si el bloqueo se establece en 0, el hilo regresa inmediatamente con un valor de 0 si el bloqueo no se puede adquirir y con un 1 si se adquirió el bloqueo. Si el bloqueo se establece en 1, el hilo se bloquea y espera a que se libere el bloqueo.
El método release () del nuevo objeto de bloqueo se utiliza para liberar el bloqueo cuando ya no es necesario.
Ejemplo
#!/usr/bin/python3
import threading
import time
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print ("Starting " + self.name)
# Get lock to synchronize threads
threadLock.acquire()
print_time(self.name, self.counter, 3)
# Free lock to release next thread
threadLock.release()
def print_time(threadName, delay, counter):
while counter:
time.sleep(delay)
print ("%s: %s" % (threadName, time.ctime(time.time())))
counter -= 1
threadLock = threading.Lock()
threads = []
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
# Add threads to thread list
threads.append(thread1)
threads.append(thread2)
# Wait for all threads to complete
for t in threads:
t.join()
print ("Exiting Main Thread")
Salida
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Starting Thread-1
Starting Thread-2
Thread-1: Fri Feb 19 10:04:14 2016
Thread-1: Fri Feb 19 10:04:15 2016
Thread-1: Fri Feb 19 10:04:16 2016
Thread-2: Fri Feb 19 10:04:18 2016
Thread-2: Fri Feb 19 10:04:20 2016
Thread-2: Fri Feb 19 10:04:22 2016
Exiting Main Thread
Cola de prioridad multiproceso
El módulo de cola le permite crear un nuevo objeto de cola que puede contener un número específico de elementos. Existen los siguientes métodos para controlar la cola:
get() - El get () elimina y devuelve un elemento de la cola.
put() - El puesto agrega el artículo a una cola.
qsize() - El qsize () devuelve el número de elementos que están actualmente en la cola.
empty()- El vacío () devuelve Verdadero si la cola está vacía; de lo contrario, Falso.
full()- full () devuelve True si la cola está llena; de lo contrario, Falso.
Ejemplo
#!/usr/bin/python3
import queue
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, threadID, name, q):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.q = q
def run(self):
print ("Starting " + self.name)
process_data(self.name, self.q)
print ("Exiting " + self.name)
def process_data(threadName, q):
while not exitFlag:
queueLock.acquire()
if not workQueue.empty():
data = q.get()
queueLock.release()
print ("%s processing %s" % (threadName, data))
else:
queueLock.release()
time.sleep(1)
threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = queue.Queue(10)
threads = []
threadID = 1
# Create new threads
for tName in threadList:
thread = myThread(threadID, tName, workQueue)
thread.start()
threads.append(thread)
threadID += 1
# Fill the queue
queueLock.acquire()
for word in nameList:
workQueue.put(word)
queueLock.release()
# Wait for queue to empty
while not workQueue.empty():
pass
# Notify threads it's time to exit
exitFlag = 1
# Wait for all threads to complete
for t in threads:
t.join()
print ("Exiting Main Thread")
Salida
Cuando se ejecuta el código anterior, produce el siguiente resultado:
Starting Thread-1
Starting Thread-2
Starting Thread-3
Thread-1 processing One
Thread-2 processing Two
Thread-3 processing Three
Thread-1 processing Four
Thread-2 processing Five
Exiting Thread-3
Exiting Thread-1
Exiting Thread-2
Exiting Main Thread
XML es un lenguaje portátil de código abierto que permite a los programadores desarrollar aplicaciones que pueden ser leídas por otras aplicaciones, independientemente del sistema operativo y / o lenguaje de desarrollo.
¿Qué es XML?
El Lenguaje de marcado extensible (XML) es un lenguaje de marcado muy parecido a HTML o SGML. Esto es recomendado por el World Wide Web Consortium y está disponible como estándar abierto.
XML es extremadamente útil para realizar un seguimiento de pequeñas y medianas cantidades de datos sin necesidad de una red troncal basada en SQL.
Arquitecturas y API del analizador XML
La biblioteca estándar de Python proporciona un conjunto mínimo pero útil de interfaces para trabajar con XML.
Las dos API más básicas y más utilizadas para datos XML son las interfaces SAX y DOM.
Simple API for XML (SAX)- Aquí, registra devoluciones de llamada para eventos de interés y luego deja que el analizador continúe con el documento. Esto es útil cuando sus documentos son grandes o tiene limitaciones de memoria, analiza el archivo a medida que lo lee desde el disco y el archivo completo nunca se almacena en la memoria.
Document Object Model (DOM) API - Esta es una recomendación del World Wide Web Consortium en la que todo el archivo se lee en la memoria y se almacena en forma jerárquica (basada en árboles) para representar todas las características de un documento XML.
SAX obviamente no puede procesar información tan rápido como DOM, cuando trabaja con archivos grandes. Por otro lado, el uso exclusivo de DOM realmente puede matar sus recursos, especialmente si se usa en muchos archivos pequeños.
SAX es de solo lectura, mientras que DOM permite cambios en el archivo XML. Dado que estas dos API diferentes se complementan literalmente entre sí, no hay ninguna razón por la que no pueda usarlas para proyectos grandes.
Para todos nuestros ejemplos de código XML, usemos un archivo XML simple movies.xml como entrada:
<collection shelf = "New Arrivals">
<movie title = "Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title = "Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title = "Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title = "Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>
Analizar XML con API SAX
SAX es una interfaz estándar para el análisis de XML controlado por eventos. Analizar XML con SAX generalmente requiere que cree su propio ContentHandler subclasificando xml.sax.ContentHandler.
Su ContentHandler maneja las etiquetas y atributos particulares de su (s) sabor (s) de XML. Un objeto ContentHandler proporciona métodos para manejar varios eventos de análisis. Su analizador propietario llama a los métodos ContentHandler mientras analiza el archivo XML.
Los métodos startDocument y endDocument se llaman al principio y al final del archivo XML. Los caracteres del método (texto) pasan los datos de caracteres del archivo XML a través del texto del parámetro.
El ContentHandler se llama al principio y al final de cada elemento. Si el analizador no está en modo de espacio de nombres, se llaman a los métodos startElement (etiqueta, atributos) y endElement (etiqueta) ; de lo contrario, se llaman a los métodos correspondientes startElementNS y endElementNS . Aquí, etiqueta es la etiqueta del elemento y atributos es un objeto de atributos.
Aquí hay otros métodos importantes que debe comprender antes de continuar:
El método make_parser
El siguiente método crea un nuevo objeto analizador y lo devuelve. El objeto de analizador creado será del primer tipo de analizador, según el sistema.
xml.sax.make_parser( [parser_list] )
Aquí están los detalles de los parámetros:
parser_list - El argumento opcional que consiste en una lista de analizadores a utilizar que deben implementar el método make_parser.
El método de análisis
El siguiente método crea un analizador SAX y lo usa para analizar un documento.
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
Aquí están los detalles de los parámetros:
xmlfile - Este es el nombre del archivo XML para leer.
contenthandler - Debe ser un objeto ContentHandler.
errorhandler - Si se especifica, errorhandler debe ser un objeto SAX ErrorHandler.
El método parseString
Hay un método más para crear un analizador SAX y para analizar el especificado XML string.
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
Aquí están los detalles de los parámetros:
xmlstring - Este es el nombre de la cadena XML para leer.
contenthandler - Debe ser un objeto ContentHandler.
errorhandler - Si se especifica, errorhandler debe ser un objeto SAX ErrorHandler.
Ejemplo
#!/usr/bin/python3
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
self.description = ""
# Call when an element starts
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print ("*****Movie*****")
title = attributes["title"]
print ("Title:", title)
# Call when an elements ends
def endElement(self, tag):
if self.CurrentData == "type":
print ("Type:", self.type)
elif self.CurrentData == "format":
print ("Format:", self.format)
elif self.CurrentData == "year":
print ("Year:", self.year)
elif self.CurrentData == "rating":
print ("Rating:", self.rating)
elif self.CurrentData == "stars":
print ("Stars:", self.stars)
elif self.CurrentData == "description":
print ("Description:", self.description)
self.CurrentData = ""
# Call when a character is read
def characters(self, content):
if self.CurrentData == "type":
self.type = content
elif self.CurrentData == "format":
self.format = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "stars":
self.stars = content
elif self.CurrentData == "description":
self.description = content
if ( __name__ == "__main__"):
# create an XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# override the default ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("movies.xml")
Salida
Esto produciría el siguiente resultado:
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A scientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom
Para obtener detalles completos sobre la documentación de la API SAX, consulte las API estándar de Python SAX .
Analizar XML con DOM API
El Document Object Model ("DOM") es una API en varios idiomas del World Wide Web Consortium (W3C) para acceder y modificar los documentos XML.
El DOM es extremadamente útil para aplicaciones de acceso aleatorio. SAX solo le permite ver un fragmento del documento a la vez. Si está mirando un elemento SAX, no tiene acceso a otro.
Esta es la forma más fácil de cargar un documento XML rápidamente y crear un objeto minidom usando el módulo xml.dom. El objeto minidom proporciona un método analizador simple que crea rápidamente un árbol DOM a partir del archivo XML.
La frase de muestra llama a la función parse (file [, parser]) del objeto minidom para analizar el archivo XML, designado por file en un objeto de árbol DOM.
Ejemplo
#!/usr/bin/python3
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print ("Root element : %s" % collection.getAttribute("shelf"))
# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")
# Print detail of each movie.
for movie in movies:
print ("*****Movie*****")
if movie.hasAttribute("title"):
print ("Title: %s" % movie.getAttribute("title"))
type = movie.getElementsByTagName('type')[0]
print ("Type: %s" % type.childNodes[0].data)
format = movie.getElementsByTagName('format')[0]
print ("Format: %s" % format.childNodes[0].data)
rating = movie.getElementsByTagName('rating')[0]
print ("Rating: %s" % rating.childNodes[0].data)
description = movie.getElementsByTagName('description')[0]
print ("Description: %s" % description.childNodes[0].data)
Salida
Esto produciría el siguiente resultado:
Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A scientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom
Para obtener detalles completos sobre la documentación de la API DOM, consulte las API DOM estándar de Python .
Python proporciona varias opciones para desarrollar interfaces gráficas de usuario (GUI). Las características más importantes se enumeran a continuación.
Tkinter- Tkinter es la interfaz de Python para el kit de herramientas de la GUI de Tk que se envía con Python. Buscaríamos esta opción en este capítulo.
wxPython- Esta es una interfaz Python de código abierto para el kit de herramientas GUI wxWidgets. Puede encontrar un tutorial completo sobre WxPython aquí .
PyQt−Esta es también una interfaz Python para una popular biblioteca Qt GUI multiplataforma. TutorialsPoint tiene un muy buen tutorial sobre PyQt aquí .
JPython - JPython es un puerto de Python para Java que brinda a los scripts de Python un acceso perfecto a las bibliotecas de clases de Java en la máquina local. http://www.jython.org.
Hay muchas otras interfaces disponibles, que puede encontrarlas en la red.
Programación Tkinter
Tkinter es la biblioteca GUI estándar para Python. Python cuando se combina con Tkinter proporciona una forma rápida y fácil de crear aplicaciones GUI. Tkinter proporciona una poderosa interfaz orientada a objetos para el kit de herramientas Tk GUI.
Crear una aplicación GUI usando Tkinter es una tarea fácil. Todo lo que necesita hacer es realizar los siguientes pasos:
Importe el módulo Tkinter .
Cree la ventana principal de la aplicación GUI.
Agregue uno o más de los widgets mencionados anteriormente a la aplicación GUI.
Ingrese al bucle de eventos principal para tomar medidas contra cada evento desencadenado por el usuario.
Ejemplo
#!/usr/bin/python3
import tkinter # note that module name has changed from Tkinter in Python 2 to tkinter in Python 3
top = tkinter.Tk()
# Code to add widgets will go here...
top.mainloop()
Esto crearía una ventana siguiente:
Widgets de Tkinter
Tkinter proporciona varios controles, como botones, etiquetas y cuadros de texto utilizados en una aplicación GUI. Estos controles se denominan comúnmente widgets.
Actualmente hay 15 tipos de widgets en Tkinter. Presentamos estos widgets, así como una breve descripción en la siguiente tabla:
No Señor. | Operador y descripción |
---|---|
1 | Botón El widget Botón se utiliza para mostrar botones en su aplicación. |
2 | Lona El widget Canvas se utiliza para dibujar formas, como líneas, óvalos, polígonos y rectángulos, en su aplicación. |
3 | Botón de verificación El widget de botón de verificación se utiliza para mostrar una serie de opciones como casillas de verificación. El usuario puede seleccionar varias opciones a la vez. |
4 | Entrada El widget de entrada se utiliza para mostrar un campo de texto de una sola línea para aceptar valores de un usuario. |
5 | Marco El widget Frame se utiliza como widget contenedor para organizar otros widgets. |
6 | Etiqueta El widget Etiqueta se utiliza para proporcionar un título de una sola línea para otros widgets. También puede contener imágenes. |
7 | Cuadro de lista El widget Listbox se utiliza para proporcionar una lista de opciones a un usuario. |
8 | Botón de menú El widget Menubutton se utiliza para mostrar menús en su aplicación. |
9 | Menú El widget de menú se utiliza para proporcionar varios comandos a un usuario. Estos comandos están contenidos dentro de Menubutton. |
10 | Mensaje El widget de mensajes se utiliza para mostrar campos de texto de varias líneas para aceptar valores de un usuario. |
11 | Boton de radio El widget Radiobutton se utiliza para mostrar una serie de opciones como botones de opción. El usuario puede seleccionar solo una opción a la vez. |
12 | Escala El widget Escala se utiliza para proporcionar un control deslizante. |
13 | Barra de desplazamiento El widget de barra de desplazamiento se utiliza para agregar capacidad de desplazamiento a varios widgets, como cuadros de lista. |
14 | Texto El widget de texto se utiliza para mostrar texto en varias líneas. |
15 | Nivel superior El widget de nivel superior se utiliza para proporcionar un contenedor de ventana independiente. |
dieciséis | Spinbox El widget Spinbox es una variante del widget Tkinter Entry estándar, que se puede utilizar para seleccionar entre un número fijo de valores. |
17 | PanedWindow Un PanedWindow es un widget contenedor que puede contener cualquier número de paneles, dispuestos horizontal o verticalmente. |
18 | LabelFrame Un labelframe es un widget contenedor simple. Su propósito principal es actuar como espaciador o contenedor para diseños de ventanas complejos. |
19 | tkMessageBox Este módulo se utiliza para mostrar cuadros de mensajes en sus aplicaciones. |
Atributos estándar
Veamos cómo se especifican algunos de sus atributos comunes, como tamaños, colores y fuentes.
Dimensions
Colors
Fonts
Anchors
Estilos de relieve
Bitmaps
Cursors
Gestión de geometría
Todos los widgets de Tkinter tienen acceso a los métodos de gestión de geometría específicos, que tienen el propósito de organizar los widgets en todo el área principal de widgets. Tkinter expone las siguientes clases de administradores de geometría: paquete, cuadrícula y lugar.
El método pack () : este administrador de geometría organiza los widgets en bloques antes de colocarlos en el widget principal.
El método grid () : este administrador de geometría organiza los widgets en una estructura similar a una tabla en el widget principal.
El método place () : este administrador de geometría organiza los widgets colocándolos en una posición específica en el widget principal.
Cualquier código que escriba con cualquier lenguaje compilado como C, C ++ o Java puede integrarse o importarse en otro script de Python. Este código se considera una "extensión".
Un módulo de extensión de Python no es más que una biblioteca C normal. En máquinas Unix, estas bibliotecas suelen terminar en.so(para objeto compartido). En las máquinas con Windows, normalmente verá.dll (para biblioteca vinculada dinámicamente).
Requisitos previos para las extensiones de escritura
Para comenzar a escribir su extensión, necesitará los archivos de encabezado de Python.
En máquinas Unix, esto generalmente requiere la instalación de un paquete específico del desarrollador, como.
Los usuarios de Windows obtienen estos encabezados como parte del paquete cuando usan el instalador binario de Python.
Además, se asume que tiene un buen conocimiento de C o C ++ para escribir cualquier Extensión de Python usando programación en C.
Primer vistazo a una extensión de Python
Para su primer vistazo a un módulo de extensión de Python, necesita agrupar su código en cuatro partes:
El archivo de encabezado Python.h .
Las funciones C que desea exponer como la interfaz de su módulo.
Una tabla que mapea los nombres de sus funciones, ya que los desarrolladores de Python las ven como funciones C dentro del módulo de extensión.
Una función de inicialización.
El archivo de encabezado Python.h
Debe incluir el archivo de encabezado Python.h en su archivo fuente C, lo que le brinda acceso a la API interna de Python utilizada para conectar su módulo al intérprete.
Asegúrese de incluir Python.h antes de cualquier otro encabezado que pueda necesitar. Debe seguir las inclusiones con las funciones que desea llamar desde Python.
Las funciones C
Las firmas de la implementación C de sus funciones siempre toman una de las siguientes tres formas:
static PyObject *MyFunction( PyObject *self, PyObject *args );
static PyObject *MyFunctionWithKeywords(PyObject *self,
PyObject *args,
PyObject *kw);
static PyObject *MyFunctionWithNoArgs( PyObject *self );
Cada una de las declaraciones anteriores devuelve un objeto Python. No existe una función void en Python como en C. Si no desea que sus funciones devuelvan un valor, devuelva el equivalente en C de PythonNonevalor. Los encabezados de Python definen una macro, Py_RETURN_NONE, que hace esto por nosotros.
Los nombres de sus funciones C pueden ser los que desee, ya que nunca se ven fuera del módulo de extensión. Se definen como función estática .
Sus funciones C generalmente se nombran combinando el módulo Python y los nombres de las funciones, como se muestra aquí:
static PyObject *module_func(PyObject *self, PyObject *args) {
/* Do your stuff here. */
Py_RETURN_NONE;
}
Esta es una función de Python llamada func dentro del módulo del módulo . Pondrá punteros a sus funciones C en la tabla de métodos para el módulo que generalmente viene a continuación en su código fuente.
La tabla de asignación de métodos
Esta tabla de métodos es una matriz simple de estructuras PyMethodDef. Esa estructura se parece a esto:
struct PyMethodDef {
char *ml_name;
PyCFunction ml_meth;
int ml_flags;
char *ml_doc;
};
Aquí está la descripción de los miembros de esta estructura:
ml_name - Este es el nombre de la función que presenta el intérprete de Python cuando se usa en programas de Python.
ml_meth - Esta es la dirección de una función que tiene alguna de las firmas descritas en la sección anterior.
ml_flags - Esto le dice al intérprete cuál de las tres firmas está usando ml_meth.
Esta bandera generalmente tiene un valor de METH_VARARGS.
Esta bandera puede ser OR 'bit a bit con METH_KEYWORDS si desea permitir argumentos de palabras clave en su función.
Esto también puede tener un valor de METH_NOARGS que indica que no desea aceptar ningún argumento.
ml_doc - Esta es la cadena de documentación de la función, que podría ser NULL si no tiene ganas de escribir una.
Esta tabla debe terminarse con un centinela que consta de valores NULL y 0 para los miembros correspondientes.
Ejemplo
Para la función definida anteriormente, tenemos la siguiente tabla de mapeo de métodos:
static PyMethodDef module_methods[] = {
{ "func", (PyCFunction)module_func, METH_NOARGS, NULL },
{ NULL, NULL, 0, NULL }
};
La función de inicialización
La última parte de su módulo de extensión es la función de inicialización. Esta función es llamada por el intérprete de Python cuando se carga el módulo. Se requiere que la función se llameinitModule, donde Módulo es el nombre del módulo.
La función de inicialización debe exportarse desde la biblioteca que creará. Los encabezados de Python definen PyMODINIT_FUNC para incluir los encantamientos apropiados para que eso suceda para el entorno particular en el que estamos compilando. Todo lo que tiene que hacer es usarlo al definir la función.
Su función de inicialización de C generalmente tiene la siguiente estructura general:
PyMODINIT_FUNC initModule() {
Py_InitModule3(func, module_methods, "docstring...");
}
Aquí está la descripción de Py_InitModule3 función -
func - Ésta es la función que se exportará.
module_methods - Este es el nombre de la tabla de mapeo definido anteriormente.
docstring - Este es el comentario que quieres dar en tu extensión.
Poniendo todo esto junto, parece lo siguiente:
#include <Python.h>
static PyObject *module_func(PyObject *self, PyObject *args) {
/* Do your stuff here. */
Py_RETURN_NONE;
}
static PyMethodDef module_methods[] = {
{ "func", (PyCFunction)module_func, METH_NOARGS, NULL },
{ NULL, NULL, 0, NULL }
};
PyMODINIT_FUNC initModule() {
Py_InitModule3(func, module_methods, "docstring...");
}
Ejemplo
Un ejemplo simple que hace uso de todos los conceptos anteriores:
#include <Python.h>
static PyObject* helloworld(PyObject* self)
{
return Py_BuildValue("s", "Hello, Python extensions!!");
}
static char helloworld_docs[] =
"helloworld( ): Any message you want to put here!!\n";
static PyMethodDef helloworld_funcs[] = {
{"helloworld", (PyCFunction)helloworld,
METH_NOARGS, helloworld_docs},
{NULL}
};
void inithelloworld(void)
{
Py_InitModule3("helloworld", helloworld_funcs,
"Extension module example!");
}
Aquí, la función Py_BuildValue se usa para construir un valor de Python. Guarde el código anterior en el archivo hello.c. Veríamos cómo compilar e instalar este módulo para ser llamado desde el script de Python.
Creación e instalación de extensiones
El paquete distutils hace que sea muy fácil distribuir módulos de Python, tanto Python puro como módulos de extensión, de forma estándar. Los módulos se distribuyen en el formato de origen, se compilan e instalan mediante un script de configuración normalmente llamado setup.py como.
Para el módulo anterior, debe preparar el siguiente script setup.py:
from distutils.core import setup, Extension
setup(name = 'helloworld', version = '1.0', \
ext_modules = [Extension('helloworld', ['hello.c'])])
Ahora, use el siguiente comando, que realizaría todos los pasos necesarios de compilación y vinculación, con los comandos e indicadores correctos del compilador y del vinculador, y copie la biblioteca dinámica resultante en un directorio apropiado:
$ python setup.py install
En los sistemas basados en Unix, probablemente necesitará ejecutar este comando como root para tener permisos para escribir en el directorio site-packages. Por lo general, esto no es un problema en Windows.
Importación de extensiones
Una vez que instale sus extensiones, podrá importar y llamar a esa extensión en su secuencia de comandos de Python de la siguiente manera:
Ejemplo
#!/usr/bin/python3
import helloworld
print helloworld.helloworld()
Salida
Esto produciría el siguiente resultado:
Hello, Python extensions!!
Pasar parámetros de función
Como probablemente querrá definir funciones que acepten argumentos, puede usar una de las otras firmas para sus funciones C. Por ejemplo, la siguiente función, que acepta cierto número de parámetros, se definiría así:
static PyObject *module_func(PyObject *self, PyObject *args) {
/* Parse args and do something interesting here. */
Py_RETURN_NONE;
}
La tabla de métodos que contiene una entrada para la nueva función se vería así:
static PyMethodDef module_methods[] = {
{ "func", (PyCFunction)module_func, METH_NOARGS, NULL },
{ "func", module_func, METH_VARARGS, NULL },
{ NULL, NULL, 0, NULL }
};
Puede usar la función API PyArg_ParseTuple para extraer los argumentos del puntero PyObject pasado a su función C.
El primer argumento de PyArg_ParseTuple es el argumento args. Este es el objeto que analizará . El segundo argumento es una cadena de formato que describe los argumentos tal como espera que aparezcan. Cada argumento está representado por uno o más caracteres en la cadena de formato de la siguiente manera.
static PyObject *module_func(PyObject *self, PyObject *args) {
int i;
double d;
char *s;
if (!PyArg_ParseTuple(args, "ids", &i, &d, &s)) {
return NULL;
}
/* Do something interesting here. */
Py_RETURN_NONE;
}
Salida
Compilar la nueva versión de su módulo e importarla le permite invocar la nueva función con cualquier número de argumentos de cualquier tipo:
module.func(1, s = "three", d = 2.0)
module.func(i = 1, d = 2.0, s = "three")
module.func(s = "three", d = 2.0, i = 1)
Probablemente puedas encontrar aún más variaciones.
La función PyArg_ParseTuple
Aquí está la firma estándar para el PyArg_ParseTuple función -
int PyArg_ParseTuple(PyObject* tuple,char* format,...)
Esta función devuelve 0 para errores y un valor no igual a 0 para éxito. Tuple es el PyObject * que fue el segundo argumento de la función C. Aquí el formato es una cadena C que describe argumentos obligatorios y opcionales.
Aquí hay una lista de códigos de formato para PyArg_ParseTuple función -
Código | Tipo C | Sentido |
---|---|---|
C | carbonizarse | Una cadena de Python de longitud 1 se convierte en un carácter C. |
re | doble | Un flotador de Python se convierte en un doble de C. |
F | flotador | Un flotador Python se convierte en un flotador C. |
yo | En t | Un int de Python se convierte en un int de C. |
l | largo | Un int de Python se convierte en una C larga. |
L | largo largo | Un int de Python se convierte en una C long long |
O | PyObject * | Obtiene una referencia prestada no NULL al argumento de Python. |
s | carbonizarse* | Cadena de Python sin nulos incrustados en C char *. |
s # | char * + int | Cualquier cadena de Python a la dirección y longitud de C. |
t # | char * + int | Búfer de un solo segmento de solo lectura a la dirección C y la longitud. |
tu | Py_UNICODE * | Python Unicode sin nulos incrustados en C. |
tu # | Py_UNICODE * + int | Cualquier dirección y longitud de Python Unicode C. |
w # | char * + int | Búfer de lectura / escritura de un solo segmento en dirección C y longitud. |
z | carbonizarse* | Como s, también acepta None (establece C char * en NULL). |
z # | char * + int | Como s #, también acepta None (establece C char * en NULL). |
(...) | según ... | Una secuencia de Python se trata como un argumento por elemento. |
| | Los siguientes argumentos son opcionales. | |
: | Fin de formato, seguido del nombre de la función para los mensajes de error. | |
; | Fin de formato, seguido del texto completo del mensaje de error. |
Devolución de valores
Py_BuildValue toma una cadena de formato muy similar a PyArg_ParseTuple . En lugar de pasar las direcciones de los valores que está construyendo, pasa los valores reales. Aquí hay un ejemplo que muestra cómo implementar una función de adición:
static PyObject *foo_add(PyObject *self, PyObject *args) {
int a;
int b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
return Py_BuildValue("i", a + b);
}
Así es como se vería si se implementara en Python:
def add(a, b):
return (a + b)
Puede devolver dos valores de su función de la siguiente manera. Esto se capturaría usando una lista en Python.
static PyObject *foo_add_subtract(PyObject *self, PyObject *args) {
int a;
int b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
return Py_BuildValue("ii", a + b, a - b);
}
Así es como se vería si se implementara en Python:
def add_subtract(a, b):
return (a + b, a - b)
La función Py_BuildValue
Aquí está la firma estándar para Py_BuildValue función -
PyObject* Py_BuildValue(char* format,...)
Aquí el formato es una cadena C que describe el objeto Python que se va a construir. Los siguientes argumentos de Py_BuildValue son valores de C a partir de los cuales se construye el resultado. El resultado de PyObject * es una nueva referencia.
La siguiente tabla enumera las cadenas de código de uso común, de las cuales cero o más se unen en un formato de cadena.
Código | Tipo C | Sentido |
---|---|---|
C | carbonizarse | AC char se convierte en una cadena de Python de longitud 1. |
re | doble | AC double se convierte en un flotador de Python. |
F | flotador | El flotador de CA se convierte en un flotador de Python. |
yo | En t | AC int se convierte en Python int. |
l | largo | AC long se convierte en un Python int. |
norte | PyObject * | Pasa un objeto Python y roba una referencia. |
O | PyObject * | Pasa un objeto de Python y lo INCREF como de costumbre. |
O & | convertir + anular * | Conversión arbitraria |
s | carbonizarse* | C 0-terminado char * a una cadena de Python, o NULL a None. |
s # | char * + int | C char * y la longitud de la cadena de Python, o NULL a None. |
tu | Py_UNICODE * | Cadena de ancho C, terminada en nulo a Python Unicode, o NULL a Ninguno. |
tu # | Py_UNICODE * + int | Cadena de ancho C y longitud a Python Unicode, o NULL a Ninguno. |
w # | char * + int | Búfer de lectura / escritura de un solo segmento en dirección C y longitud. |
z | carbonizarse* | Como s, también acepta None (establece C char * en NULL). |
z # | char * + int | Como s #, también acepta None (establece C char * en NULL). |
(...) | según ... | Crea una tupla de Python a partir de valores C. |
[...] | según ... | Crea una lista de Python a partir de valores C. |
{...} | según ... | Crea un diccionario Python a partir de valores C, alternando claves y valores. |
Code {...} crea diccionarios a partir de un número par de valores C, alternativamente claves y valores. Por ejemplo, Py_BuildValue ("{issi}", 23, "zig", "zag", 42) devuelve un diccionario como {23: 'zig', 'zag': 42} de Python.