Re: [python] Zkrácená forma přiřazení sel že

2010-04-20 Tema obsahu Přikryl Petr
No jo. Je to zjednodušení.

Petr Messner
> Přikryl Petr
>>    def __iter__(self):
>>        '''Vraci iterator -- sam sobe iteratorem.'''
>>        self.idx = 0
>>        return self
>
>prosim takto ne, kdyz udelam
>it = iter(slova)
>it2 = iter(slova)
>tak ty iteratory se navzajem ovlivnuji.

Záleží na tom, k čemu to má sloužit. Dá se to napsat
s odděleným objektem iterátoru:

class Seznam:
def __init__(self,sez):
self.data=sez
def __getitem__(self,idx):
return idx < len(self.data) and self.data[idx] or None

def __iter__(self):  
return SeznamIterator(self)


class SeznamIterator:
def __init__(self, obj):
self.idx = 0
self.obj = obj

def next(self):
'''Standardni podpora iterace.'''
if self.idx >= len(self.obj.data):
StopIteration
hodnota = Seznam.__getitem__(self.obj, self.idx)
self.idx += 1
return hodnota   



### VSTUP: ###   
slova = Seznam(["ITEM-1","ITEM-2","ITEM-3", 4])

prvni = slova[0]
druhy = slova[1]
treti = slova[2]
ctrty = slova[3]

# Rucne provadena iterace.
it1 = iter(slova)
it2 = iter(slova)

print id(it1)
print id(it2)

print next(it1)
print next(it2)

print next(it1)
print next(it2)

print next(it1)
print next(it2)

print next(it1)
print next(it2)
print '-' * 50

>Problem ale stejne bude v tom, ze kdyz chci
>prvy, druhy, treti, ctrty = slova
>
>tak ten iterator musi vratit presne 4 hodnoty a pak vyvolat
>StopIteration. A jak tomu reknes, ze z toho tahas ty 4 hodnoty? Leda
>tak tim, ze tam fakt budou presne 4. To ale neni chovani, ktere
>ocekava tazatel.

Tady je otázka, jestli je očekávání podporováno realitou.
Nevím, jestli to vůbec nějak jde. Nedivil bych se, kdyby
to nešlo. Takhle se bude chovat i standardní seznam.

Pokud to má podporovat iteraci, pak nemá smysl ani to None v __getitem__()

___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python

Re: [python] Zkrácená forma přiřazení sel že

2010-04-20 Tema obsahu Přikryl Petr


Jirka Vejrazka
>  nemam ted momentalne cas to zkouset, ale troufnul bych si odhadnout,
>ze pro funkcnost ve stylu (b) budes muset nadefinovat jak se ma chovat
>iterator, tj. napsat si vlastni metodu __iter__(self, ...)

Je to tak. Jirka to trefil přesně. To násobné přiřazení
vyžaduje, aby objekt podporoval průchod svými prvky.
(Takový objekt se pak dá použít například i v cyklu for.)

Zkus tohle:

class Seznam():
def __init__(self,sez):
self.data=sez
def __getitem__(self,idx):
return idx < len(self.data) and self.data[idx] or None

def __iter__(self):  
'''Vraci iterator -- sam sobe iteratorem.'''
self.idx = 0
return self 

def next(self):
'''Standardni podpora iterace.'''
if self.idx >= len(self.data):
raise StopIteration
hodnota = Seznam.__getitem__(self, self.idx)
self.idx += 1
return hodnota   

### VSTUP: ###   
slova = Seznam(["ITEM-1","ITEM-2","ITEM-3","ITEM-4"])

prvni = slova[0]
druhy = slova[1]
treti = slova[2]
ctrty = slova[3]

# Rucne provadena iterace.
it = iter(slova)
print it
print next(it)
print next(it)
print next(it)
print '-' * 50

# Automaticky aktivovana iterace.
prvy, druhy, treti, ctvrty = slova
print prvy
print druhy
print treti 
print ctvrty___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python