[python] SQLite - forma selectovaných dat

superman feed na centrum.cz
Sobota Leden 6 23:23:09 CET 2007


> JInak, proc pouzivate for i in range(len(a)): ? Uz jsem si toho
> vsimnul driv, u jinych prispevku. Preci, kdyz chci iterovat pres
> prvky, tak musi staci for item in a:

Protože:

1) Zvyk z jiných jazyků.

2) Protože taková iterace je read only. Já můžu dát for item in a, ale 
už nezměním ten konkrétní prvek přímo v poli. Třeba jako v tomto případě 
výsledné pole má stejný počet prvků, jen tuple se má změnit na seznam. 
Vycházím z toho (možná mylně), že cokoli jiného, než iterace přes indexy 
lze zařídit jedině tak, že budu mít v paměti dvě pole, první budu číst 
iterací, do druhé budu vytvářet výsledek. Zatímco při iteraci přes 
indexy mám jen jedno pole, nad kterým se čte i zapisuje - je to paměťově 
efektivnější.

Existuje možnost jak to udělat bez indexování a bez toho, aby v paměti 
byly dočasně dvě pole?

> Indexace je zvyk z C, PHP, Pascalu apod., kde to byla nutnost.

V PHP existuje stejná iterace, dokonce si tam můžete udělat i vlastní 
iterátor, čehož jsem hojně využíval ve svých třídách a objektech. Ale v 
PHP je iterátor dvojí, jeden read only jako v Pythonu a druhý s možností 
změnit prvek pole, a ten mi v Pythonu chybí (a nebo o něm nevím):

Následující kód v PHP docela elegantně iterací přičte ke každému prvku 
pole trojku, aniž by se musela vytvářet kopie pole:

$a = array(1,2,3,4,5);
foreach ($a as &$value)
   $value += 3;

V C++ také existuje iterace, dokonce s možností projet jen část prvků 
daných iterátorem:

std::for_each(objekt.begin(), objekt.end(), do_for_every_item);

Ing. Miloslav Ponkrác







Další informace o konferenci Python