I'm new to programming in general and even newer to python. I'm only a couple of days into it. I'm working on a problem that I know is simple, but the more I tinker with it, the worse it seems to get.
essentially what I am trying to do is create a variable from a conditional in function a that I can pass to other functions. I've been trying to do this to create like character creation screens in the world's simplest RPG. However, as simple as the game is, I quickly got in over my head. I decided to keep the spirit of what I'm after, but with an easier example.
Now, I'm simply trying to put a meal together.
def entree():
options = "1) steak\n2) burger"
print(options)
entree_selection = int(input("Pick one."))
if entree_selection == 1:
entree_choice = "steak"
side_dish()
elif entree_selection == 2:
entree_choice = "burger"
side_dish()
def side_dish():
entree_choice = entree()
print(f"You chose {entree_choice}.")
print("Now choose your side.")
options = "1) baked potato\n2) green beans"
print(options)
side_selection = int(input("Pick one."))
if side_selection == 1:
side_choice = "baked potato"
dessert()
elif side_selection == 2:
side_choice = "green beans"
dessert()
def dessert():
entree_choice = entree()
side_choice = side_dish()
print(f"So far we have {entree_choice} and {side_choice}.")
print("How about dessert?")
options = "1) cake\n2) ice cream"
print(options)
dessert_selection = int(input("Pick one."))
if side_selection == 1:
dessert_choice = "cake"
your_meal()
elif side_selection == 2:
dessert_choice = "ice cream"
your_meal()
def your_meal():
entree_choice = entree()
side_choice = side_dish()
dessert_choice = dessert()
print(
f'You will be having {entree_choice} with {side_choice} and {dessert_choice}')
entree()
side_dish()
dessert()
your_meal()
The issue for me is that function a is repeating over and over without ever running function b
To be honest, I've lost track of all the things I have tried. I've tried at least 10 things from YouTube and at least the same number from here.
CodePudding user response:
Function A is repeating because at the end of Function A, you call Function B, and at the beginning of Function B, you call Function A. Which restarts your loop.
Function B is always running, it just can't ever finish because you have requested that Function B always reruns Function A.
In order to not repeat, you cannot request side_dish
to rerun entree
.
def side_dish():
entree_choice = entree() # this is the problem
print(f"You chose {entree_choice}.")
print("Now choose your side.")
Instead, pass the entree_choice
as a variable into your side_dish
.
def side_dish(entree_choice):
print(f"You chose {entree_choice}.")
print("Now choose your side.")
To continue the example, you would then create a dessert function which takes in both of your previous choices.
def dessert(entree_choice, side_choice):
print(f"So far we have {entree_choice} and {side_choice}.")
print("How about dessert?")
Which naturally gets us to the final function:
def your_meal(entree_choice, side_choice, dessert_choice):
print(
f'You will be having {entree_choice} with {side_choice} and {dessert_choice}')
With all of that being said, I would recommend a slightly different implementation. Basically, have a "controller". This thing controls all of the logic at one single level.
entree_choice = entree()
side_choice = side_dish()
dessert_choice = dessert()
print(f'You will be having {entree_choice} with {side_choice} and {dessert_choice}')
In order to accomplish this, two things:
- Modify your underlying
entree
function to not ask about the side choice. Instead let the controller ask. - Return the entree that they chose.
def entree():
options = "1) steak\n2) burger"
print(options)
entree_selection = int(input("Pick one."))
if entree_selection == 1:
entree_choice = "steak"
return entree_choice
elif entree_selection == 2:
entree_choice = "burger"
return entree_choice
CodePudding user response:
What you're missing is the idea of the 'return value' of a function. Start by breaking your task into discrete units. Using your example of your_meal
, the program will run the function entree()
first and set the result of that function to the variable entree_choice. But for it to work, the function entree
needs to have one (or several) return 'steak'
or similar type statements. This is how the different parts of your program "communicate" with each other: by way of arguments and return values from functions.
Also note that if you call entree, and entree then calls side_dish and side_dish then calls entree, then the program will never stop looping (which is the problem you've described) as happening.