1

好的,我的第一个程序有问题。如果你看下这两个函数,我想要的是如果“cur”值不在最小值和最大值之间,它将目标变量更改为“0”,这样我就可以在程序中使用它了。 .但它似乎没有这样做......我使用“return”错误吗?基本上,函数需要target1变为0,以便ri_fit更改为 0,以便我的最后一个if事情触发......

对不起,糟糕的代码,我才刚刚开始!

#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(">"))
4

4 回答 4

2

当您在其中一个函数中分配给目标时,您正在替换其中名为目标的参数的值,而不是触及全局参数的值。所以如果你想让你的函数分配给全局目标,你不能在函数中定义一个新的目标。

但是如果你不想改变你的函数,你可以使用 return 返回一个值的事实(你似乎理解,因为你打印它)。如果不是打印它,而是将其分配给目标,那么您将在所需的位置获得所需的值,并且无论计算出的值最终注定要去哪里,您的函数都将起作用。

于 2012-12-28T02:12:04.583 回答
1

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
于 2012-12-28T02:09:08.033 回答
1

我认为问题在于您将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

请参阅相关问题。

于 2012-12-28T02:15:07.377 回答
1

首先,我想你需要()after 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.

因此,可能是您传递给函数的参数正确!检查您是否从文件中正确读取它们。

最后,避免使用min,max作为参数,因为它们是built-inPython 函数。

于 2012-12-28T02:23:18.233 回答