Здравствуйте, DemAS, Вы писали:
DAS>Покритикуйте, пожалуйста, код и подскажите как его сделать лучше, с учетом выбранного языка программирования.
DAS>Сам код:
DAS>''' DAS>Created on 29.09.2010
DAS>@author: ademidov DAS>'''
DAS>import copy
DAS>class Combination:
Лучше написать class Combination(object):
DAS> def __init__(self, combination, board): DAS> self.orig = copy.copy(combination)
Можно обойтись и без copy — self.orig = combination[:] DAS> self.combination = combination DAS> self.board = board
DAS> def mask(self): DAS> mask = dict() DAS> for i in range(len(self.combination)): DAS> mask[i] = 0
Посмотрите defaultdict
DAS> for pos, element in enumerate(self.combination):
Посмотрите izip DAS> if (element == '1'):
Если бы элементы были True и False, код был бы красивее. Скобки после if не нужны. DAS> for neighbour in self.board.neighbours(pos): DAS> mask[neighbour] = mask[neighbour] + 1
эээ. += 1 DAS> return mask
DAS> def check(self): DAS> for element in self.combination: DAS> if (element == '0'): DAS> return False DAS> return True
Если бы элементы были типа bool, можно было бы заменить на return all(self.combination)
DAS> def calc(self): DAS> for pos, value in self.mask().items(): DAS> if ((value == 1) or (value == 3)):
Можно заменить на value in (1,3) DAS> self.invert(pos)
DAS> def invert(self, pos): DAS> if(self.combination[pos] == '0'): DAS> self.combination[pos] = '1'; DAS> else: DAS> self.combination[pos] = '0'
С булевом получилось бы self.combination[pos] = not self.combination[pos]
DAS> def original(self): DAS> return self.orig
DAS>class Board: DAS> def __init__(self, size): DAS> self.side = size DAS> self.size = size * size
DAS> def posToXY(self, pos): DAS> y = round(pos / self.side) DAS> x = pos — y * self.side DAS> return [x, y]
Лучше возвратить tuple, просто написать return x, y
DAS> def xyToPos(self, x, y): DAS> return y * self.side + x
DAS> def neighbours(self, pos): DAS> result = [] DAS> [x, y] = self.posToXY(pos)
Можно без скобок обойтись DAS> if( x > 0): DAS> result.append(self.xyToPos(x — 1, y)) DAS> if( x < self.side — 1): DAS> result.append(self.xyToPos(x + 1, y)) DAS> if( y > 0): DAS> result.append(self.xyToPos(x, y — 1)) DAS> if( y < self.side — 1): DAS> result.append(self.xyToPos(x, y + 1))
DAS> return result
DAS>class Calculator: DAS> def __init__(self, board): DAS> self.board = board DAS> self.side = board.side DAS> self.size = board.size
DAS> def combinations(self): DAS> result = [] DAS> for n in range(2**self.size): DAS> binVal = bin(n)[2:].zfill(self.size) DAS> result.append(Combination([ x for x in binVal], self.board))
[ x for x in binVal] заменяется на list(binVal) DAS> return result
DAS> def processCombination(self, combination): DAS> combination.calc() DAS> if(combination.check()): DAS> print combination.original()
DAS> def run(self): DAS> for combination in self.combinations(): DAS> self.processCombination(combination)