Вы можете делать что-то вроде того, что хотите, но вы не должны. Тем не менее, вот как;вы можете видеть, как это не улучшает ситуацию.
Самая большая проблема с тем, как вы это делаете, заключается в том, что Python будет оценивать ваши тесты и результаты один раз, во время объявления словаря.Вместо этого вам нужно сделать так, чтобы все условия и полученные операторы работали;Таким образом, оценка откладывается до тех пор, пока вы не позвоните им.К счастью, есть способ сделать это встроенным для простых функций, используя ключевое слово lambda
.Во-вторых, оператор присваивания не может использоваться как значение в Python, поэтому наши функции действий (которые выполняются, если соответствующая условная функция возвращает истинное значение) должны возвращать значение, которое будет использоваться для приращения c
;они не могут присваивать себе c
.
Кроме того, элементы в словаре не упорядочены, поэтому ваши тесты не обязательно будут выполняться в том порядке, в котором вы их определяете, то есть, вероятно, вам следует использоватьчто-то кроме словаря, который сохраняет порядок, например, кортеж или список.Я предполагаю, что вы хотите, чтобы выполнялся только один случай.
Итак, начнем:
def findStuff(cds):
cases = [ (lambda: a[2][0] == 1, lambda: i + 1),
(lambda: a[2][1] == 1, lambda: i + 2),
(lambda: a[2][2] == 1, lambda: i + 3),
(lambda: a[1] == 1, lambda: L.append(cds[i:i+3], a[0], c) or 0)
]
L=[]
c=0
for i in range(0, len(cds), 3):
a=differencesTo(cds[i:i+3])
for condition, action in cases:
if condition():
c += action()
break
return L
Является ли это более читабельным, чем последовательность операторов if/elif
?Nooooooooooooo.В частности, четвертый случай гораздо менее понятен, чем должен быть, потому что нам приходится полагаться на функцию, которая возвращает приращение для c
, чтобы изменить совершенно другую переменную, а затем мы должны выяснить, как ее получитьверните 0
, чтобы c
не было изменено.Uuuuuugly.
Не делайте этого. На самом деле этот код, вероятно, даже не будет работать как есть, поскольку я посчитал его слишком уродливым для тестирования.