[Python] Unione espressioni regolari

Alberto Granzotto agranzot a gmail.com
Ven 20 Lug 2012 15:02:27 CEST


2012/7/20 Marco Beri <marcoberi a gmail.com>

> 2012/7/20 Walter Valenti <waltervalenti a yahoo.it>
>
>> In un array di stringhe. Posso sempre infilarli in un tupla.
>>
>
> Una roba così con la funzione all non ti garba?
>
> >>> import re
> >>> s = ["12", "ab", "ZZ"]
> >>> all(re.match(".*%s.*"%e, "abcZZxx12") for e in s)
> True
> >>> all(re.match(".*%s.*"%e, "abcZZxx1") for e in s)
> False
>

molto bello.

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`. Nel secondo invece è sufficientemente sveglio da fare la cosa
giusta. La vedo un po' come la differenza tra range e xrange.

Scusate se per voi era ovvio, per me non lo era :P

ciao,
alberto
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20120720/7a9cd8c1/attachment-0001.html>


Maggiori informazioni sulla lista Python