下面的代码从文件中读取行,然后执行自定义函数(My_Function)并将值返回给变量(例如condition_A)
for line in input_file:
if condition_A:
condition_A = My_Function(A_tuple[0], B_tuple[0])
if condition_B:
condition_B = My_Function(A_tuple[1], B_tuple[1])
if condition_C:
condition_C = My_Function(A_tuple[2], B_tuple[2])
if condition_D:
condition_D = My_Function(A_tuple[3], B_tuple[3])
if condition_E:
condition_E = My_Function(A_tuple[4], B_tuple[4])
...
我的问题是:可以将代码修改为更优雅的版本吗?毕竟,许多代码是相似的(我不想定义另一个函数来简化它,因为在定义新函数后代码仍然相似)。感谢。
答案 0 :(得分:8)
使用列表condition_*
:
conditions
conditions=[1]*5 # initialize conditions as you wish
for line in input_file:
for i,condition in enumerate(conditions):
if condition:
conditions[i]=My_Function(A_tuple[i],B_tuple[i])
答案 1 :(得分:1)
像
这样的东西conditions = [condition_A, condition_B, condition_C, condition_D, condition_E]
condition_test = lambda c, i: My_Function(A_tuple[i], B_tuple[i]) if c else c
for line in input_file:
conditions = [condition_test(c, i) for i, c in enumerate(conditions)]
答案 2 :(得分:0)
'line'未在循环中引用,是否在简化发布时出错?
怎么样
condition=1 #or 2 or...
for line in input_file:
My_Function(A_tuple[condition],B_tuple[condition])
答案 3 :(得分:0)
在纯粹语法层面重构代码之前(上面的示例中已经介绍过),评估您在功能级别上对代码执行的操作可能很有用
查看您的condition_x变量。我认为你可能在两个不同的东西(包括类型和逻辑上)使用相同的变量 - 通常在弱类型语言中是一个坏主意。它看起来好像用户将条件设置为true或false,然后为该条件分配输出 - 是输出布尔值?它与该变量的原始值有关吗?重新考虑这可能会导致更易理解的代码。
在没有看到condition_x的内容的情况下评估如何重构这一点也很困难 - 因为这些可能具有共性。
答案 4 :(得分:0)
基于unutbu的另一个样本(不是解决方案):
data = [1,2,3,'',4,5,6, '', 0]
for i in (i for i in xrange(len(data)) if data[i] not in ['',0]):
data[i] += 1
对不起,如果重复
答案 5 :(得分:0)
这是一个通用解决方案,您可以在其中拥有自定义索引,如果需要,您还可以按名称访问条件,并且可以轻松扩展以添加任何新的复杂性
class Condition(object):
def __init__(self, active, index1, index2):
self.active = active
self.index1 = index1
self.index2 = index2
conditions = {
'A': Condition(True,0,0),
'B': Condition(True,1,1),
'C': Condition(True,2,2),
'D': Condition(True,3,3),
'E': Condition(True,4,4),
}
for line in input_file:
for condition in conditions.itervalues():
if condition.active:
condition.active = My_Function(A_tuple[condition.active.index1], B_tuple[condition.active.index2])