[python] Generator prvku ridke matice (bylo ... nechtene propojeni mnozin)

Petr Přikryl prikryl na atlas.cz
Středa Říjen 20 09:18:41 CEST 2010


Pro Python 2.x by se to dalo ještě upravit (viz dole).

"Jirka Vejrazka" napsal
 > >  for i in [(a,b) for a in range(1,10,2) for b in range(5,20,5)]:
 > 
 > Kdyz tady pouzijes na krajich kulate zavorky misto hranatych, tak se
 > to nevyrobi cele v pameti, ale vznikne generator, ktery se pak da
 > pouzit uplne stejne pro "for" cyklus:
 > 
 > Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
 > Type "help", "copyright", "credits" or "license" for more information.
 > 
 | >>> x = [(a,b) for a in range(1,10,2) for b in range(5,20,5)]
 | >>> x
 | [(1, 5), (1, 10), (1, 15), (3, 5), (3, 10), (3, 15), (5, 5), (5, 10), (5, 15),
 | 
 | >>> x = ((a,b) for a in range(1,10,2) for b in range(5,20,5))
 | >>> x
 | 
 
a.py
======================================================
g = ((a,b) for a in xrange(1,10,2) for b in xrange(5,20,5))

def genFunc(x, y):
    for a in xrange(1, x, 2):
        for b in xrange(5, y, 5):
            yield (a, b)
            
for t in g:
    print t,
    
print    
print '-' * 60

for t in genFunc(10, 20):
    print t,
======================================================
 
Místo range() použij xrange() -- i když tady ta úspora je maličká (jen z principu).
To je ten generátor přiřazený do g -- jak ukazoval Jirka.

Generátorová funkce genFunc vrátí stejný generátor. Je to jiné jen syntakticky.
Tady jsou navíc doplněny jen parametry, aby se to dalo použít pro různé hodnoty
x a y a nemuselo se to furt opisovat. Zavoláním genFunc vznikne podobný
generátor, jako g.  U mě to zobrazí následující:

======================================================
C:tmp>python a.py
(1, 5) (1, 10) (1, 15) (3, 5) (3, 10) (3, 15) (5, 5) (5, 10) (5, 15) (7, 5) (7, 10) (7, 15) (9, 5) (9, 10) (9, 15)
------------------------------------------------------------
(1, 5) (1, 10) (1, 15) (3, 5) (3, 10) (3, 15) (5, 5) (5, 10) (5, 15) (7, 5) (7, 10) (7, 15) (9, 5) (9, 10) (9, 15)
======================================================
 
Petr


Další informace o konferenci Python