简体   繁体   中英

call function from function python

I am doing a simple calculation for burning calories. I am getting data and variables from users and I have two formulas.

The BMR function works. The tee keeps throwing errors (mostly on cannot call a float) and when it does not I get something like <function a0…> .

def bmr(gender, age, height, weight):
    if gender == "f":
        bmr = 655 + weight*9.6 + height*1.6 + age*4.7
    else:
        bmr = 66 + weight*13.8 + height*5 + age*6.8
    return bmr

def tee (bmr, amount_of_exersice):
    #x = 0
    y = bmr(gender, age, height, weight)
    if amount_of_exersice == 0:
        x = 1.2
    elif 1<= amount_of_exersice <= 2:
        x = 1.375
    elif 3 <= amount_of_exersice <= 5:
        x = 1.55
    else:
        x = 1.725
    z = x * y
    return z

A couple of problems, you're redefining "bmr" and you're not passing the right arguments to second bmr call. Try, as example:

def tee (gender, age, height, weight, amount_of_exersice):
    y = bmr(gender, age, height, weight)
    if amount_of_exersice == 0:
        x = 1.2
    elif 1<= amount_of_exersice <= 2:
        x = 1.375
    elif 3 <= amount_of_exersice <= 5:
        x = 1.55
    else:
        x = 1.725
    z = x * y
    return z

or if you want to define bmr before:

def tee (y, amount_of_exersice):
    if amount_of_exersice == 0:
        x = 1.2
    elif 1<= amount_of_exersice <= 2:
        x = 1.375
    elif 3 <= amount_of_exersice <= 5:
        x = 1.55
    else:
        x = 1.725
    z = x * y
    return z

y_bmr = bmr(gender, age, height, weight)
tee(y_bmr, amount_of_exersice)

When you do

def tee(bmr, amount_of_exersize):

You're redefining the name bmr to point to whatever variable you're passing in - whereas, if you hadn't done that, it would have referred to the function above. This replacement applies so long as you're within the method, and the only real solution is to rename the parameter so that it doesn't conflict:

def tee(something_else, amount_of_exersize):
    y = bmr(gender, age, height, weight)
def validate_user_input(prompt, type_=None, min_=None, max_=None, range_=None):
    if min_ is not None and max_ is not None and max_ < min_:
        raise ValueError("min_ must be less than or equal to max_.")
    while True:
        ui = input(prompt)
        if type_ is not None:
            try:
                ui = type_(ui)
            except ValueError:
                print("Input type must be {0}.".format(type_.__name__))
                continue
        if max_ is not None and ui > max_:
            print("Input must be less than or equal to {0}.".format(max_))
        elif min_ is not None and ui < min_:
            print("Input must be greater than or equal to {0}.".format(min_))
        elif range_ is not None and ui not in range_:
            if isinstance(range_, range):
                template = "Input must be between {0.start} and {0.stop}."
                print(template.format(range_))
            else:
                template = "Input must be {0}."
                if len(range_) == 1:
                    print(template.format(*range_))
                else:
                    print(template.format(" or ".join((", ".join(map(str,
                                                                     range_[:-1])),
                                                       str(range_[-1])))))
        else:
            return ui


def bmr(gender, age, height, weight):
    if gender == "f":
        bmr = 655 + weight*9.6 + height*1.6 + age*4.7
    else:
        bmr = 66 + weight*13.8 + height*5 + age*6.8
    return bmr

def tee (gender, age, height, weight, amount_of_exersice):
    y = bmr(gender, age, height, weight)
    if amount_of_exersice == 0:
        x = 1.2
    elif 1<= amount_of_exersice <= 2:
        x = 1.375
    elif 3 <= amount_of_exersice <= 5:
        x = 1.55
    else:
        x = 1.725
    z = x * y
    return z

## user info ##
gender = validate_user_input("Please enter your gender (F -Female / M- Male): ", str.lower, range_=("f","m"))
age = validate_user_input("Please enter your age: ", int, 1, 110)
height = validate_user_input("Please enter your height in cm: ", int, 130, 230)
weight = validate_user_input("Please enter your weight in kg: ", float, 20, 400)
amount_of_exersice = validate_user_input("Please enter the amount of days you engage in physical activity per week: ", int, 0, 7)

calc_bmr = bmr(gender, age, height, weight)
calc_tee = tee(gender, age, height, weight, amount_of_exersice)
print("Your Basal Metabolic Rate is ", calc_bmr)
print("Your daily calories burn is ", calc_tee)

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