Я новичок в программировании в целом и еще новее в python. Я всего пару дней в нем. Я работаю над проблемой, которая, как я знаю, проста, но чем больше я с ней возюсь, тем хуже становится.
по сути, я пытаюсь создать переменную из условной функции a, которую я могу передать другим функциям. Я пытался сделать это, чтобы создать похожие экраны создания персонажей в самой простой в мире ролевой игре. Однако, какой бы простой ни была игра, я быстро освоился. Я решил сохранить дух того, чем я занимаюсь, но на более простом примере.
Сейчас я просто пытаюсь приготовить еду.
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()
Проблема для меня в том, что функция повторяется снова и снова без запуска функции b
Честно говоря, я потерял счет всему, что пробовал. Я пробовал по крайней мере 10 вещей с YouTube и по крайней мере столько же отсюда.
Кроме того, вы также повторно запускаете функцию верхнего уровня внутри side_dish
. Если бы вы «проходили» свою программу, вы бы попросили их блюдо, а затем получили бы их ответ. Большой! Затем вы бы попросили их гарнир, но затем буквально попросили бы их основное блюдо очередной раз. Вам нужно сделать это только один раз.
@spen.smith, можете ли вы указать, где разместить возвраты, потому что я их использовал, и это совсем не изменило мои результаты. Очевидно, я использую их не в том месте или не в том направлении. Помните, я программирую здесь с опытом работы в несколько часов. Что касается комментария «повторный запуск вашей функции верхнего уровня внутри side_dish», я предполагаю, что вы имеете в виду строку «entree_choice = entree()», которая мне показалась странной, но я видел, как это делают несколько человек на YouTube. Если я не укажу это там, как side_dish получит «entree_choice» из функции entree?
Привет @Jace, я перефразировал ниже. Дайте мне знать, если это поможет.
@spen.smith движется в правильном направлении и немного повышает уверенность, потому что это своего рода поезд, на котором я ехал, прежде чем YouTube повел меня по другому пути. Проблема, с которой я столкнулся и до сих пор сталкиваюсь с вашим выбором, заключается в попытке перейти к нескольким функциям или получить функцию для получения из нескольких других функций.
Эй, Джейс, здесь две отдельные проблемы. По сути, вы вызываете функцию A из функции B. Это создает бесконечный цикл. Вторая проблема заключается в том, что вы не являетесь возвращение чем-то из своих вызовов функций. Я написал пример внизу, чтобы помочь с этим.
Чего вам не хватает, так это идеи «возвращаемого значения» функции. Начните с разбиения задачи на отдельные блоки. Используя ваш пример your_meal
, программа сначала запустит функцию entree()
и установит результат этой функции в переменную entree_choice. Но чтобы это работало, функция entree
должна иметь один (или несколько) return 'steak'
или похожий оператор типа. Именно так разные части вашей программы «общаются» друг с другом: посредством аргументов и возвращаемых функций функций.
Также обратите внимание, что если вы вызываете entree, а entree затем вызывает side_dish, а side_dish затем вызывает entree, то программа никогда не прекратит цикл (это проблема, которую вы описали).
Функция A повторяется, потому что в конце функции A вы вызываете функцию B, а в начале функции B вы вызываете функцию A. Это перезапускает ваш цикл.
Функция B всегда работает, она просто не может завершиться, потому что вы запросили, чтобы функция B всегда перезапускала функцию A.
Чтобы не повторяться, вы не можете запросить side_dish
повтор entree
.
def side_dish():
entree_choice = entree() # this is the problem
print(f"You chose {entree_choice}.")
print("Now choose your side.")
Вместо этого передайте entree_choice
как переменную в свой side_dish
.
def side_dish(entree_choice):
print(f"You chose {entree_choice}.")
print("Now choose your side.")
Чтобы продолжить пример, вы должны создать функцию десерта, которая принимает оба ваших предыдущих выбора.
def dessert(entree_choice, side_choice):
print(f"So far we have {entree_choice} and {side_choice}.")
print("How about dessert?")
Что естественным образом приводит нас к финальной функции:
def your_meal(entree_choice, side_choice, dessert_choice):
print(
f'You will be having {entree_choice} with {side_choice} and {dessert_choice}')
Учитывая все вышесказанное, я бы рекомендовал немного другую реализацию. По сути, есть «контроллер». Эта штука управляет всей логикой на одном уровне.
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
, чтобы нет спрашивала о выборе стороны. Вместо этого пусть спросит контроллер.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
Некоторым это помогает. На самом деле я сделал это, ожидая вашего любезного ответа, потому что я видел, как это делается на YouTube, иначе. Именно так я изначально пытался в своей игре. Но где этот метод меня застревает, так это когда мы добираемся до третьей и/или четвертой функций. Как передать переменные из нескольких функций в функцию. то есть как десерт получает как от основного блюда, так и от гарнира?
Эй, Джейс, чтобы заставить его работать так, как вы его написали, вы будете продолжать передавать эти значения, увеличивая «арность», то есть количество аргументов, передаваемых функции.
Превосходно. Я смог это отследить. Теперь он отлично работает на моей стороне. Это означает, что я готов вернуться к своему более сложному игровому коду и применить эти концепции. Спасибо за то, что не снисходителен, помогаешь и внушаешь доверие. Очень признателен.
Спорим, Джейс. Вот почему мы здесь!
Я рад сообщить, что мне удалось успешно отредактировать свой код с включенным вашим «контроллером». Самое замечательное, что теперь я могу использовать оба метода. Ура!
Йоу! Это невероятно. Поздравляю Джейс.
Вам нужно вернуть свои значения. В настоящее время вы ничего не возвращаете. Эффективно добавьте
return your_meal()
илиreturn dessert()
. В настоящее время они все никто.