Лучший способ запустить функцию в основной функции, когда один из параметров не находится в области видимости - PullRequest
0 голосов
/ 17 апреля 2020

По сути, мой мозг сейчас не работает, и я не могу найти лучший способ устранить эту ошибку. builtins.NameError: name 'numIters' is not defined Я знаю, что эта проблема в том, что numIters не определен в своей области, но я не знаю лучшего решения, чтобы это исправить.

Вот основная часть моего кода

import random
alg = int(input("Select the sorting algorithm \n 1 - linear search \n 2 - binary search \nEnter Choice: "))
n = int(input("Choose the size of the list: ")) 
def main():
    createList(n,alg)
    print(runTest(values,n,alg))
    printResults(alg,n,numIters)
    #print(linearSearch(values,2))
    #print(binarySearch(values, 2))


def createList(n,alg):
    global values
    values = []
    random.seed(1456)
    for j in range(n):
        values.append(random.randint(0, 2*n))

    while len(values) == n:
        if alg == 2:
            values.sort()
            print(values)
            return values
        elif alg == 1:
            print(values)
            return values

def linearSearch(values, target):
    numIters = 0
    for i in range(len(values)):
        numIters = numIters + 1
        if values[i] == target:
            return numIters
    return -1
def binarySearch(values, target):
    numIters = 0
    start = 0
    high = len(values) - 1
    while start <= high:

        middle = (start + high)//2

        if values[middle] == target:

            numIters = numIters + 1
            return numIters
        elif values[middle] > target:
            numIters = numIters + 1
            high = middle - 1
        else:
            numIters = numIters + 1
            start = middle + 1

    return -1
def runTest(values,n,alg):
    if alg == 2:
        count = 0
        for j in range(n * 2):
            count = count + 1
            tgt = random.randint(0, 2*n)
            binarySearch(values, tgt)
        return count
    elif alg == 1:
        count = 0
        for j in range(n * 2):
            count = count + 1
            tgt = random.randint(0, 2*n)
            linearSearch(values, tgt)
        return count

def printResults(alg, n, numIters):
    avgIter = n / numIters
    if alg == 2:
        algType = Binary
    if alg == 1:
        algType = Linear
    print("Results \n n = %d \n %s = %f.2 " % (n,algtype,avgIter))

main()

Заранее благодарю за любую помощь, поскольку я все еще пытаюсь узнать и понять, как работает python в целом.

1 Ответ

0 голосов
/ 17 апреля 2020

Вам необходимо вернуть numIters, чтобы вы могли передать его следующей функции. Похоже, что в настоящее время он возвращается с binarySearch и linearSearch до runTest, но он там отбрасывается; просто всплыть так (я собираюсь добавить аннотации типов и комментарии, чтобы помочь мне отслеживать, что происходит):

from typing import List, Tuple

def runTest(values: List[int], n: int, alg: int) -> Tuple[int, int]:
    """Returns count, numIters"""
    numIters = 0  # default value in case n is so small we don't iterate
    if alg == 2:
        count = 0
        for j in range(n * 2):
            count = count + 1
            tgt = random.randint(0, 2*n)
            numIters = binarySearch(values, tgt)
        return count, numIters
    elif alg == 1:
        count = 0
        for j in range(n * 2):
            count = count + 1
            tgt = random.randint(0, 2*n)
            numIters = linearSearch(values, tgt)
        return count, numIters
    raise ValueError("alg needs to be 1 or 2!")

Теперь в вашем main() вы можете сделать:

def main():
    createList(n, alg)
    count, numIters = runTest(values, n, alg)
    print(count)
    printResults(alg, n, numIters)
...