1419 votes

Les fonctions cachées de Python

740voto

Thomas Wouters Points 38811

Le chaînage des opérateurs de comparaison:

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

Dans le cas où vous êtes en train de penser qu'il fait 1 < x, qui ne sort qu' True, puis de comparer True < 10, ce qui est également True, alors non, ce n'est vraiment pas ce qui se passe (voir le dernier exemple.) C'est vraiment la traduction en 1 < x and x < 10, et x < 10 and 10 < x * 10 and x*10 < 100, mais avec moins de frappe et chaque terme est évalué seulement une fois.

512voto

BatchyX Points 2521

Obtenir le python regex arbre d'analyse pour déboguer votre regex.

Les expressions régulières sont une excellente fonctionnalité de python, mais le débogage d'entre eux peuvent être une douleur, et il est trop facile de faire un regex de mal.

Heureusement, python, il est possible d'imprimer les regex arbre d'analyse, en passant par les sans-papiers, expérimental, caché indicateur re.DEBUG (en fait, 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

Une fois que vous comprenez la syntaxe, vous pouvez repérer vos erreurs. De là, on peut voir que j'ai oublié d'échapper à l' [] en [/font].

Bien sûr, vous pouvez les combiner avec ce que les drapeaux que vous voulez, comme commenté regexes:

>>> 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)

460voto

Dave Points 224

énumérer

Envelopper un objet iterable avec énumérer et il donnera le point avec son index.

Par exemple:


>>> 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
>>>

Références:

419voto

freespace Points 9024

La création de générateurs d'objets

Si vous écrivez

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

vous pouvez obtenir le générateur et l'affecter à x. Maintenant, cela signifie que vous pouvez faire

for n in x:

L'avantage, c'est que vous n'avez pas besoin de stockage intermédiaire, dont vous aurez besoin si vous n'avez

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

Dans certains cas, cela peut conduire à vitesse importante.

Vous pouvez ajouter de nombreux cas, si des déclarations à la fin de la génératrice, fondamentalement, la réplication des boucles for imbriquées:

>>> 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 Points 3830

iter() peut prendre un callable argument

Par exemple:

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

L' iter(callable, until_value) fonction appelle à plusieurs reprises callable et les rendements de son résultat jusqu' until_value est retourné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X