Python: декоратор для подсчета свопов в алгоритмах сортировкиPython

Программы на Python
Ответить
Anonymous
 Python: декоратор для подсчета свопов в алгоритмах сортировки

Сообщение Anonymous »

Я хочу написать декоратор, который будет подсчитывать количество свопов в алгоритме сортировки. Я создал функцию swap для замены чисел и декоратор, который подсчитывает каждый вызов этой функции. Проблемы, с которыми я столкнулся, заключаются в следующем: когда я подсчитываю количество вызовов для нескольких алгоритмов, он подсчитывает «обмены» для каждого из них и суммирует их. Другая проблема заключается в том, что каждый «своп» печатается в консоли. Ниже я привожу декоратор, обмен и пример алгоритма.
Декоратор:
def swapCounter(func):
def counter(*args, **kwargs):
counter.calls += 1
print(f"Swaps {counter.calls}")
return func(*args, **kwargs)
counter.calls = 0
return counter

Обмен:
def swap(arr, i, j):
arr, arr[j] = arr[j], arr

Пример алгоритма сортировки:
def bubbleSort(arr):
for i in range(len(arr)):
for j in range(0, len(arr)-i-1):
if arr[j] > arr[j+1]:
swap(arr, j, j+1)

return arr

Я пробовал добавлять флаги в декоратор и в функцию подкачки. При обмене флаг будет установлен в конце, что позволит декоратору выполнить сброс в нужный момент. Однако это не дало никаких результатов: AttributeError: объект «функция» не имеет атрибута «вызовы»
def swapCounter(func):
def counter(*args, **kwargs):
counter.calls+=1
if kwargs.get("flag")==True:
print(f"Swaps {counter.calls}")
counter.calls = 0
return func(*args, **kwargs)
return counter

def swap(arr=None, i=None, j=None, flag=None):
arr, arr[j] = arr[j], arr

def bubbleSort(arr):
for i in range(len(arr)):
for j in range(0, len(arr)-i-1):
if arr[j] > arr[j+1]:
swap(arr, j, j+1)

swap(True)


Подробнее здесь: https://stackoverflow.com/questions/791 ... algorithms
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»