Каков наилучший способ написать функцию, которая выполняет различные вычисления в зависимости от параметра? - PullRequest
4 голосов
/ 03 мая 2019

Я просто хотел бы знать, каков наилучший подход к написанию функции, которая выполняет различные вычисления в зависимости от параметра.

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

def simple_operation(a, b, operation):
    if operation == 'divide':
        return a / b
    elif operation == 'multiply':
        return a * b


print(simple_operation(3, 9, 'multiply'))

В моем конкретном случае я хочу вычислить константу равновесия реакции как функцию температуры, и есть разные способы сделать это.Например, используя уравнение Ванта-Хоффа или вычисляя свойства пласта при определенной температуре.Каждый способ (у обоих есть плюсы и минусы) потребует достаточного количества строк, поэтому я не знаю, какой подход лучше, я чувствую, что может быть лучший способ, чем использование операторов if с большим количеством кода для каждого случая.Я хотел бы знать, как опытные программисты подходят к таким ситуациям.

Ответы [ 2 ]

5 голосов
/ 03 мая 2019

Используйте dict:

def simple_operation(a, b, operation):
    operations = {
        'divide'  : lambda a, b: a / b,
        'multiply': lambda a, b: a * b,
    }
    return operations.get(operation)(a, b)

Вы можете добавить функцию по умолчанию для неизвестных операций:

def simple_operation(a, b, operation):
        def err(*_):
            raise ValueError("Operation not accepted")
        operations = {
            'divide'  : lambda a, b: a / b,
            'multiply': lambda a, b: a * b,
        }
        return operations.get(operation, err)(a, b)

Вы можете ссылаться на что угодно в диктовке, может быть полезно использовать простые функции вместо лямбда-выражений или модуля operator:

import operator
def simple_operation(a, b, operation):
        def err(*_):
            raise ValueError("Operation not accepted")
        operations = {
            'divide'  : operator.truediv,
            'multiply': operator.mul,
        }
        return operations.get(operation, err)(a, b)
2 голосов
/ 03 мая 2019

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

from operator import *

#Dictionary to map user input to operation
op_map = {'divide': truediv, 'multiply': mul, 'addition': add}

#Get user input and call functions directly
print(op_map['divide'](9, 3))
#3.0
print(op_map['multiply'](9, 3))
#27
print(op_map['addition'](9, 3))
#12

В качестве дополнительного шага я продолжил и написал часть пользовательского ввода

from operator import *

#Dictionary to map user input to operation
op_map = {'divide': truediv, 'multiply': mul, 'addition': add}

operation = input('Enter what operation you want to perform, available are divide, multiply and addition>>')
if operation not in op_map.keys():
    print('You entered an invalid operation')
    exit()
else:
    op1 = int(input('Provide the first operand>>'))
    op2 = int(input('Provide the second  operand>>'))
    res = op_map[operation](op1, op2)
    print('Result of operation {} between {} and {} is {}'.format(operation, op1, op2, res))

Вывод может выглядеть как

Enter what operation you want to perform, available are divide, multiply and addition>>addition
Provide the first operand>>3
Provide the second   operand>>9
Result of operation addition between 3 and 9 is 12

Enter what operation you want to perform, available are divide, multiply and addition>>divide
Provide the first operand>>27
Provide the second   operand>>3
Result of operation divide between 27 and 3 is 9.0

Также, как упоминается в OP, один из способов использования сложной функции может быть таким, как показано ниже

#A complex function
def complex(a,b,c,d):

    return (a/b)+(c*d)

#Dictionary to map user input to operation
op_map = {'complex': complex}

print(op_map['complex'](9, 3, 6, 4))
#27.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...