Pitón

Lenguaje de programación pitón
Autorguido van rossum
Fecha de origen20 de febrero de 1991
Ultima versión3.10.7 (7 de septiembre de 2022) y 3.11.0rc2 (12 de septiembre de 2022)
Usogenérico, secuencias de comandos
ParadigmasProgramación orientada a objetos
Mecanografíadinámica
Extensiones comunes.py, .pyw, .pyc, .pyo, .pyd
Influenciado porABC , ALGOL 68 , C , C ++ , Dylan , Haskell , Icono , Java , Lisp , Modula-3 , Perl
InfluyóBoo , Cobra , D , F # , Falcon , Go , Groovy , JavaScript , Julia , Ruby , Swift , Perl 6
Implementación de referencia
Sistema operativoMultiplataforma
LicenciaLicencia de la Fundación de Software de Python
Sitio webwww.python.org/

Python es un lenguaje de programación orientado a objetos de "alto nivel" adecuado, entre otros usos, para el desarrollo de aplicaciones distribuidas , secuencias de comandos , computación numérica y pruebas de sistemas .

Diseñado por Guido van Rossum a principios de los noventa , a menudo se lo compara con Ruby , Tcl , Perl , JavaScript , Visual Basic o Scheme [1] . El nombre fue elegido por la pasión del inventor por Monty Python y por su serie de televisión Monty Python's Flying Circus [2] .

También se suele estudiar entre los primeros lenguajes por su similitud con un pseudocódigo y se utiliza con frecuencia para simular la creación de software gracias a la flexibilidad de experimentación que permite Python, que permite al programador organizar las ideas durante el desarrollo, como por ejemplo, crear un juego a través de Pygame o el back-end de un sitio web a través de Flask o Django .

Python también tiene una sección de gráficos, el módulo Python Turtle Graphics , que le permite aplicar líneas de código a los gráficos.

Descripción

Es un lenguaje multiparadigma que tiene entre sus principales objetivos: dinamismo, sencillez y flexibilidad. Es compatible con el paradigma orientado a objetos , la programación estructurada y muchas funciones de programación funcional y de reflexión .

Las características más inmediatamente reconocibles de Python son las variables sin tipo y el uso de sangría para especificar la sintaxis, en lugar de los paréntesis más comunes.

Otras características distintivas son la sobrecarga de operadores y funciones a través de delegados , la presencia de una rica variedad de tipos y funciones básicos y bibliotecas estándar, sintaxis avanzadas como división y comprensión de listas .

La comprobación de tipos es fuerte ( strong typing ) y se realiza en tiempo de ejecución ( dynamic typing ): una variable es un contenedor al que se asocia una etiqueta (el nombre) que puede asociarse con diferentes contenedores incluso de diferentes tipos durante su vida útil. Un sistema de recolección de elementos no utilizados para la liberación y recuperación automática de la memoria de trabajo es parte de Python .

Python guarda cierto parecido con Perl , pero sus diseñadores han optado por una sintaxis más básica y uniforme con el objetivo de mejorar la legibilidad del código. Al igual que Perl, a menudo se clasifica como un lenguaje de secuencias de comandos , pero si bien es útil para escribir secuencias de comandos del sistema , como alternativa, por ejemplo, a bash , la gran cantidad de bibliotecas disponibles y la facilidad con la que el lenguaje le permite escribir software modular también favorece el desarrollo de aplicaciones muy complejas.

Otras características

Aunque Python generalmente se considera un lenguaje interpretado , en realidad el código fuente no se convierte directamente en lenguaje de máquina . De hecho, primero pasa por una fase de precompilación en bytecode , que casi siempre se reutiliza tras la primera ejecución del programa, evitando así reinterpretar el código fuente cada vez y mejorando el rendimiento. Además, es posible distribuir programas de Python directamente en bytecode, saltándose por completo la fase de interpretación por parte del usuario final y obteniendo programas de Python de código cerrado [3] .

Al igual que el lenguaje Lisp y a diferencia de Perl, el intérprete de Python también admite un modo de usuario interactivo ( REPL ) a través del cual puede ingresar código directamente desde una terminal, mostrando el resultado de inmediato.

Además, el intérprete de Python está contenido en la biblioteca estándar, por lo que, como en muchos otros lenguajes interpretados, es posible evaluar cadenas arbitrarias en el contexto actual. También es posible pasar al intérprete un contexto completamente diferente, en forma de listas que contienen la lista de símbolos definidos.

Python también tiene un marco de pruebas unitarias que admite el desarrollo de pruebas unitarias automatizadas.

Rendimiento

En comparación con los lenguajes compilados de tipo estático , como C , la velocidad de ejecución no es uno de los puntos fuertes de Python [4] , especialmente en el cálculo matemático. Además, el programa se basa únicamente en un núcleo y los subprocesos múltiples están presentes solo en el nivel abstracto. Existía una extensión, Psyco [5] , cuyo desarrollo terminó en 2012, que era una especie de compilador JIT , capaz de acelerar significativamente algunos tipos de código, especialmente la implementación de algoritmos, a costa de aumentar la memoria utilizada. Un proyecto actual y activamente desarrollado para mejorar el rendimiento del código Python con un compilador JIT es PyPy [6] .

Python le permite superar fácilmente el obstáculo del rendimiento puro: de hecho, es relativamente simple escribir una extensión en C o C ++ y luego usarla dentro de Python, explotando así la alta velocidad de un lenguaje compilado solo en las partes en las que en realidad sirve y, en cambio, aprovecha el poder y la versatilidad de Python para todo el resto del software [7] .

Otras implementaciones

Las siguientes implementaciones de Python están disponibles actualmente:

Tipos de datos y estructuras

Como Python se escribe dinámicamente , todas las variables son en realidad punteros a objetos . Por ejemplo, si a una variable se le asigna un valor entero, se puede asignar una cadena o una lista inmediatamente después. Por otro lado, los objetos tienen un tipo.

Python espera una verificación de tipos moderada en tiempo de ejecución, es decir, en tiempo de ejecución . Los tipos numéricos tienen conversión implícita, por lo que es posible, por ejemplo, multiplicar un número complejo por un número entero. No hay conversión implícita entre números y cadenas alfanuméricas; por lo tanto, un número es un argumento inválido para operaciones con cadenas, a diferencia de lo que sucede, por ejemplo, en el lenguaje PHP.

Python tiene varias plantillas/bibliotecas para proporcionar funcionalidad sin tener que escribir código, como los gráficos de tortuga [14] (para dibujar), copy [15] (para crear copias de objetos ), random [16] (para generar objetos aleatorios ). números), sys [17] (para interactuar desde la línea de comandos con el intérprete) y time (para operar con unidades de fecha y hora).

Python proporciona una gran cantidad de tipos básicos , esencialmente numéricos y contenedores. La característica distintiva es el soporte nativo, además de tipos clásicos como enteros, coma flotante (números con punto flotante) y cadenas alfanuméricas, incluso tipos más avanzados como enteros de tamaño arbitrario, números complejos, listas , conjuntos y diccionarios . Sin embargo, no hay un tipo específico para los personajes.

Muchos otros tipos se pueden importar desde bibliotecas estándar y se pueden crear nuevos tipos a través de clases .

Gráficos de tortugas

El módulo tortuga, al igual que las otras bibliotecas, se puede importar con la función Importar apropiada, escribiendo en el código fuente:

importar tortuga from tortuga importar Tortuga , Pantalla

Los comandos escritos arriba ponen a disposición los objetos Turtle y Screen, cuyas funciones se pueden asignar a objetos reales de la siguiente manera:

from turtle import Turtle , Screen # esto importará una tortuga (pluma python) y su pantalla. Fondo = Pantalla () # para que asigne cada función y propiedad de Pantalla a Fondo. Bolígrafo = Tortuga () #este será el Bolígrafo. # Por supuesto, cualquier nombre de objeto puede asignarse a la tortuga y la pantalla y cambiarse en el transcurso del programa.

Todas las funciones del fondo y la pluma se pueden usar llamándolas como en el siguiente código:

pluma _ círculo ( 5 ) # por ejemplo, la función de círculo creará un círculo que tiene el valor entre paréntesis como un radio #la función setcolor (tanto referida a la tortuga como al fondo) determina su color Antecedentes _ setcolor ( "naranja" ) # usando el nombre del color deseado Antecedentes _ setcolor ( "FFFFFF" ) #o escribiendo el color en RGB hexadecimal

Tipos numéricos

Los tipos enteros ( int) y de punto flotante ( ) floattienen un tamaño que depende del hardware y la implementación del intérprete, normalmente de 32 y 64 bits . longLos números enteros arbitrariamente grandes ( que se convierten en la opción predeterminada para los números enteros a partir de Python 3.0) y los números complejos ( ) se esperan de forma nativa complex.

Python tiene todos los principales operadores lógicos y aritméticos entre números, incluida la exponenciación. El tipo booleano ( bool) también pertenece a la categoría de número.

Desde la versión 2.4 de Python, los números decimales () también están disponibles como biblioteca [18]decimal , es decir, números de punto flotante con precisión ilimitada, como los disponibles en REXX o Cobol , que no sufren los problemas de redondeo y estabilidad típicos de los flotantes . números puntos clásicos .

Contenedores

Python generalmente considera objetos contenedores que brindan la posibilidad de iterar sobre un conjunto de elementos, por lo tanto, utilizables dentro de contextos como el bucle fory funciones como suma, búsqueda y clasificación. Los contenedores generalmente le permiten almacenar datos heterogéneos.

En cuanto a los contenedores estándar propiamente dichos, se pueden clasificar en secuencias , conjuntos y diccionarios . Los contenedores siguen una filosofía común y comparten la mayoría de los métodos .

Las secuencias son contenedores ordenados que comparten métodos basados ​​en la clasificación, la indexación de enteros y la creación de subsecuencias a través de cortes .

Las listas ( ) son listsecuencias extensibles, mientras que las tuplas ( tuple) son secuencias inmutables. Las cadenas alfanuméricas ( y ) también se consideran secuencias . A partir de Python 3.0, los tipos y se unifican y aparece el tipo , aproximadamente equivalente a una cadena binaria. strunicodestrunicodebyte

Se proporcionan todas las operaciones de cadena clásicas, como concatenación, formateo, búsqueda, reemplazo, etc. Las cadenas en Python son secuencias inmutables, por lo que cualquier operación que de alguna manera pueda alterar una cadena, como sustituir un carácter, en realidad devuelve una nueva cadena, como lo hace en Java y C #.

Otros contenedores son los diccionarios ( dict), conocidos en otros contextos como tablas hash o matrices asociativas . Existe una sintaxis para crear diccionarios, cuyos elementos se especifican mediante un par de datos separados por dos puntos ':'. El primer elemento del par representa el índice, llamado "clave", y el segundo es su valor correspondiente. De hecho, cada elemento de un diccionario también se denomina "par clave-valor".

Por ejemplo, la siguiente sentencia crea un diccionario identificado como dizcompuesto por dos elementos cuyas claves son wikipediay wikiquote, respectivamente, y con valores enteros asociados 40y 60:

diz = { 'wikipedia' : 40 , 'wikiquote' : 60 }

Las claves de un diccionario son inmutables, mientras que el valor correspondiente a cada clave es modificable mediante una asignación. La siguiente instrucción cambia el valor correspondiente a "wikipedia", llevándolo a 4500:

diz [ 'wikipedia' ] = 4500

A partir de la versión 2.7 de Python [19] , también se admiten conjuntos ( sety ), es decir, conjuntos desordenados de objetos que se pueden modificar . frozenset

Organización orientada a objetos

El sistema de tipos de Python está bien integrado con el sistema de clases . Aunque los tipos base no son formalmente clases, como en C# por ejemplo , una clase aún puede heredar de ellos. De esta forma es posible extender cadenas, diccionarios e incluso enteros. También se admite la herencia múltiple [20] .

También se admiten amplias funciones de introspección de tipos y clases . Los tipos y las clases son en sí mismos objetos que se pueden explorar y comparar. Los atributos se gestionan en un diccionario.

Sintaxis

Python ha sido diseñado para ser fácil de leer y escribir. Visualmente se presenta de forma lineal y limpia, con pocas construcciones sintácticas en comparación con otros lenguajes estructurados como C , Perl o Pascal .

Por ejemplo, Python tiene solo dos formas de bucle: foritera sobre los elementos de una lista o un iterador (equivalente a foreachPerl o PHP) y whilese repite siempre que la expresión booleana especificada sea verdadera. forBásicamente, carece de bucles de estilo C do whiley until, pero todos estos se pueden expresar con equivalentes simples. Del mismo modo, solo tiene la construcción if elif elsepara elecciones condicionales, pero no tiene switchni goto.

Sangría

Un aspecto inusual de Python es el método que utiliza para delimitar bloques de programa, lo que lo hace único entre los lenguajes más populares.

En lenguajes derivados de ALGOL como Pascal, C y Perl, los bloques de código se indican con corchetes o con palabras clave; por ejemplo , C y Perl usan { }mientras que Pascal usa beginy end. En estos lenguajes, es solo una pura convención de los desarrolladores sangrar (es decir, "sangrar" desde el margen izquierdo de la página) el código fuente dentro de un bloque para mejorar su legibilidad y aclarar la estructura del flujo de ejecución.

En cambio, Python deriva su sistema de sangrado del lenguaje de programación Occam menos conocido : en lugar de usar paréntesis o palabras clave, usa el sangrado para indicar bloques anidados junto con el carácter "dos puntos" (:). En Python, puede usar tanto una tabulación como un número arbitrario de espacios, siempre que, por supuesto, se usen de una manera que sea congruente con la sintaxis del lenguaje. El siguiente ejemplo aclara esto al mostrar la versión C y Python de las funciones para calcular el factorial de un número entero.

Factoriales en C:

int factorial ( int x ) { si ( x == 0 ) devuelve 1 ; de lo contrario, devuelve x * factorial ( x -1 ); }

Factorial en Python:

def factorial ( x ): si x == 0 : devuelve 1 si no : devuelve x * factorial ( x - 1 )

Esta forma de indicar bloques y expresar la sintaxis puede en un principio confundir las ideas de los que vienen de otros lenguajes, pero luego resulta muy ventajosa, porque es concisa y obliga a escribir las fuentes correctamente sangradas, aumentando así la legibilidad del texto. código.

La desventaja es que la gestión de espacios y tabuladores puede ser diferente de un editor de texto a otro, lo que obliga a prestar mucha atención a la sangría del código o confiar en las funciones de sangría automática ahora presentes en la mayoría de los editores de programas. También puede suceder que trabaje con diferentes editores de código fuente, en varias computadoras, y así termine con un código fuente que usa tabulaciones y espacios de forma mixta, notando el error solo en tiempo de ejecución.

Python también permite algunos atajos para escribir código "múltiple" en la misma línea. Si los dos puntos (:) comienzan un bloque sangrado de una sola línea: podemos moverlo siguiendo un espacio más adelante.

si b > a : print ( "b es mayor que a" )

Aunque no es muy bueno para los puristas del lenguaje Python, todavía es posible usar el "punto y coma" (;) como en la mayoría de los lenguajes de programación para indicar que una instrucción ha terminado y comenzar otra en la misma línea.

a = b + 10 ; imprimir ( "Hola mundo" ); b = 243-23 ; _ _

Programación funcional y sintaxis avanzada

Otro punto fuerte de Python es la disponibilidad de elementos que facilitan la programación funcional . Las funciones se consideran objetos y, por lo tanto, se pueden usar como cualquier otro objeto, por ejemplo, insertándolas en colecciones o usándolas directamente como parámetros para otras funciones. Los elementos de programación funcional, junto con construcciones específicas para manejar contenedores, hacen que sea aún más conveniente trabajar con listas u otros tipos de contenedores.

Los cortes son una construcción similar a la indexación capaz de obtener subsecuencias especificando los índices de inicio, fin y 'paso'.

numeros = [ 1 , 2 , 3 , 4 , 5 ] numeros_pares = numeros [ 1 :: 2 ] # ejemplo de corte

La comprensión de listas es una construcción tomada del lenguaje funcional Haskell y permite "llenar" una lista - usando una sintaxis especial - como podemos ver en el siguiente ejemplo en el que se calculan las cinco primeras potencias de dos:

números = [ 1 , 2 , 3 , 4 , 5 ] potencias_de_dos = [ 2 ** n por n en números ] # ejemplo de comprensión de listas

Los generadores , por otro lado , son objetos particulares capaces de construir colecciones de forma dinámica, útiles para aumentar la eficiencia, en particular, la presencia de iteraciones en una gran cantidad de elementos. Las expresiones generadoras , similares a las listas por comprensión, son una herramienta rápida y eficaz para crear generadores . La palabra clave yield te permite crear generadores con una sintaxis muy similar a la de una función.

Pasemos a algunos ejemplos; expresión generadora :

números = [ 1 , 2 , 3 , 4 , 5 ] potencias_de_dos = ( 2 ** n para n en números ) # generador

O, para tener más control, como una función normal, podemos usar la palabra clave yield en lugar de return para convertir nuestra función en un generador. De esta manera, la función 'guarda' su estado y luego reanuda la ejecución del código cuando se recupera el valor del siguiente rendimiento .

numeros = [ 1 , 2 , 3 , 4 , 5 ] def poder_de_dos ( numeros ): para n en numeros : rendimiento 2 ** n gen = poder_de_dos ( numeros )

El uso es idéntico. Se llama a la siguiente función, que devuelve un nuevo valor cada vez, reanudando la ejecución del código desde la palabra clave yield . Cuando se terminan los valores, se genera una excepción StopIterationError . Sin embargo, no es la única forma de interactuar con los generadores, y puede rastrear los datos pasados ​​al rendimiento de la función de esta manera:

gen = ( 2 ** n para n en el rango ( 1 , 6 )) para x en gen : imprimir ( x )

Para crear una lista a partir de un generador, simplemente use la lista de llamadas (gen):

gen = ( 2 ** n para n en el rango ( 1 , 6 )) imprimir ( lista ( gen ))

Se prefieren los generadores a las listas ya que no ocupan memoria, ya que los valores simplemente se calculan de vez en cuando y no permanecen en la memoria. Para ello es recomendable utilizar, por ejemplo, xrange (que es un generador) en lugar de range (que devuelve una lista) con números muy grandes, para asegurar una mayor velocidad

También es posible escribir expresiones if ... else en una sola línea, lo cual es útil en combinación con lambdas (ver más abajo).

importar aleatorio l = [ 1 , 2 ] a = aleatorio . elección ( l ) print ( '¡Correcto!' if a == 1 else '¡Incorrecto!' )

Dado que Python le permite tener funciones como argumentos , también es posible tener construcciones funcionales más sutiles, como continuación . [21] .

En Python existe la palabra clave lambda, particularmente útil en contextos donde es necesario realizar pequeñas operaciones que probablemente se realizarán solo en esa zona del código:

>>> l = [ 1 , 2 , 3 , 4 , 5 ] # o rango (1,6) >>> print ( mapa ( lambda x : x + 10 , l )) [ 11 , 12 , 13 , 14 , 15 ]

Sin embargo, este uso del mapa está en disputa y se prefiere usar listas de comprensión:

>>> l = [ 1 , 2 , 3 , 4 , 5 ] # o rango (1,6) >>> print ([ x + 10 para x en l ]) [ 11 , 12 , 13 , 14 , 15 ]

Sin embargo, los bloques lambdasolo pueden contener expresiones , no declaraciones . Por lo tanto, no son la forma más general de devolver una función. En su lugar, puede usar la siguiente técnica que devuelve una función cuyo nombre está definido en un ámbito local , es decir, un cierre :

def multiple_adder ( x , y ): def sumador ( z ): return z + x + y return ( x + y + sumador ( x + y )) # sería (x + y) * 3

Decoradores

Un decorador es cualquier objeto de Python invocable que se usa para agregar código al principio o al final de una función, método o definición de clase, sin modificar su código internamente. Un decorador pasa el objeto y devuelve el objeto modificado.

Los decoradores se inspiran en parte en la notación de Java, tienen una sintaxis similar y se consideran azúcar sintáctico . Utilizan @como palabra clave:

@viking_chorus def menu_item (): imprimir ( "correo no deseado" )

Los decoradores se pueden encadenar colocando varios en líneas adyacentes:

@invincible @favorite_color ( "Azul" ) def black_knight (): pase

y es equivalente a:

def caballero_negro (): pase caballero_negro = invencible ( color_favorito ( "Azul" ) ( caballero_negro ))

La estructura estándar del decorador es:

def favorito_color ( color ): def decorador ( func ): def envoltorio (): print ( color ) func () return envoltorio return decorador

Comentarios

Al igual que otros lenguajes de programación, en Python puedes dejar comentarios en líneas de código para comprender mejor lo que sucede cuando ejecutas el programa. En Python, los comentarios (a partir de las primeras versiones del lenguaje de programación) se introducen con el símbolo "#" para no alterar el código.

print ( "algo aleatorio" ) #este programa imprime "algo aleatorio" ignorando cualquier cosa después del símbolo "#" print ( "enfrentándose cara a cara, el efecto del hash desaparece y el código afecta al programa" )

Manejo de excepciones

Python admite y utiliza ampliamente el manejo de excepciones como un medio para informar y verificar las condiciones de error, incluidas las excepciones generadas por errores de sintaxis.

Las excepciones permiten una verificación de errores más concisa y confiable que muchas otras formas posibles que se usan normalmente para informar errores o situaciones anormales. Las excepciones son seguras para subprocesos ; no sobrecargan el código fuente como lo hace la verificación de valores de retorno de error, y pueden propagarse fácilmente por la pila de llamadas a funciones cuando es necesario informar un error en un nivel superior del programa.

Con la gestión de excepciones, las comprobaciones preventivas se reemplazan por un mecanismo más sencillo que le permite realizar la acción deseada directamente y capturar por separado las excepciones que puedan ocurrir. Además del manejo de errores, las excepciones a veces se usan en Python también para el control de flujo: por ejemplo, la operación de iteración y, en consecuencia, el ciclo for,se basa en una señalización de excepción.

Biblioteca estándar

Python tiene una extensa biblioteca estándar , lo que lo hace adecuado para muchos usos. Además de los módulos de biblioteca estándar, puede agregar otros escritos en C o Python para satisfacer sus necesidades particulares. Entre los módulos ya disponibles hay para escribir aplicaciones web: MIME , HTTP y todos los demás estándares de Internet son compatibles. También hay módulos disponibles para crear aplicaciones con una interfaz gráfica, para conectarse a bases de datos relacionales , para usar expresiones regulares .

La biblioteca estándar es uno de los puntos fuertes de Python. De hecho, es compatible con todas las plataformas, con la excepción de algunas funciones, claramente marcadas en la documentación como específicas de una plataforma en particular.

Ejemplos de programas

¡Hola Mundo!

El siguiente ejemplo de programa de Python (versión 3.0) imprime el texto " ¡Hola, mundo! ":

imprimir ( "¡Hola, mundo!" )

El siguiente es el mismo programa que se ejecuta con la versión 2.7 o anterior:

imprimir "¡Hola, mundo!"

Crear un socket, enviar solicitudes y recibir datos

enchufe de importación #creaciones socket s = socket . enchufe () # conexión al servidor (google) s . conectar (( "www.google.com" , 80 )) #la solicitud solicitud = solicitud = "GET / HTTP / 1.1 \ n Host: www.google.com \ n \ n " #enviando datos codificados . enviar ( solicitud . codificar ()) #recibir datos (página de inicio de Google) datos = s . recv ( 2048 ) mientras len ( datos ) > 0 : imprimir ( datos ) datos = s . recibo ( 2048 )

Formato de cadena y entrada

a = entrada ( 'Nombre:' ) b = entrada ( 'Apellido:' ) c = entrada ( 'Edad:' ) print ( f "Nombre = { a } \ n Apellido = { b } \ n Edad = { c } " ) #pero también puedes: imprimir ( " Nombre = {} \ n Apellido = {} \ n Edad = {} " . formato ( a , b , c ))

RGB binario, RGB hexadecimal

El siguiente ejemplo de un programa de Python (versión 3.8.5 [22] ) convierte una entrada en un color codificado RGB con los pasos necesarios de los porcentajes de rojo, verde y azul :

definición RGB_bin (): cadena de importación porcentaje1 = entrada ( "rojo ( % d ex):" ) porcentaje2 = entrada ( "verde ( % d ex):" ) porcentaje3 = entrada ( "azul ( % d ex):" ) print ( "Codificando en RGB un color con" + str ( porcentaje1 ) + " % de rojo," + str ( porcentaje2 ) + " % de verde y" + str ( porcentaje3 ) + " % de azul... " ) print ( str ( porcentaje1 ) + ": 100 = X: 256, entonces X =" + str ( porcentaje1 ) + "* 256/100." ) X = flotante ( int ( porcentaje1 ) * 256/100 ) _ _ print ( str ( porcentaje2 ) + ": 100 = Y: 256, entonces Y =" + str ( porcentaje2 ) + "* 256/100." ) Y = flotante ( int ( porcentaje2 ) * 256/100 ) _ _ print ( str ( porcentaje3 ) + ": 100 = Z: 256, entonces Z =" + str ( porcentaje3 ) + "* 256 / 100." ) Z = flotante ( int ( porcentaje3 ) * 256/100 ) _ _ X = recipiente ( int ( X )) Y = recipiente ( int ( Y )) Z = recipiente ( int ( Z )) color_binario = ( str ( X ) + "" + str ( Y ) + "" + str ( Z )) print ( "Color codificado por dígitos binarios:" + str ( binary_colour [ 2 :])) definición RGB_hex (): porcentaje1 = entrada ( "rojo ( % d ex):" ) porcentaje2 = entrada ( "verde ( % d ex):" ) porcentaje3 = entrada ( "azul ( % d ex):" ) print ( "Codificando en RGB un color con" + str ( porcentaje1 ) + " % de rojo," + str ( porcentaje2 ) + " % de verde y" + str ( porcentaje3 ) + " % de azul... " ) print ( str ( porcentaje1 ) + ": 100 = X: 256, entonces X =" + str ( porcentaje1 ) + "* 256/100." ) R = flotante ( int ( porcentaje1 ) * 256/100 ) _ _ print ( str ( porcentaje2 ) + ": 100 = Y: 256, entonces Y =" + str ( porcentaje2 ) + "* 256/100." ) G = flotante ( int ( porcentaje2 ) * 256/100 ) _ _ print ( str ( porcentaje3 ) + ": 100 = Z: 256, entonces Z =" + str ( porcentaje3 ) + "* 256 / 100." ) B = flotante ( int ( porcentaje3 ) * 256/100 ) _ _ R = hexadecimal ( int ( R )) G = hexadecimal ( int ( G )) B = hexadecimal ( int ( B )) color_hexadecimal = ( cadena ( R ) + "" + cadena ( G ) + "" + cadena ( B )) print ( "Color codificado por dígitos hexadecimales:" + str ( color_hexadecimal [ 2 : 5 ]) + str ( color_hexadecimal [ 7 : 10 ]) + str ( color_hexadecimal [ 12 : 14 ]))

La salida del código fuente anterior es la siguiente:

======== REINICIAR : D : \ Python \ Python \ Python38 - 32 \ Python3 .8.5 desde pc \ RGB . pi ======= >>> RGB_bin () rojo ( % dex ): 30 verde ( % dex ): 40 azul ( % dex ): 20 Codificando en RGB un color con 30 % de rojo , 40 % de verde y 20 % de azul ... 30 : 100 = X : 256 , s o X = 30 * 256/100 . 40 : 100 = Y : 256 , s o Y = 40 * 256/100 . 20 : 100 = Z : 256 , s o Z = 20 * 256/100 . Código de color por dígitos binarios : 1001100 0b1100110 0b110011

Definición de una clase

En Python es posible crear clases a través de una declaración específica ( class) que representa la alternativa más simple, pero no exclusiva, para definir nuevos tipos de datos. Las características particulares de Python son la posibilidad de herencia múltiple, la definición de atributos por inicialización y no por declaración, la declaración explícita del parámetro reflexivo en los métodos de instancia y la sobrecarga de funciones y operadores.

El parámetro reflexivo se llama convencionalmente 'yo', pero el lenguaje no impone ninguna restricción a la elección. Tampoco se imponen restricciones a la definición de atributos: los atributos existen desde el momento en que se asignan y la asignación puede tener lugar en el momento de la construcción (método __init__, de preferencia) o dentro de otros métodos. Además, los atributos se pueden agregar externamente a la clase o directamente a un objeto.

Python distingue entre métodos de instancia, clase o estáticos. Los atributos pueden ser instancia o clase en su lugar. El soporte para ocultar información es parcial, pero integrado por la herramienta de propiedades que permite definir atributos virtuales con las características de acceso deseadas.

Además, existen métodos "especiales" asociados con operadores y funciones integradas. Por ejemplo, redefinir el método __add__redefine el operador de suma cuando el primer operando es del tipo definido, mientras __str__redefine la conversión a cadena. No se permite la sobrecarga de métodos. Mediante el uso de reflexión y metaclases también es posible personalizar aún más la definición de las clases.

Por ejemplo, una clase Person, que tiene solo un constructor simple y un método que devuelve el nombre completo. Se recomienda encarecidamente crear sólo clases de "nuevo estilo", es decir, clases que heredan (directa o indirectamente) del objeto [23] .

A partir de Python 3.6, es posible usar una nueva función llamada "f-strings" [24] . Al colocar la letra f antes de las comillas que abren la declaración de una cadena, se activa esta función. Gracias a él es posible incluir variables dentro de una cadena insertando su nombre entre llaves. De esta forma hacemos el código mucho más legible sin tener que usar una serie de + para concatenar variables y cadenas vacías. Además, si queremos incluir una variable o un objeto que no sea una cadena, la conversión se realizará automáticamente, salvando la excepción TypeError.

class Persona ( objeto ): # Constructor de la clase def __init__ ( self , nombre , apellido ): self . nombre = nombre propio . apellido = apellido def nombre_completo ( self ): full = f 'Sr. { auto . apellido } { propio . nombre } ' volver completo persona = Persona ( 'Juan' , 'Smith' ) print ( persona . nombre_completo ())

La salida presentada será la siguiente:Sig. Rossi Mario

Números perfectos hasta n

La salida devuelve números perfectos hasta n (ingresados ​​en forma impresa).

"" "Números perfectos" "" def print_perfect ( n ): "" "Imprime números perfectos hasta n" "" for i in range ( 2 , n + 1 ): sum = 0 for j in range ( 1 , i // 2 + 1 ): # Más allá de la mitad + 1 no hay más divisores si i % j == 0 : sum + = j # Sumar a la suma el divisor encontrado #print (i, j , sum) # Imprime valores intermedios si es necesario if sum == i : print ( i , end = "" ) print ( print_perfect ())

Notas

  1. ^ Del archivo README de distribución 2.6.4 : " ¿Qué es Python de todos modos? Python es un lenguaje de programación orientado a objetos interactivo e interpretado adecuado (entre otros usos) para el desarrollo de aplicaciones distribuidas, secuencias de comandos, computación numérica y pruebas de sistemas. Python se compara a menudo a Tcl, Perl, Java, JavaScript, Visual Basic o Scheme " .
  2. ^ Fuente: Copia archivada , en python.org . Consultado el 27 de octubre de 2009 (archivado desde el original el 17 de diciembre de 2009) .
  3. ^ ¿Cómo creo un archivo .pyc? , en effbot.org . Consultado el 28 de mayo de 2020 .
  4. ^ Python 3 vs C gcc - ¿Qué programas son más rápidos? | Computer Language Benchmarks Game , en benchmarksgame-team.pages.debian.net . Consultado el 28 de mayo de 2020 .
  5. ^ Página de inicio de Psyco , en psyco.sourceforge.net . Consultado el 28 de mayo de 2020 .
  6. ^ El equipo de PyPy, PyPy , en PyPy , 28 de diciembre de 2019. Consultado el 28 de mayo de 2020 .
  7. ^ Real Python, Enlaces de Python: llamar a C o C ++ desde Python - Real Python , en realpython.com . Consultado el 28 de mayo de 2020 .
  8. ^ Jython: Python para la plataforma Java
  9. ^ IronPython: el lenguaje de programación Python para .NET Framework
  10. ^ El lenguaje de programación Python para teléfonos móviles S60
  11. ^ PyPy Archivado el 13 de enero de 2007 en Internet Archive .
  12. ^ Página donde se almacenan los archivos cargados , en Repl.it.
  13. ^ SL4A en el código de Google
  14. ^ 24.1. tortuga - Turtle graphics - Documentación de Python 3.3.7 , en docs.python.org . Consultado el 28 de mayo de 2020 .
  15. ^ 8.17. copy: operaciones de copia superficial y profunda: documentación de Python 2.7.18 , en docs.python.org . Consultado el 28 de mayo de 2020 .
  16. ^ aleatorio: generar números pseudoaleatorios: documentación de Python 3.8.3 , en docs.python.org . Consultado el 28 de mayo de 2020 .
  17. ^ 28.1. sys: parámetros y funciones específicos del sistema: documentación de Python 2.7.18 , en docs.python.org . Consultado el 28 de mayo de 2020 .
  18. ^ 9.4. decimal: aritmética de punto fijo decimal y punto flotante: documentación de Python 2.7.18 , en docs.python.org . Consultado el 28 de mayo de 2020 .
  19. ^ 5. Tipos integrados: documentación de Python 2.7.18 , en docs.python.org . Consultado el 28 de mayo de 2020 .
  20. ^ Herencia múltiple , en Python ABC . Consultado el 28 de mayo de 2020 .
  21. ^ Continuaciones simplificadas e ilustradas
  22. ^ lanzamiento de la versión 3.8.5 , en Python.org .
  23. ^ Un nuevo estilo para las clases | Python-it.org # el punto de referencia italiano para los entusiastas de Python , en python-it.org . Consultado el 23 de junio de 2010 (archivado desde el original el 6 de agosto de 2010) .
  24. ^ PEP 498 - Interpolación de cadenas literales , en Python.org . Consultado el 23 de mayo de 2019 .

Bibliografía

  • Micha Gorelick, Ian Ozsvald, Python a toda potencia. Programación práctica de alto rendimiento , Milán, Hoepli, 2015, p. 376, ISBN  9788820367015 .
  • Mark Lutz, Learning Python , Milán, New Techniques, 2011, p. 1097, ISBN  9788848125956 .
  • ( EN ) Luciano Ramalho, Fluent Python: Programación clara, concisa y efectiva , O'Reilly Media, 2015, p. 792, ISBN  9781491946008 .

Artículos relacionados

Otros proyectos

Enlaces externos