В своем школьном проекте я сравниваю алгоритмы поиска. Я не получаю ошибку для искомых номеров от 36 до 65. Выше/ниже этого диапазона номеров возникает ошибка (NameError: имя 'trys1' не определено). Я не знаю почему. Я попытался вызвать определение сразу после определения, поскольку оно было решено для аналогичного вопроса, но это не работает. Что я должен делать? Если из диаграммы def удалить try1, ошибка больше не возникает.
import math
from Suche.SucheZahlen import Zahlen
import matplotlib.pyplot as plt
index1 = []
index2 = []
index3 = []
data0 = Zahlen.data
length = len(data0) - 1
def suche(number, x, right, length, data0):
global index1
global trys1
runtime = int(math.log2(length))
for i in range(runtime + 1):
if data0[x] <= number <= data0[right]:
median_index = int((length + x) / 2 - 1)
index1.append(median_index)
if number == data0[median_index]:
print("ja")
trys1 = i + 1
break
if number - 1 > data0[median_index]:
x = median_index + 1
elif number - 1 < data0[median_index]:
length = median_index + 1
elif number - 1 == data0[median_index]:
print("ja")
break
else:
print("nein")
break
def intervallsuche(number, right, left, data0):
global trys2
for i in range(right):
if data0[left] <= number <= data0[right]:
x = left + (number - data0[left]) / (data0[right] - data0[left]) * (right - left)
round = x % 1
if round < 0.5:
x = int(x)
if round >= 0.5:
x = int(x) + 1
index2.append(x)
if data0[x] == number:
trys2 = i + 1
print("ja")
break
if data0[x] > number:
right = right - 1
if data0[x] < number:
left = left + 1
else:
print("nein")
break
def linearesuche(number, x, right, data0):
global trys3
if data0[x] <= number <= data0[right]:
for i in range(right):
if number == data0[x]:
trys3 = i
print("ja")
break
else:
x = x + 1
index3.append(x)
else:
print("nein")
def diagramm():
x1 = list(range(trys1))
x2 = list(range(trys2))
x3 = list(range(trys3))
x4 = [0, length]
y1 = index1
y2 = index2
y3 = index3
y4 = [number, number]
xmin = 0
xmax = trys3
ymin = 0
ymax = data0[100]
plt.axis([xmin, xmax, ymin, ymax])
plt.scatter(x1, y1)
plt.scatter(x2, y2)
plt.scatter(x3, y3)
plt.plot(x4, y4)
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
number = int(input("number:"))
linearesuche(number, 0, length, data0)
intervallsuche(number, length, 0, data0)
suche(number, 0, length, length, data0)
diagramm()
Прежде всего, немного обратной связи по коду: вы почти никогда не должны использовать глобальные переменные для чего-либо. Крайне редко они вам действительно понадобятся, и они вызывают всевозможные проблемы с пространством имен, если вы не будете осторожны - это пример.
Фактическая проблема: вы фактически не создали глобальную переменную с именем trys1
вне функции suche
. Глобальные переменные должны быть определены в глобальном пространстве имен, а затем вызов их внутри функции просто сообщает Python, что вы пытаетесь изменить эту глобальную переменную, а не новую локальную.
Если это сбивает с толку, надеюсь, приведенный ниже пример прояснит ситуацию. Приведенный ниже код вернет 2, потому что вы сообщили функции foo
, что пытаетесь изменить c
, который вы определили выше, а не локальный c
, который вы создали в пределах функции.
c = 1
def foo():
global c
c = c+1
return c
print(foo())
На этот раз приведенный ниже код должен дать тот же NameError
, который вы получили (хотя я не проверял), потому что вы пытаетесь указать функции foo
изменить глобальную переменную c
, но глобальной переменной c
нет.
def foo():
global c
c = c+1
return c
print(foo())
Теперь приведенный ниже код просто изменит переменную c
внутри функции.
def foo():
c = 1
c = c+1
return c
print(foo())
Как вы думаете, где это определяется?