1422 votos

Características ocultas de Python

743voto

Thomas Wouters Puntos 38811

El encadenamiento de los operadores de comparación:

>>> x = 5
>>> 1 < x < 10
True
>>> 10 < x < 20 
False
>>> x < 10 < x*10 < 100
True
>>> 10 > x <= 9
True
>>> 5 == x > 4
True

En caso de que usted está pensando que está haciendo 1 < x, que sale como True, y, a continuación, comparando True < 10, que también es True, entonces no, eso no es realmente lo que sucede (véase el último ejemplo). Es realmente traducir en 1 < x and x < 10y x < 10 and 10 < x * 10 and x*10 < 100, pero con menos escribir y cada término es sólo evalúan una sola vez.

513voto

BatchyX Puntos 2521

Obtener el python regex árbol de análisis para depurar su expresión regular.

Las expresiones regulares son una gran característica de python, pero la depuración de ellos puede ser un dolor, y es muy fácil conseguir un regex mal.

Afortunadamente, python puede imprimir el regex árbol de análisis, por el paso de los indocumentados, experimental, oculto bandera re.DEBUG (en realidad, 128) re.compile.

>>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]",
    re.DEBUG)
at at_beginning
literal 91
literal 102
literal 111
literal 110
literal 116
max_repeat 0 1
  subpattern None
    literal 61
    subpattern 1
      in
        literal 45
        literal 43
      max_repeat 1 2
        in
          range (48, 57)
literal 93
subpattern 2
  min_repeat 0 65535
    any None
in
  literal 47
  literal 102
  literal 111
  literal 110
  literal 116

Una vez que usted entiende la sintaxis, puede descubrir sus errores. Allí podemos ver que me olvidé de escapar de la [] en [/font].

Por supuesto, usted puede combinar con cualquiera de los indicadores que se quieren, como comentó expresiones regulares:

>>> re.compile("""
 ^              # start of a line
 \[font         # the font tag
 (?:=(?P<size>  # optional [font=+size]
 [-+][0-9]{1,2} # size specification
 ))?
 \]             # end of tag
 (.*?)          # text between the tags
 \[/font\]      # end of the tag
 """, re.DEBUG|re.VERBOSE|re.DOTALL)

461voto

Dave Puntos 224

enumerar

Envoltura de un iterable con enumerar y producirá el elemento junto con su índice.

Por ejemplo:


>>> a = ['a', 'b', 'c', 'd', 'e']
>>> for index, item in enumerate(a): print index, item
...
0 a
1 b
2 c
3 d
4 e
>>>

Referencias:

419voto

freespace Puntos 9024

La creación de generadores de objetos

Si usted escribe

x=(n for n in foo if bar(n))

usted puede obtener el generador y asignar a x. Ahora que significa que usted puede hacer

for n in x:

La ventaja de esto es que usted no necesita almacenamiento intermedio, que usted tendría si usted hizo

x = [n for n in foo if bar(n)]

En algunos casos esto puede conducir a mejoras significativas en la velocidad.

Usted puede agregar muchas declaraciones y si al final del generador, básicamente replicar bucles for anidados:

>>> n = ((a,b) for a in range(0,2) for b in range(4,6))
>>> for i in n:
...   print i 

(0, 4)
(0, 5)
(1, 4)
(1, 5)

353voto

mbac32768 Puntos 3830

el iter() puede tomar un callable argumento

Por ejemplo:

def seek_next_line(f):
    for c in iter(lambda: f.read(1),'\n'):
        pass

La iter(callable, until_value) función llama repetidamente callable y los rendimientos de su resultado hasta until_value es devuelto.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X