[Python] Unione espressioni regolari

Marco Beri marcoberi a gmail.com
Ven 20 Lug 2012 15:22:06 CEST


Il giorno 20/lug/2012, alle ore 15:02, Alberto Granzotto
<agranzot a gmail.com> ha scritto:

> questo esempio mi ha acceso una lampadina (ammetto di non essermi mai posto il problema), `all` e `any` cortocircuitano ma bisogna stare attenti:
>
> In [1]: l = range(1000)
>
> In [2]: timeit all([x for x in l])
> 10000 loops, best of 3: 42.6 us per loop
>
> In [3]: timeit all(x for x in l)
> 1000000 loops, best of 3: 661 ns per loop
>
> oppure, per togliere ogni dubbio:
>
> In [7]: def foo(x): print '.',; return x
>
> In [8]: all([foo(x) for x in l])
> . . . . . . [tanti altri puntini] .Out[8]: False
>
> In [9]: all(foo(x) for x in l)
> .Out[9]: False
>
> nel primo caso mi sa che l'interprete genera la lista che poi è passata a `all`.

Esatto. Viene generata tutta la lista. Ma comunque all non la scorre
tutta: esce al primo elemento anche se la lista è comunque "piena".

> Nel secondo invece è sufficientemente sveglio da fare la cosa giusta. La vedo un po' come la differenza tra range e xrange.

Nel secondo caso invece c'è di mezzo un generatore. Esattamente come
con xrange :-)

Ciao.
Marco.


Maggiori informazioni sulla lista Python