#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. Большое спасибо. Теперь я ясно вижу, что происходило.