Как передать переменные из одной функции в другую и использовать их в условных операторах в python?

Я новичок в программировании в целом и еще новее в 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 и по крайней мере столько же отсюда.

Вам нужно вернуть свои значения. В настоящее время вы ничего не возвращаете. Эффективно добавьте return your_meal() или return dessert(). В настоящее время они все никто.

spen.smith 22.03.2022 02:11

Кроме того, вы также повторно запускаете функцию верхнего уровня внутри side_dish. Если бы вы «проходили» свою программу, вы бы попросили их блюдо, а затем получили бы их ответ. Большой! Затем вы бы попросили их гарнир, но затем буквально попросили бы их основное блюдо очередной раз. Вам нужно сделать это только один раз.

spen.smith 22.03.2022 02:14

@spen.smith, можете ли вы указать, где разместить возвраты, потому что я их использовал, и это совсем не изменило мои результаты. Очевидно, я использую их не в том месте или не в том направлении. Помните, я программирую здесь с опытом работы в несколько часов. Что касается комментария «повторный запуск вашей функции верхнего уровня внутри side_dish», я предполагаю, что вы имеете в виду строку «entree_choice = entree()», которая мне показалась странной, но я видел, как это делают несколько человек на YouTube. Если я не укажу это там, как side_dish получит «entree_choice» из функции entree?

Jace Barnett 22.03.2022 02:21

Привет @Jace, я перефразировал ниже. Дайте мне знать, если это поможет.

spen.smith 22.03.2022 02:22

@spen.smith движется в правильном направлении и немного повышает уверенность, потому что это своего рода поезд, на котором я ехал, прежде чем YouTube повел меня по другому пути. Проблема, с которой я столкнулся и до сих пор сталкиваюсь с вашим выбором, заключается в попытке перейти к нескольким функциям или получить функцию для получения из нескольких других функций.

Jace Barnett 22.03.2022 02:31

Эй, Джейс, здесь две отдельные проблемы. По сути, вы вызываете функцию A из функции B. Это создает бесконечный цикл. Вторая проблема заключается в том, что вы не являетесь возвращение чем-то из своих вызовов функций. Я написал пример внизу, чтобы помочь с этим.

spen.smith 22.03.2022 02:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
43
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чего вам не хватает, так это идеи «возвращаемого значения» функции. Начните с разбиения задачи на отдельные блоки. Используя ваш пример 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}')

Для того, чтобы добиться этого, две вещи:

  1. Измените базовую функцию entree, чтобы нет спрашивала о выборе стороны. Вместо этого пусть спросит контроллер.
  2. Верните блюдо, которое они выбрали.
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, иначе. Именно так я изначально пытался в своей игре. Но где этот метод меня застревает, так это когда мы добираемся до третьей и/или четвертой функций. Как передать переменные из нескольких функций в функцию. то есть как десерт получает как от основного блюда, так и от гарнира?

Jace Barnett 22.03.2022 02:27

Эй, Джейс, чтобы заставить его работать так, как вы его написали, вы будете продолжать передавать эти значения, увеличивая «арность», то есть количество аргументов, передаваемых функции.

spen.smith 22.03.2022 02:30

Превосходно. Я смог это отследить. Теперь он отлично работает на моей стороне. Это означает, что я готов вернуться к своему более сложному игровому коду и применить эти концепции. Спасибо за то, что не снисходителен, помогаешь и внушаешь доверие. Очень признателен.

Jace Barnett 22.03.2022 02:41

Спорим, Джейс. Вот почему мы здесь!

spen.smith 22.03.2022 02:42

Я рад сообщить, что мне удалось успешно отредактировать свой код с включенным вашим «контроллером». Самое замечательное, что теперь я могу использовать оба метода. Ура!

Jace Barnett 22.03.2022 03:09

Йоу! Это невероятно. Поздравляю Джейс.

spen.smith 22.03.2022 03:10

Другие вопросы по теме