2016-03-21 3 views
0

Определите функцию 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 
+0

Да, да; 'f' - это строка, и вы не можете ее назвать. Что именно это должно делать? Возможно, вы хотели установить 'f' на' function_tuple [1] '? –

+0

Daniel: Я пытаюсь решить вопрос, который я опубликовал в начале. Да, я делаю –

+2

Вы передаете кортеж, первая часть - строка, вторая - функция, поэтому вы должны использовать 'f = function_tuple [1]' – sneawo

ответ

1

Define a function test_sort that takes a tuple containing a sort function reference and a function description as a parameter

Следуя этим инструкциям, ваша логика в порядке, но ваш кортеж не является. Сначала вы указываете описание.

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) 
) 

Таким образом, ваша ошибка начинается с

f = function_tuple[0] 
f(a_sorte) # TypeError: 'str' object is not callable 

Поскольку f является строка (описание функции).

Я также вижу, у вас есть

print("{0}  {1}   {2}  {3}".format(
    function_tuple[1], x, y, z)) 

Что будет печатать функции объекта (<function Sorts.bubble_sort at 0x1029beae8>), а не строка описания.

Итак, у вас есть два варианта.

  1. Переключить порядок всех кортежей. I.e (Sorts.bubble_sort, 'Bubble Sort') и сохраните другой код так же
  2. Используйте функцию f = function_tuple[1] для функции, которую вы можете вызвать, и function_tuple[0] в качестве строки для печати.

Кроме того, почему a_random лечить иначе, чем другие? Просто делайте то же самое, что и в других списках.

Number.comparisons = 0 
f = function_tuple[0] 
f(a_random) 
z = Number.comparisons 
+0

Большое вам спасибо, знаю, что это ясно для меня и работает. –

Смежные вопросы