简体   繁体   中英

Confused about return in Functions

Ok, I'm having trouble with my very first program. If you look down to the two functions, what I want is for if the "cur" value is NOT between the min and max, for it to change the Target variable to "0" so I can use it latter in the program... But it doesn't seem to do it... Am I using "return" wrong? Basically, the functions need to turn target from 1 to 0 , so that ri_fit changes to 0, so that my final if thingys trigger...

Sorry for the terrible code, I've only just begun!

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

When you assign to target inside one of your functions, you are replacing the value of the parameter named target in there, and not touching the global one. So if you want your functions to assign to the global target, you can't define a new target in the function.

But if you don't want to change your functions, you can use the fact that return returns a value (which you seem to understand, since you print it). If instead of printing it, you assigned it to target, then you'd get the value you want where you want it, and your function will work no matter where the value computed is ultimately destined to go.

return returns a value from a function. You can store the result in a variable.

In your code, you're trying to pass target as a parameter and then set its value, but since integers are immutable, you won't be able to change target from within your function.

In your case, I'd change your code to something like this:

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

Better yet, use a boolean:

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

I believe the issue lies in that you are passing target as a value, not as a reference. Within your functions, you should drop the target parameter, and instead write:

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

This way, the interpreter identifies that you're trying to set the global target variable, and not a local instance.

Otherwise, you could do something like:

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

See this related question.

First, I guess you need () after close :

target.close()

Second: in_range and ex_range are exactly the same!

Third, anyway it is OK and so runs correctly:

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

output:

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

So, it may be the arguments you are passing to functions are not OK ! Check if you are reading them correctly from file.

Finally, avoid using min , max as arguments as they are built-in Python functions.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM