#python #function #optimization
#python #функция #оптимизация
Вопрос:
Есть ли способ оптимизировать эту функцию?. Исходная версия имеет больше параметров внутри кортежей, поэтому ее невозможно масштабировать с помощью большего количества if и elif.
from statistics import median
rule=[1,2,3]
direction=['up','down']
def function_db(mount,rule,direction):
item=range(1,10)
# --------------------------------------------------------------------------------
# Porcentajes
# --------------------------------------------------------------------------------
if rule==1 and direction == 'up' :
final_item = min(item)*(1 mount/100)
elif rule==2 and direction == 'up' :
final_item = max(item)*(1 mount/100)
elif rule==3 and direction == 'up' :
final_item = median(item)*(1 mount/100)
elif rule==1 and direction == 'down' :
final_item = min(item)*(1-mount/100)
elif rule==2 and direction == 'down' :
final_item = max(item)*(1-mount/100)
elif rule==3 and direction == 'down' :
final_item = median(item)*(1-mount/100)
return final_item
function_db(10,3,"up")
Комментарии:
1. Внутри какого кортежа?
2. Вы хотите, чтобы она была оптимизирована для скорости, удобочитаемости, переносимости и т. Д.?
Ответ №1:
from statistics import median
rule=[1,2,3]
direction=['up','down']
def function_db(mount,rule,direction):
dic={1:min,2:max,3:median}
direct = {'up':1,'down':-1}
item=range(1,10)
final_item = dic[rule](item)*(1 (mount/100)*direct[direction])
return final_item
Ответ №2:
Я попытался оптимизировать макет кода (сократив количество if-else), но при этом сохранив читаемость. Я предполагаю, что правил будет намного больше, чем указаний, поэтому решил поместить правила в список функций. Таким образом, добавление нового правила включает в себя простое добавление имени функции rules
.
Очевидно, что можно исключить некоторые из функционально постоянных частей multiplicand
, но я подумал, что это сильно ухудшило читаемость.
Я также подумал, что стоит проверить (и вызвать) ошибки.
from statistics import median
def function_db( mount, rule, direction ):
item = range( 1, 10 )
rules = [ min, max, median ]
if ( direction == 'up' ):
multiplicand = ( 1 mount/100 )
elif ( direction == 'down' ):
multiplicand = ( 1-mount/100 )
else:
raise( ValueError( 'Unknown direction [' str( direction ) ']' ) )
if ( rule == 0 or rule > len( rules ) ):
raise( ValueError( 'Unknown rule-code [' str( rule ) ']' ) )
# Compute the result
multiplier = rules[ rule-1 ]( item )
final_item = multiplier * multiplicand
return final_item
print( "RESULT=%f" % ( function_db( 10, 3, "up" ) ) )
Ответ №3:
На самом деле это может быть даже однострочный:
def function_db(mount,rule,direction):
items = [0, 9, 5]
directions = {"up": 1, "down": -1}
return items[rule-1]*(1 directions[direction]*mount/100)
Комментарии:
1. не извлекайте
items
иdirections
из функции, это может привести к разрыву кода для дальнейшего процесса, написанного в основном коде, где записаны элементы и направления, лучше поддерживать инкапсуляцию.