簡體   English   中英

對函數的返回感到困惑

[英]Confused about return in Functions

好的,我在第一個程序上遇到了麻煩。 如果您不看這兩個函數,那么我想要的是如果“ cur”值不在最小值和最大值之間,因為它將“目標”變量更改為“ 0”,因此我可以在程序中使用它。 。但這似乎不可行...我使用“ return”錯誤嗎? 基本上,函數需要把target10 ,這樣ri_fit變為0,讓我最后if thingys觸發...

對不起,代碼不好,我才剛剛開始!

#Clearance calculator
#clearances are in clearances.txt

targets = open("clearances.txt", "r")
lines = targets.readlines()   #get target clearances from file

in_min_target = float(lines[2])     #minimum intake clearance
in_max_target = float(lines[4])     #maximum intake clearance

ex_min_target = float(lines[8])    #miminum exhaust clearances
ex_max_target = float(lines[10])   #maximum exhaust clearances
targets.close

target_intake = (in_min_target + in_max_target) / 2     #find the ideal intake
target_exhaust = (ex_min_target + ex_max_target) / 2    #find the ideal exhaust

print "Intake Min: ", in_min_target
print "Intake Max: ", in_max_target
print "Exhaust Min: ", ex_min_target
print "Exhaust Max: ", ex_max_target
print """Target intake: %r
Target Exhaust: %r""" % (target_intake, target_exhaust)

print""
print "Enter current RIGHT side Intake clearance"
cur_r_in = float(raw_input(">"))
print ""
print "Enter current RIGHT side Exhaust clearance"
cur_r_ex = float(raw_input(">"))
print ""
print "Enter current LEFT side Intake clearance"
cur_l_in = float(raw_input(">"))
print ""
print "Enter current LEFT side Exhaust clearance"
cur_l_ex = float(raw_input(">"))


target = 1

def in_range(min, max, cur, valve, target):  #figures if intake valves are correct
    if min <= cur <= max:
        print "%r is in range." % valve
        target=1

    else:
        print "%r is OUT OF RANGE." %valve
        target=0

    return target

def ex_range(min, max, cur, valve, target):   #figures if exhaust valves are correct
    if min <= cur <= max:
        print "%r is in range." % valve
        target=1

    else:
        print "%r is OUT OF RANGE." %valve
        target=0
    return target


ri_fit = 1
re_fit = 1        #Assumes all valves are right, until further notice...
li_fit = 1
le_fit = 1

valve = "Right Intake"
print in_range(in_min_target, in_max_target, cur_r_in, valve, target)
print target
if target == 0:
    ri_fit = 0


print ""

valve = "Right Exhaust"
print ex_range(ex_min_target, ex_max_target, cur_r_ex, valve, target)

print ""

valve = "Left Intake"
print in_range(in_min_target, in_max_target, cur_l_in, valve, target)

print ""

valve = "Left Exhaust"
print ex_range(ex_min_target, ex_max_target, cur_l_ex, valve, target)

print ri_fit

if ri_fit==0:
    print "Right intake is out of range."
    print "Enter current right intake shim size."
    ri_cur_shim = int(raw_input(">"))

if re_fit==0:
    print "Right exhaust is out of range."
    print "Enter current right exhaust shim size."
    re_cur_shim = int(raw_input(">"))

if li_fit==0:
    print "Right intake is out of range."
    print "Enter current right intake shim size."
    li_cur_shim = int(raw_input(">"))

if le_fit==0:
    print "Right exhaust is out of range."
    print "Enter current right exhaust shim size."
    le_cur_shim = int(raw_input(">"))

在其中一個函數中分配給target時,您將在其中替換名為target的參數的值,而不接觸全局函數。 因此,如果要將函數分配給全局目標,則無法在函數中定義新目標。

但是,如果您不想更改函數,則可以使用return返回一個值的事實(由於打印了它,您似乎已經明白了)。 如果不是將其打印出來,而是將其分配給目標,那么您將在所需的位置獲得所需的值,並且無論最終將計算的值放在何處,函數都將起作用。

return從函數返回一個值。 您可以將結果存儲在變量中。

在您的代碼中,您嘗試將target作為參數傳遞,然后設置其值,但是由於整數是不可變的,因此您將無法在函數內更改target

就您而言,我會將您的代碼更改為以下形式:

def ex_range(min, max, cur, valve):  # You don't need `target` here
    if min <= cur <= max:
        print "%r is in range." % valve
        target=1

    else:
        print "%r is OUT OF RANGE." %valve
        target=0
    return target

target = ex_range(...)  # Store the results in a variable

更好的是,使用布爾值:

def ex_range(min, max, cur, valve):  # You don't need `target` here
    if min <= cur <= max:
        print "%r is in range." % valve
        return True

    else:
        print "%r is OUT OF RANGE." %valve
        return False

我認為問題在於您將target作為一種價值而不是作為參考傳遞。 在函數中,應刪除target參數,而應編寫:

def ex_range(min, max, cur, valve):
    global target
    # ...
    # rest of your code

這樣,解釋器會識別出您正在嘗試設置全局target變量,而不是本地實例。

否則,您可以執行以下操作:

def in_range(min, max, cur, valve):  #figures if intake valves are correct
    if min <= cur <= max:
        print "%r is in range." % valve
        return 1

    else:
        print "%r is OUT OF RANGE." %valve
        return 0

target = in_range(...) # fill in args
print target

請參閱相關問題。

首先,我估計close后需要()

target.close()

第二: in_rangeex_range完全相同!

第三,無論如何都可以,因此可以正常運行:

in_range(1,10,7,'Right Intake',1)
in_range(1,10,17,'Right Intake',1)

輸出:

>>> 'Right Intake' is in range.
>>> 'Right Intake' is OUT OF RANGE.

因此,可能是您傳遞給函數的參數不正確 檢查您是否從文件中正確讀取了它們。

最后,避免將minmax用作參數,因為它們是built-in Python函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM