2016-03-21 23 views
0

Definieren Sie eine Funktion test_sort, die ein Tupel mit einer Sortierfunktionsreferenz und einer Funktionsbeschreibung als Parameter verwendet und diese Sortierfunktion mit den Daten der vorherigen Task ausführt. Verfolgen Sie die Vergleiche für jeden Datensatz, berechnen Sie die durchschnittliche Anzahl der Vergleiche für die Liste der Zufallslisten.TypeError: 'str' -Objekt ist nicht aufrufbar-Python

Der Verweis auf die Sortierfunktion bedeutet nur, dass Sie eine Funktionsdefinition genau wie jeden anderen Wert in eine Variable einfügen und diese Funktionsvariable dann ausführen können. Sie können eine Funktionsdefinition auch als Argument an eine andere Funktion übergeben und den resultierenden Parameter dann als Funktion ausführen.

Dies ist der Code

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 

der Haupt:

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) 

Der Fehler erhalte ich:

Traceback (most recent call last): 
functions.test_sort(SORTS[i], x, y, z) 
     f(a_sorte) 
    TypeError: 'str' object is not callable 

Das, was ich in der vorherigen Aufgabe tat, wie in der Frage erwähnt oben:

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

Nun ja; 'f' ist eine Zeichenfolge und Sie können sie nicht aufrufen. Was genau soll das tun? Wolltest du vielleicht 'f' auf' function_tuple [1] 'setzen? –

+0

Daniel: Ich versuche die eingangs gestellte Frage zu lösen. Ja, ich tue –

+2

Sie übergeben Tupel, der erste Teil ist String, der zweite ist Funktion, also sollten Sie 'f = function_tuple [1]' – sneawo

Antwort

1

Nach diesen Anweisungen ist Ihre Logik in Ordnung, aber Ihr Tupel ist nicht. Sie legen die Beschreibung zuerst.

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

Daher beginnt Ihre Fehler mit

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

Da f eine Zeichenfolge (die Beschreibung der Funktion) ist.

Ich sehe, Sie haben auch

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

, die die Funktion Objekt gedruckt wird (<function Sorts.bubble_sort at 0x1029beae8>), nicht die Beschreibung String.

Sie haben also zwei Möglichkeiten.

  1. Die Reihenfolge aller Tupel umschalten. Ie. (Sorts.bubble_sort, 'Bubble Sort') und behalten Sie den anderen Code der gleiche
  2. Verwenden Sie f = function_tuple[1] für die Funktion, die Sie anrufen können und function_tuple[0] als die Zeichenfolge zu drucken.

Auch, warum ist a_random anders behandelt als die anderen? Tun Sie das Gleiche wie die anderen Listen.

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

vielen dank, wissen, dass es mir klar ist und funktioniert. –

Verwandte Themen