Чтобы понять этот код, вам сначала нужно понять список пониманий и выражения генератора .Вот пример простого понимания списка:
>>> [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]
Этот ответ имеет довольно хорошее объяснение с некоторыми примерами.