Форум сайта python.su
ZZZну опять… речь шла не об этом. единственное, что мне не понравилось, так это твое утверждение, что “функция iter должна возвращать генератор с любого итератора… :-)”
Метод __iter__ вообще отсутствует, однако итератор вполне неплохо создаётся и работает.
ZZZ
Я бы сказал так: генератор, это частный случай итератора. Согласен? Кто прав? Дружба. :-)
ZZZя и мерц так не считаем.
Реально же я считаю в корне не верным и очень не красивым делать так:class C(object):
def __iter__(self): return self
Офлайн
Ну что ж, это уже дело вкуса, а о вкусах не спорят… :-)
Просто мне кажется, что итерируемые объекты (за редким исключением, вроде генераторов) должны нормально перебираться хоть в десяти вложенных циклах for. Я не раз сталкивался с тем, что приходилось править из-за этого не мной написанные классы… А ты попробуй отлови эту ошибку!!! А всё из-за лени и простоты def __iter__(self): return self.
А насчёт “генератора из __iter__”, то можно было понять, что я погорячился немного:
ZZZ
С другой стороны мы можем создать в __iter__ класс-итератор типа твоего и его и вернуть – тоже допустимо и иногда полезно.
Офлайн
import itertools
def iterator(myList):
res = [myList]
while(True):
myDict = dict((itertools.izip(range(len(res[-1])),res[-1])))
for i in reversed(myDict.keys()[1:]):
if myDict[i] > myDict[i-1]:
minChar = min([x for x in myDict.values()[i:] if x > myDict[i-1]])
minCharIndex = dict_index(minChar,myDict)
myDict[minCharIndex],myDict[i-1] = myDict[i-1],myDict[minCharIndex]
if ((len(myDict.values()) - i)> 1):
myDict.update(invert_dict(sub_dict(myDict,myDict.keys()[i:])))
break
if myDict.values() in res:
return res
res.append(myDict.values())
def invert_dict(d):
return dict(itertools.izip(d.iterkeys( ),reversed(d.values( ))))
def sub_dict(somedict, somekeys, default=None):
return dict([ (k, somedict.get(k, default)) for k in somekeys ])
def dict_index(value,d):
for key,item in d.items():
if value == item:
return key
else: raise ValueError, 'key not found'
print iterator(list('123'))
def recFac(x):
if x <= 1:
return 1
else:
return recFac(x-1)*x
for x in xrange(0,10000):
try:
recFac(x)
except RuntimeError:
print x
break
out: 997
Отредактировано (Ноя. 28, 2008 20:21:51)
Офлайн