Найти - Пользователи
Полная версия: Задачка на комбинаторику.
Начало » Python для экспертов » Задачка на комбинаторику.
1 2 3 4
Dimka665
ZZZ
Метод __iter__ вообще отсутствует, однако итератор вполне неплохо создаётся и работает.
ну опять… речь шла не об этом. единственное, что мне не понравилось, так это твое утверждение, что “функция iter должна возвращать генератор с любого итератора… :-)”
ZZZ
Я бы сказал так: генератор, это частный случай итератора. Согласен? Кто прав? Дружба. :-)
ZZZ
Реально же я считаю в корне не верным и очень не красивым делать так:
class C(object):
def __iter__(self): return self
я и мерц так не считаем.
ZZZ
Ну что ж, это уже дело вкуса, а о вкусах не спорят… :-)
Просто мне кажется, что итерируемые объекты (за редким исключением, вроде генераторов) должны нормально перебираться хоть в десяти вложенных циклах for. Я не раз сталкивался с тем, что приходилось править из-за этого не мной написанные классы… А ты попробуй отлови эту ошибку!!! А всё из-за лени и простоты def __iter__(self): return self.

А насчёт “генератора из __iter__”, то можно было понять, что я погорячился немного:
ZZZ
С другой стороны мы можем создать в __iter__ класс-итератор типа твоего и его и вернуть – тоже допустимо и иногда полезно.
Leron
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
кроме того мне кажется нерекурсивные алгоритмы более понятны…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB