Python:如何避免在函数中编写多个if / elifs?
我写了一个函数,可以作为一个计算器。 它适用于下面的变量。
不过,我想要扩展它以处理15个不同的levels
值,以及15个不同的sales
和cost
值。 该功能将按照以下级别应用不同的销售和成本计算。 (因为每个计算都适用于特定级别,所以可能会在函数外部定义计算。)
我可以为15个关卡中的每一个编写大量的if / elif语句,但这看起来并不是Pythonic。 有没有一种方法可以通过编程来扩展这样一个功能,以获得更多的销售额,等级和成本?
为了清楚起见,输出将与下面相同(取决于当然输入的值),但函数应该能够处理更多的值。
levels_list = [4, 5] # ultimately 15 values in this list
sale4 = 18280 # ultimately 15 of these values
sale5 = 19180
sale6 = 22170
cost1 = 224 # and 15 of these values
cost2 = 335
cost3 = 456
def sales(level, foo, bar):
for level in levels_list:
if level == 4:
x = cost1 + sale4 * foo
y = cost2 + sale4 * bar
z = x + y
elif level == 5:
x = cost2 + sale5 * foo
y = cost3 + sale5 * bar
z = x + y
return pd.DataFrame({'Total Cost':[z], 'x_Cost':[x], 'y_Cost':[y]})
sales(5, 10, 10)
Total Cost x_Cost y_Cost
0 384391 192135 192256
使用dict
将相关值与每个级别相关联是有意义的:
levels_dict = {4 :(sale4, cost1, cost2),
5 :(sale5, cost2, cost3)}
通过这种方式, levels_dict[level]
将为您提供销售和用于计算的两项成本:
def sales(level, foo, bar):
sale, x_cost, y_cost = levels_dict[level]
x = x_cost + sale * foo
y = y_cost + sale * bar
...
如果level in range(15)
始终为真,则使用列表将删除对密钥的需求,并且您可以使用列表:
levels_data = [None, #0
None, #1
None, #2
None, #3
(18280, 224, 335),
(19180, 335, 456)]
虽然如果水平从4开始,那么这需要很多地方持有者。
最好还是使用namedtuple
来确保您始终按正确的顺序输入值:
import collections
level = collections.namedtuple("level",["sale","xcost","ycost"])
levels_dict = {4 :level(sale4, cost1, cost2),
5 :level(sale5, cost2, cost3)}
这仍然以上述方式工作,但也可以使用名称而不是顺序:
def sales(level, foo, bar):
data = levels_dict[level]
x = data.xcost + data.sale * foo
y = data.ycost + data.sale * bar
...
根据可能的级别值,您可能应该将它们合并到每个字典或字典的列表中,而不是为每个成本和销售额使用单独的变量。 根据您的逻辑如何工作以确定哪些成本与哪些级别相关,这可能允许您根据级别的值访问适当的成本和销售条目
例如,您可以在DataFrame中组织数据,例如:
data=pd.DataFrame(np.array([[cost1,cost2,cost3],[sale4,sale5,sale6],
[cost2,cost3,cost4],[sale4,sale5,sale6]]).T,index=[3,4,5],
columns= ['costx','salex','costy','saley'])
costx salex costy saley
3 224 18280 335 18280
4 335 19180 456 19180
5 456 22170 512 22170
这样每一行都与一个关卡相关联。 那么你的功能是直接的:
def sales(level, foo, bar):
costx,salex,costy,saley=data.loc[level]
x = costx + salex * foo
y = costy + saley * bar
z = x + y
return pd.DataFrame({'Total Cost':[z], 'x_Cost':[x], 'y_Cost':[y]})
链接地址: http://www.djcxy.com/p/53135.html
上一篇: Python: how to avoid writing numerous if/elifs in a function?