Функция + свичер в питоне
У меня проблема с использованием функций и переключателя в Python: у меня есть эта функция производственных затрат:
def fcostoproduccion (X,periodo):
if X > 0:
switcher = {
1: 200 + 15 * X,
2: 100 + 20 * X,
3: 100 + 4 * (X ** (1 / 2)),
4: 100 + 3 * X,
5: 150 + 6 * X,
6: 200 + 12 * (X ** (1 / 2)),
7: 200 + 15 * X,
8: 100 + 10 * X,
9: 100 + 6 * (X ** (1 / 2)),
10: 200 + 5 * (X ** (1 / 2)),
11: 100 + 10 * X,
12: 150 + 6 * X
}
return
И в конце я пытаюсь найти значение:
for l in range(j+1, k+1):
Ordenar = O[l]
Produccion = fcostoproduccion(Demanda, l)
Я знаю, что делаю ошибку, но не знаю, как ее исправить. Заранее спасибо.
2 ответа
Пара вещей с функцией fcostoproduccion
:
- Всегда возвращается
None
- Не имеет побочных эффектов
- Он использует только первый переданный в него аргумент (т. Е. Параметр
periodo
не используется в функции).
Трудно определить ваше намерение с помощью функции, однако я думаю,
- Вы хотите вычислить значение на основе
X
- Формула для вычисления желаемого возвращаемого значения варьируется для разных значений
X
отсюда и словарьswitcher
,
Исходя из приведенных выше предположений, вы можете изменить функцию fcostoproduccion
следующее:
def fcostoproduccion(X):
switcher = {
1: 200 + 15 * X,
2: 100 + 20 * X,
3: 100 + 4 * (X ** (1 / 2)),
4: 100 + 3 * X,
5: 150 + 6 * X,
6: 200 + 12 * (X ** (1 / 2)),
7: 200 + 15 * X,
8: 100 + 10 * X,
9: 100 + 6 * (X ** (1 / 2)),
10: 200 + 5 * (X ** (1 / 2)),
11: 100 + 10 * X,
12: 150 + 6 * X
}
return switcher[X] if X in switcher else None #Handle cases where X switcher is not defined for X
>>> [fcostoproduccion(i) for i in range(14)]
[None, 215, 140, 106.92820323027551, 112, 180, 229.39387691339815, 305, 180, 118.0, 215.81138830084188, 210, 222, None]
Если я правильно понимаю, вам нужно поведение старого доброго коммутатора. К сожалению, в Python нет встроенного переключателя. Предпочтительным способом является использование словаря. Таким образом, вы действительно близко. Попробуйте заменить ваше заявление возврата:
return switcher[X]
Обратите внимание, что вы хотите вернуть его, только если X > 1
, поэтому обязательно сделайте отступ return
Заявление и обрабатывать else
дело как хочешь.
Обратите внимание, что в этом случае ваш второй аргумент кажется совершенно бесполезным. Так что вы можете удалить periodo
,