Python:“列表”对象不可调用

时间:2021-06-09 07:56:15

标签: python sorting encapsulation

有如下代码比较冒泡排序和快速排序的时间:

def makeArray(groesseArray, stellenZahlen):
    array = groesseArray * [None]
    for i in range(0,groesseArray):
        array[i] = randint(0,10**stellenZahlen)
    return array

制作数组

def bubble(arr):
    n = len(arr)
    for i in range(n - 1):
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                #print(arr)

冒泡排序算法

def quick(arr):
   n = len(arr)
   high = []
   low = []
   if n <= 1:
       return arr
   else:
       pivot = arr.pop()
   for i in arr:
       if i > pivot:
           high.append(i)
       else:
           low.append(i)
   return quick(low) + [pivot] + quick(high)

快速排序算法

def timer(func(arr)):
    start = time.time()
    func(arr)
    end = time.time()
    print(end - start)

定时器函数来测量算法的时间

testArray = makeArray(500, 5)

timer(quicksort.quick(testArray))
timer(bubblesort.bubble(testArray))

这是扔

Traceback (most recent call last):
  File "C:\Users\user\PycharmProjects\Algo\compare.py", line 30, in <module>
    timer(quicksort.quick(testArray))
  File "C:\Users\user\PycharmProjects\Algo\compare.py", line 14, in timer
    func(arr)
TypeError: 'list' object is not callable             

如何将带有列表的函数传递给计时器函数?我试过 *args,**kwargs 希望它是解决方案,但被抛出同样的错误

提前致谢

1 个答案:

答案 0 :(得分:2)

将您的计时器功能更改为

def timer(func, arr):
    start = time.time()
    func(arr)
    end = time.time()
    print(end - start)

并按如下方式调用它:

timer(quicksort.quick, testArray)
timer(bubblesort.bubble, testArray)

在您的代码中,您在调用 timer 时评估排序函数。结果是一个列表(从排序函数返回),然后传递给 timer。因此出现错误:您试图将该列表用作 timer 中的函数。

在上面的代码中,函数和数据作为两个单独的参数传递。函数是 Python 中的一等对象,可以像任何变量一样传递给其他函数。