Re: [python][покритикуйте код] Задача Да Винчи
От: Senyai Россия http://www.arseniy.net
Дата: 29.09.10 12:48
Оценка: 2 (1) +1
Здравствуйте, 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)


DAS>c = Calculator(Board(2))

DAS>c.run()
Не бойтесь совершенства. Вам его не достичь. © Сальвадор Дали
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.