[python] Generator prvku ridke matice (bylo ... nechtene propojenimnozin)
MICHÁLEK Jan Mgr.
Michalek.Jan na uhul.cz
Pátek Říjen 22 12:07:21 CEST 2010
Hm, vidím X a Y, tdy někdo poměrně přesně odhadl, na co to potřebuju.
Je.
-----Original Message-----
From: python-bounces na py.cz [mailto:python-bounces na py.cz] On Behalf Of Petr Přikryl
Sent: Wednesday, October 20, 2010 9:19 AM
To: Konference PyCZ
Subject: [python] Generator prvku ridke matice (bylo ... nechtene propojenimnozin)
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
_______________________________________________
Python mailing list
Python na py.cz
http://www.py.cz/mailman/listinfo/python
__________ Informace od ESET NOD32 Antivirus, verze databaze 5546 (20101019) __________
Tuto zpravu proveril ESET NOD32 Antivirus.
http://www.eset.cz
Další informace o konferenci Python