Python :: перехват исключений для обхода списка - PullRequest
0 голосов
/ 25 июня 2011

Вот код, часть решения проблемы 11 в Euler Project :

sum_d = 0
j = 0
while j < 20:
    i = 0
    while i < 20:
        try:
            sum_d = grid[j][i] * grid[j+1][i+1] * grid[j+2][i+2] * grid[j+3][i+3]
            if sum_d > result:
                result = sum_d
        except IndexError:
            pass
        i += 1
    j += 1

Мой вопрос: считается ли отлов этих исключений запахом кода? Я вижу, что будет сложнее отлаживать такой код (скажем, я случайно зациклил более 19 элементов вместо 20, это будет сложнее отследить), но это намного элегантнее, чем, скажем, кодирование i < (GRID_WIDTH - NUM_ITEMS_IN_PRODUCT) в цикле проверки.

P.S. Я уже решил проблему, я говорю о стиле кода

Ответы [ 2 ]

7 голосов
/ 25 июня 2011

Спойлер: Вот часть моего решения для проблемы 11 .

for x in range(0,16):
    for y in range(0,16):
        prod = p[y][x] * p[y+1][x+1] * p[y+2][x+2] * p[y+3][x+3]
        m = max(m, prod)

Использование исключений вместо базовых структур управления - это всегда плохая идея. На этот раз вы можете сойти с циклом по цифрам 0..15!

Кроме того, если вы перемножаете вещи, вы получаете продукт , а не сумму . ;)

1 голос
/ 25 июня 2011

Вы могли бы по крайней мере сделать это

except IndexError:
    break

Во всяком случае, да, я считаю, что это запах кода, и нет, он не яснее, чем

for i in range(gridsize - num_items_in_product):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...