¿Cuáles son las características menos conocidas pero útiles del lenguaje de programación Python?
- Intenta limitar las respuestas al núcleo de Python.
- Una característica por respuesta.
- Dé un ejemplo y una breve descripción de la función, no solo un enlace a la documentación.
- Etiquete la característica usando un título como la primera línea.
Enlaces rápidos a respuestas:
- Argumento Desembalaje
- Tirantes
- Operadores de comparación de encadenamiento
- Decoradores
- Argumento predeterminado Gotchas / Peligros de Mutable Argumentos predeterminados
- Descriptores
.get
Valor predeterminado del diccionario- Pruebas de Docstring
- Sintaxis de corte de puntos suspensivos
- Enumeración
- Para / más
- Funciona como argumento iter ()
- Generador de expresiones
import this
- Intercambio de valor en el lugar
- Lista de pasos
__missing__
artículos- Regex multilínea
- Formato de cadena con nombre
- Lista anidada / comprensión del generador
- Nuevos tipos en tiempo de ejecución
.pth
archivos- Codificación ROT13
- Depuración de expresiones regulares
- Envío a generadores
- Finalización de tabulación en Intérprete interactivo
- Expresión Ternaria
try/except/else
- Desembalaje +
print()
función with
declaración
python
hidden-features
compie
fuente
fuente
(< 1 x 10)
. Incluso puede aplicarlos a argumentos individuales, como(= 10)
: cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/…Obtenga el árbol de análisis de expresiones regulares de python para depurar su expresión regular.
Las expresiones regulares son una gran característica de python, pero depurarlas puede ser una molestia, y es muy fácil equivocarse con una expresión regular.
Afortunadamente, python puede imprimir el árbol de análisis de expresiones regulares, pasando el indicador oculto, indocumentado, experimental
re.DEBUG
(en realidad, 128) are.compile
.Una vez que comprenda la sintaxis, puede detectar sus errores. No podemos ver que se me olvidó para escapar de la
[]
en[/font]
.Por supuesto, puede combinarlo con las banderas que desee, como expresiones regulares comentadas:
fuente
enumerar
Envuelva un iterable con enumerate y generará el elemento junto con su índice.
Por ejemplo:
Referencias
enumerate
fuente
Crear objetos generadores
Si tú escribes
puedes sacar el generador y asignarlo a x. Ahora significa que puedes hacer
La ventaja de esto es que no necesita almacenamiento intermedio, que necesitaría si lo necesitara
En algunos casos, esto puede conducir a una aceleración significativa.
Puede agregar muchas declaraciones if al final del generador, básicamente replicando los bucles anidados:
fuente
iter () puede tomar un argumento invocable
Por ejemplo:
La
iter(callable, until_value)
función llama repetidamentecallable
y produce su resultado hasta queuntil_value
se devuelve.fuente
lambda
palabra clave es necesaria aquí?Tenga cuidado con los argumentos predeterminados mutables
En su lugar, debe usar un valor centinela que denote "no dado" y reemplazarlo con el mutable que desea por defecto:
fuente
foo.func_defaults
. Lo cual, siendo una tupla, es inmutable.Envío de valores a las funciones del generador . Por ejemplo, tener esta función:
Usted puede:
fuente
Si no le gusta usar espacios en blanco para denotar ámbitos, puede usar el estilo C {} emitiendo:
fuente
El argumento paso en operadores de corte. Por ejemplo:
El caso especial
x[::-1]
es un lenguaje útil para 'x invertido'.fuente
Decoradores
Los decoradores permiten ajustar una función o método en otra función que puede agregar funcionalidad, modificar argumentos o resultados, etc. Usted escribe decoradores una línea sobre la definición de la función, comenzando con un signo "at" (@).
El ejemplo muestra un
print_args
decorador que imprime los argumentos de la función decorada antes de llamarla:fuente
La sintaxis de for ... else (ver http://docs.python.org/ref/for.html )
El bloque "else" se ejecutará normalmente al final del ciclo for, a menos que se llame al break.
El código anterior se puede emular de la siguiente manera:
fuente
De 2.5 en adelante, los dictos tienen un método especial
__missing__
que se invoca para los elementos faltantes:También hay una subclase dict en
collections
llamadadefaultdict
que hace más o menos lo mismo pero llama a una función sin argumentos para elementos no existentes:Recomiendo convertir dichos dictos a dictos regulares antes de pasarlos a funciones que no esperan tales subclases. Una gran cantidad de código usa
d[a_key]
y captura KeyErrors para verificar si existe un elemento que agregaría un nuevo elemento al dict.fuente
m={}; m.setdefault('foo', []).append(1)
.defaultdict
También es más potente que elsetdefault
método en otros casos. Por ejemplo, para un contra-dd = collections.defaultdict(int) ... dd[k] += 1
vsd.setdefault(k, 0) += 1
.Intercambio de valor en el lugar
El lado derecho de la tarea es una expresión que crea una nueva tupla. El lado izquierdo de la tarea desempaqueta inmediatamente esa tupla (sin referencia) a los nombres
a
yb
.Después de la asignación, la nueva tupla no está referenciada y marcada para la recolección de basura, y los valores vinculados a
a
yb
se han intercambiado.Como se señaló en el sección del tutorial de Python sobre estructuras de datos ,
fuente
Expresiones regulares legibles
En Python puede dividir una expresión regular en varias líneas, nombrar sus coincidencias e insertar comentarios.
Ejemplo de sintaxis detallada (de Dive into Python ):
Ejemplo de coincidencias de nomenclatura (del COMO de expresiones regulares )
También puedes escribir una expresión regular sin usar
re.VERBOSE
gracias a la concatenación literal de cadenas.fuente
Desembalaje de argumento de función
Puede descomprimir una lista o un diccionario como argumentos de función utilizando
*
y**
.Por ejemplo:
Atajo muy útil ya que las listas, tuplas y dictados se usan ampliamente como contenedores.
fuente
ROT13 es una codificación válida para el código fuente, cuando utiliza la declaración de codificación correcta en la parte superior del archivo de código:
fuente
cevag h"Uryyb fgnpxbiresybj!"
Crear nuevos tipos de manera totalmente dinámica
que es exactamente lo mismo que
Probablemente no sea lo más útil, pero es bueno saberlo.
Editar : El nombre fijo del nuevo tipo debe ser
NewType
exactamente lo mismo que con laclass
declaración.Editar : Ajustó el título para describir con mayor precisión la función.
fuente
Los administradores de contexto y la "
with
" DeclaraciónIntroducido en PEP 343 , un administrador de contexto es un objeto que actúa como contexto de tiempo de ejecución para un conjunto de declaraciones.
Dado que la función utiliza nuevas palabras clave, se introduce gradualmente: está disponible en Python 2.5 a través de
__future__
directiva. Python 2.6 y superior (incluido Python 3) lo tiene disponible de forma predeterminada.He usado mucho la declaración "con" porque creo que es una construcción muy útil, aquí hay una demostración rápida:
Lo que sucede aquí detrás de escena es que la instrucción "con" llama a los métodos especiales
__enter__
y__exit__
al objeto del archivo. Los detalles de excepción también se pasan a__exit__
si surgió alguna excepción del cuerpo de la declaración with, lo que permite el manejo de excepciones allí.Lo que esto hace por usted en este caso particular es que garantiza que el archivo se cierre cuando la ejecución esté fuera del alcance de la
with
suite, independientemente de si eso ocurre normalmente o si se produjo una excepción. Básicamente es una forma de abstraer el código común de manejo de excepciones.Otros casos de uso comunes para esto incluyen el bloqueo con hilos y transacciones de bases de datos.
fuente
withs
:)with open('filea') as filea and open('fileb') as fileb: ...
with open('filea') as filea, open('fileb') as fileb: ...
Los diccionarios tienen un método get ()
Los diccionarios tienen un método 'get ()'. Si haces d ['clave'] y la clave no está allí, obtienes una excepción. Si hace d.get ('clave'), regresa Ninguno si 'clave' no está allí. Puede agregar un segundo argumento para recuperar ese elemento en lugar de Ninguno, por ejemplo: d.get ('clave', 0).
Es genial para cosas como sumar números:
sum[value] = sum.get(value, 0) + 1
fuente
get(key, None)
. No tenía idea de queNone
se proporcionaba por defecto.Descriptores
Son la magia detrás de un montón de características centrales de Python.
Cuando usa el acceso punteado para buscar un miembro (por ejemplo, xy), Python primero busca el miembro en el diccionario de instancias. Si no se encuentra, lo busca en el diccionario de la clase. Si lo encuentra en el diccionario de la clase y el objeto implementa el protocolo descriptor, en lugar de simplemente devolverlo, Python lo ejecuta. Un descriptor es cualquier clase que implementa la
__get__
,__set__
o__delete__
métodos.Así es como implementaría su propia versión (de solo lectura) de la propiedad utilizando descriptores:
y lo usarías igual que la propiedad incorporada ():
Los descriptores se usan en Python para implementar propiedades, métodos enlazados, métodos estáticos, métodos de clase y ranuras, entre otras cosas. Comprenderlos hace que sea fácil ver por qué muchas de las cosas que antes parecían 'peculiaridades' de Python son como son.
Raymond Hettinger tiene un excelente tutorial que hace un trabajo mucho mejor describiéndolos que yo.
fuente
foo = property(lambda self: self.__foo)
property
sí se implementa con descriptores, que fue el punto de mi publicación.Asignación Condicional
Hace exactamente lo que parece: "asigna 3 a x si y es 1, de lo contrario asigna 2 a x". Tenga en cuenta que los parens no son necesarios, pero me gustan para facilitar la lectura. También puedes encadenarlo si tienes algo más complicado:
Aunque en cierto punto, va un poco demasiado lejos.
Tenga en cuenta que puede usar if ... else en cualquier expresión. Por ejemplo:
Aquí se llamará a func1 si y es 1 y func2, de lo contrario. En ambos casos, la función correspondiente se llamará con argumentos arg1 y arg2.
Análogamente, lo siguiente también es válido:
donde class1 y class2 son dos clases.
fuente
x = ((y == 1) ? 3 : 2)
tiene más sentido para míDoctest : documentación y pruebas unitarias al mismo tiempo.
Ejemplo extraído de la documentación de Python:
fuente
locals()
luego en su doctest dolocals().update(setUp())
= DFormato con nombre
El formato% toma un diccionario (también aplica la validación% i /% s, etc.).
Y dado que locals () también es un diccionario, simplemente puede pasarlo como un dict y tener% -substitions de sus variables locales. Creo que esto está mal visto, pero simplifica las cosas ...
Nuevo formato de estilo
fuente
Para agregar más módulos de Python (especialmente los de terceros), la mayoría de las personas parecen usar las variables de entorno PYTHONPATH o agregan enlaces simbólicos o directorios en sus directorios de paquetes de sitio. Otra forma es usar archivos * .pth. Aquí está la explicación oficial del documento de Python:
fuente
Excepción otra cláusula:
El uso de la cláusula else es mejor que agregar código adicional a la cláusula try porque evita detectar accidentalmente una excepción que no fue generada por el código protegido por la declaración try ... except.
Ver http://docs.python.org/tut/node10.html
fuente
Volver a plantear excepciones :
La declaración 'raise' sin argumentos dentro de un controlador de errores le dice a Python que vuelva a aumentar la excepción con el rastreo original intacto , permitiéndole decir "oh, lo siento, lo siento, no quise captar eso, lo siento, lo siento. "
Si desea imprimir, almacenar o manipular el rastreo original, puede obtenerlo con sys.exc_info (), e imprimirlo como Python lo haría con el módulo 'rastreo'.
fuente
raise e
lugar, lo que no conserva el rastreo original.exc_info = sys.exc_info(); raise exc_info[0], exc_info[1], exc_info[2]
es equivalente a esto, pero puede cambiar esos valores (por ejemplo, cambiar el tipo de excepción o el mensaje)Mensajes principales :)
Descifrado :
fuente
print s.translate("".join(chr(64<i<91 and 65+(i-52)%26 or 96<i<123 and 97+(i-84)%26 or i) for i in range(256)))
y ahora se ve mucho mejor! :-DFinalización de la pestaña de intérprete interactivo
También deberá establecer una variable de entorno PYTHONSTARTUP.
fuente
easy_install ipdb
- entonces puedes usarimport ipdb; ipdb.set_trace()
readline.parse_and_bind ("bind ^I rl_complete")
Lista de comprensiones anidadas y expresiones generadoras:
Estos pueden reemplazar enormes fragmentos de código de bucle anidado.
fuente
for
declaraciones debe escribirse en el orden que esperarías que se escriban en un bucle for estándar, desde afuera hacia adentro.for
s yif
s conyield x
el interior. Para convertir eso en una expresión generadora, muévasex
primero, elimine todos los dos puntos (y elyield
), y rodee todo entre paréntesis. Para hacer una lista de comprensión, reemplace los parentes exteriores con corchetes.Sobrecarga del operador para la
set
construcción:Más detalles de la referencia de biblioteca estándar: Establecer tipos
fuente