Определите функцию test_sort, которая берет кортеж, содержащий ссылку функции сортировки, и описание функции в качестве параметра и выполняет эту функцию сортировки с данными предыдущей задачи. Отслеживайте сравнения для каждого набора данных, вычисляйте среднее количество сравнений для списка случайных списков.ТипError: объект 'str' не вызываем-Python
Ссылка на функцию сортировки означает, что вы можете поместить определение функции в переменную, как и любое другое значение, а затем выполнить эту функциональную переменную. Вы также можете передать определение функции в качестве аргумента другой функции, а затем выполнить результирующий параметр как функцию.
это код
def test_sort(function_tuple, a_sorte, a_reverse, a_random):
Number.comparisons = 0
f = function_tuple[0]
f(a_sorte)
x = Number.comparisons
Number.comparisons = 0
f = function_tuple[0]
f(a_reverse)
y = Number.comparisons
Number.comparisons = 0
f = function_tuple[0]
for i in range(len(a_random)):
f(a_random[i])
z = Number.comparisons
print("{0} {1} {2} {3}".format(
function_tuple[1], x, y, z))
return
главная:
import copy
from sorts_array import Sorts
import functions
SORTS = (
('Bubble Sort', Sorts.bubble_sort),
('Insertion Sort', Sorts.insertion_sort),
('Selection Sort', Sorts.selection_sort),
('Merge Sort', Sorts.merge_sort),
('Quick Sort', Sorts.quick_sort),
('Heap Sort', Sorts.heap_sort),
('Shell Sort', Sorts.shell_sort),
('Cocktail Sort', Sorts.cocktail_sort),
('Comb Sort', Sorts.comb_sort),
('Bin. Ins. Sort', Sorts.binary_insert_sort)
)
a_sorte = functions.create_sorted()
a_reverse = functions.create_reversed()
a_random = functions.create_randomly()
for i in range(0, 9):
x = copy.deepcopy(a_sorte)
y = copy.deepcopy(a_reverse)
z = copy.deepcopy(a_random)
functions.test_sort(SORTS[i], x, y, z)
Я получаю ошибку:
Traceback (most recent call last):
functions.test_sort(SORTS[i], x, y, z)
f(a_sorte)
TypeError: 'str' object is not callable
Это то, что я сделал в предыдущей задаче, как упомянуто в вопросе выше:
def create_sorted():
value = []
for i in range(0, SIZE):
n = Number(i)
value.append(copy.deepcopy(n))
return value
def create_reversed():
value = []
for i in range(SIZE, -1, -1):
n = Number(i)
value.append(copy.deepcopy(n))
return value
def create_randomly():
value = []
for i in range(N):
n = Number(random.randint(0, RANGE))
value.append(copy.deepcopy(n))
return value
Да, да; 'f' - это строка, и вы не можете ее назвать. Что именно это должно делать? Возможно, вы хотели установить 'f' на' function_tuple [1] '? –
Daniel: Я пытаюсь решить вопрос, который я опубликовал в начале. Да, я делаю –
Вы передаете кортеж, первая часть - строка, вторая - функция, поэтому вы должны использовать 'f = function_tuple [1]' – sneawo