функция не работает, когда значение ключа присваивается переменной python непосредственно из словаря

#python #python-3.x #function #dictionary

Вопрос:

Итак, я изучал python, наверное, 10 дней или около того, и я столкнулся с некоторым странным поведением python.

Фрагменты кода и выходные изображения ниже:

 #calculator  def add(n1,n2):  """Adds two numbers"""  return n1   n2  def subtract(n1,n2):  """Subtracts two numbers"""  return n1 - n2  def multiply(n1,n2):  """Multiplies two numbers"""  return n1 * n2  def divide(n1,n2):  """Divides two numbers"""  return n1 / n2  #we do not add paranthesis because we want to store the names of functions in the dictionary #we do not want to assign the function and trigger a call for execution itself. Hence only the name of the function will suffice.  operations = { ' ' : add, '-': subtract, '*': multiply, '/': divide, }  num1 = int(input("What is this first number you want to enter ?n")) num2 = int(input("What is this second number you want to enter ?n"))  for operation_symbols in operations:  print(operation_symbols)  operation_symbol = input("Pick a symbol from the list above for your calculations")  answer = operations[operation_symbol] answer(num1,num2) print(f"{num1} {operation_symbol} {num2} = {answer}")  

Когда я пишу этот код: мой вывод-изображение ниже: выход

Однако, когда я внесу следующие изменения

 #calculator  def add(n1,n2):  """Adds two numbers"""  return n1   n2  def subtract(n1,n2):  """Subtracts two numbers"""  return n1 - n2  def multiply(n1,n2):  """Multiplies two numbers"""  return n1 * n2  def divide(n1,n2):  """Divides two numbers"""  return n1 / n2  #we do not add paranthesis because we want to store the names of functions in the dictionary #we do not want to assign the function and trigger a call for execution itself. Hence only the name of the function will suffice.  operations = { ' ' : add, '-': subtract, '*': multiply, '/': divide, }  num1 = int(input("What is this first number you want to enter ?n")) num2 = int(input("What is this second number you want to enter ?n"))  for operation_symbols in operations:  print(operation_symbols)  operation_symbol = input("Pick a symbol from the list above for your calculations")  operation_function = operations[operation_symbol] answer = operation_function(num1,num2) print(f"{num1} {operation_symbol} {num2} = {answer}")  

Результат, который я получаю, является желаемым: желаемый вывод калькулятора из приведенного выше фрагмента кода

Я хотел знать, почему это происходит. Я понятия не имею, что происходит с моим кодом. спасибо и с уважением.

Комментарии:

1. это потому, что в первом фрагменте вы никогда не переназначаете answer переменную, answer удерживая ссылку на функцию. Позже вы вызовете эту функцию answer(num1,num2) , но результат ничему не будет присвоен.

2. Конечно, потому answer = operations[operation_symbol] что это сам объект функции . В этом нет ничего странного.

3. Кроме того, вы не сохраняете «имя функции», вы сохраняете саму функцию . Функция-это просто объект, такой как int или или str или list . Если вы использовали круглые скобки, он вызовет функцию и вычислит возвращаемое значение. Выполнение answer(num1,num2) не приводит к волшебному изменению значения answer , вам придется что-то сделать answer = answer(num1,num2) , хотя повторное использование такой переменной было бы запутанным. Ваш второй подход и так разумен

4. Спасибо вам за ваше краткое объяснение. Я буквально не смог бы найти ответ, подобный вашему, если бы не отправил вопросы.

Ответ №1:

В первом фрагменте кода вы пытаетесь напечатать ссылку на саму функцию, а не результат вызова функции, answer(num1,num2) . Измените его следующим образом, и вы получите желаемый результат:

 print(f"{num1} {operation_symbol} {num2} = {answer(num1, num2)}")  

Альтернативно,

 result = answer(num1, num2) print(f"{num1} {operation_symbol} {num2} = {result}")  

Ответ №2:

В первом фрагменте нерабочего кода вы задаете:

 answer = operations[operation_symbol]  

И во втором куске вы устанавливаете:

 answer = operation_function(num1,num2)  

Итак, в первом фрагменте вы задаете ответ на саму функцию, а во втором фрагменте вы задаете ответ на результат применения функции к двум входам.

То, что вы видите, — это именно то, что вы должны видеть. Обратите внимание, что в первом фрагменте вы захватываете и сохраняете функцию, затем в следующей строке вы правильно вызываете функцию с двумя аргументами, но не сохраняете результат.

Одним из способов исправить ваш первый кусок было бы изменить:

 answer = operations[operation_symbol] answer(num1,num2)  

Для:

 answer = operations[operation_symbol](num1,num2)  

Комментарии:

1. Большое спасибо. Теперь я ясно вижу, что происходило.