Безумие преобразования Python - PullRequest
7 голосов
/ 05 ноября 2011

У меня проблема с пониманием кода, связанная с python:

def convex_hull(pts):
    """Returns the points on the convex hull of pts in CCW order."""
    for m in (2 ** (2 ** t) for t in xrange(len(pts))):
        hulls = [_graham_scan(pts[i:i + m]) for i in xrange(0, len(pts), m)]
//more code

Я не могу понять, как эти два 'for' должны работать.

К сожалению, ссылка на команду нене показывает такой пример использования, и я не могу точно сказать, действительно ли это означает, что одно для левостороннего назначения другого?

Кроме того, что может означать нижнее назначение?Возвращает ли оператор for значение?!?!

Спасибо и извините за вопрос новичка.

1 Ответ

11 голосов
/ 05 ноября 2011

Чтобы понять этот код, вам сначала нужно понять список пониманий и выражения генератора .Вот пример простого понимания списка:

>>> [str(i) for i in range(5)]
['0', '1', '2', '3', '4']

Как видите, эта строка эквивалентна следующему обычному циклу for:

lst = []
for i in range(5):
    lst.append(str(i))

В основномэто сокращение для создания списков.Выражения генератора аналогичны, за исключением того, что вместо возврата списка они возвращают генератор, который даст те же значения, что и для понимания списка, без фактического создания полного списка.Это более эффективно, когда вы просто собираетесь циклически перебирать значения.

Теперь, когда фон больше не существует, вот как вы можете расширить этот код, используя обычные циклы for:

def convex_hull(pts):
    """Returns the points on the convex hull of pts in CCW order."""
    for t in xrange(len(pts)):
        m = 2 ** (2 ** t)
        hulls = []
        for i in xrange(0, len(pts), m):
            hulls.append(_graham_scan(pts[i:i + m]))
    # more code

Что касается вашего комментария, pts[i:i + m] берет фрагмент списка из индекса i до индекса i + m, вы можете в основном читать фрагменты следующим образом:

[first index to include : first index to exclude : step]

Этот ответ имеет довольно хорошее объяснение с некоторыми примерами.

...