Я определил функцию как таковую:
def quicksort(points):
if len(points) < 2: return points
smaller,equal,larger = [], [], []
pivot_angle = find_polar_angle(random.randint(0, len(points) - 1))
for pt in points:
pt_angle = find_polar_angle(pt)
if pt_angle < pivot_angle:
smaller.append(pt)
elif pt_angle == pivot_angle:
equal.append(pt)
else:
larger.append(pt)
return quicksort(smaller) + sorted(equal, key = find_dist) + quicksort(larger)
Теперь я хочу изменить свой код - кстати, это реализация алгоритма сканирования Грэма - на объектно-ориентированный код. Поэтому я пошел дальше и объявил класс в файле MyClasses.py:
from MyFunctions import find_anchor, find_polar_angle, find_dist, find_det, quicksort, graham_scan
class Cluster:
def __init__(self):
self.members = []
self.hull = []
self.anchor = None
self.find_anchor = find_anchor
self.find_polar_angle = find_polar_angle
self.find_dist = find_dist
self.find_det = find_det
self.quicksort = quicksort
self.graham_scan = graham_scan
Но, конечно, я должен изменить и свои функции. Я не хочу перечислять здесь все функции, поэтому остановлюсь на функции quicksort
в качестве примера. Именно здесь я много борюсь, так как не знаю синтаксис python достаточно хорошо, чтобы быть уверенным в том, что я здесь делаю. Это моя исправленная форма quicksort
:
def quicksort(self, points):
if len(points) < 2: return points
smaller,equal,larger = [], [], []
pivot_angle = self.find_polar_angle(self, random.randint(0, len(self.members) - 1))
for pt in points:
pt_angle = self.find_polar_angle(self, pt)
if pt_angle < pivot_angle:
smaller.append(pt)
elif pt_angle == pivot_angle:
equal.append(pt)
else:
larger.append(pt)
return self.quicksort(self, smaller) + sorted(self, equal, key = self.find_dist) + self.quicksort(self, larger)
Вот в чем дело: эта функция рекурсивная! Поэтому мне нужно принять smaller, equal and larger
в качестве аргументов. Позже другая функция graham_scan
будет вызывать эту функцию так:
self.members = self.quicksort(self, self.members)
Я знаю, что здесь, вероятно, много ошибок. Вот почему я спрашиваю: является ли это последнее выражение допустимым выражением? Я имею в виду, что я изменяю переменную класса (self.members
), но я делаю это не путем ее непосредственного изменения, а путем присвоения ей возвращаемого значения quicksort
. В любом случае, помощь очень ценится!