Pull to refresh
3
0
Михаил @redlinelm

Пользователь

Send message
А вот что у меня получилось на Python…

import itertools

class Node:
    def __init__(self, d, l=None, r=None):
        self.data = d
        self.left = l
        self.right = r
        self.next = None

    def __str__(self):
        return 'Node: {} Next: {}'.format(self.data, self.next)

def link_tree(tree_root):
    def link_layer(roots):
        items_layer = filter(None, itertools.chain(*[(root.left, root.right) for root in roots]))

        items_layer.append(None)

        for (cur, n) in zip(items_layer[:-1], items_layer[1:]):
            cur.next = n

        return items_layer[:-1]

    cur_roots = [Node(None, tree_root)]
    while cur_roots:
        cur_roots = link_layer(cur_roots)

def prin_tree(root):
    if root:
        print root
        prin_tree(root.left)
        prin_tree(root.right)

tree = Node(1, Node(2, Node(4)), Node(3, Node(6), Node(7)))
link_tree(tree)
prin_tree(tree)
Хорошо… Но задача написать не одну функцию, а четыре. Как я упомянул в своем посте, сначала были написанны все 4 функции подобным образом. Когда перед тобой 4 почти одинаковые функции, а различия в состоят в двух строках кода, появляется естественное желание выделить общее. Такой код намного проще сопровождать, Что бы заменить assert на if(как вы предлагаете ), например, мне нужно одно изменение, а не в четыре. Шаблоны проектирования придуманы не мной, и не один я ими пользуюсь… Так что может ваш код и более «питонистый», но с точки зрения вопроса проектирования я вижу большой минус.
Господа критики, критика должна быть конструктивной. Выражения типа «код автора выглядит плохо. На Python так не пишут», «Ваш код просто ужасен» и т.д. без конкретных замечаний и реализаций смотрятся странно. Критикуя-предлагай.
А можно продолжить мысль и объяснить почему?
Если взглянуть на itertools.combinations(iterable, r) то там тоже присутствует однабуквенная переменная…
То есть ваши претезии только к форме, а не к содержанию? Насчет названия переменнных, что такое k, n должно быть понятно из таблицы над кодом(это стандартные обозначения в комбинаторике), а s для стороки и с для символа тоже не редкость
Хотел бы взглянуть на просто прекрасный код…
Я уже написал о изобретения велосипеда, предвосхищая ваш коментарий. Зачем комениторовать не полность прочитанный текст…

Information

Rating
Does not participate
Location
Нижний Новгород, Нижегородская обл., Россия
Date of birth
Registered
Activity