在我的學校專案中,我正在比較搜索演算法。對于 36 到 65 之間的搜索數字,我沒有收到錯誤訊息。高于/低于這個數字范圍會發生錯誤(NameError: name 'trys1' is not defined)。我不知道為什么。我試圖在定義之后直接呼叫 def,因為它已經解決了類似的問題,但它不起作用。我該怎么辦?如果從 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()
uj5u.com熱心網友回復:
首先,一些代碼反饋:您幾乎不應該將全域變數用于任何事情。您實際上需要它們的情況極為罕見,如果您不小心,它們會導致各種命名空間問題——這就是一個例子。
實際問題:您實際上并沒有創建在函式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())
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476501.html
上一篇:洗掉單個字符子字串且不在串列中
