【发布时间】:2018-10-07 20:52:10
【问题描述】:
我读过关于python中类似C的switch成语被表示为字典,大多数示例使用单个函数和一个break语句。就我而言,我有以下if
if method == 'c3':
Deh = buildD4(I)
Dhe = buildD343(I-1)
elif method == 'c4':
Deh = buildD4(I);
Dhe = buildD4(I-1)
elif method == 'c5':
Deh = buildD343(I)
Dhe = buildD343(I-1)
elif method == 'e2':
Deh = buildAE4(I)
Dhe = buildAH4(I)
elif method == 'y2':
Deh = buildD2(I)
Dhe = buildD2(I-1)
dt=dx
我已经改写为:
eh = {
'c3': buildD4(I),
'c4': buildD4(I),
'c5': buildD343(I),
'e2': buildAE4(I),
'y2': buildD2(I),
}
Deh = eh[method]
he = {
'c3': buildD343(I-1),
'c4': buildD4(I-1),
'c5': buildD343(I-1),
'e2': buildAH4(I),
'y2': buildD2(I-1),
}
Dhe = he[method]
if method == y2:
dt=dx
我的问题是:
- 字典中的函数是惰性求值的,即只有当我将它们分配给
Deh或Dhe时才求值?
1.1 如果不这样做。我怎样才能做到这一点?
- 是否有更好的(更紧凑、更易读和更惯用)的方式来编写它? (或者
if/elif是最好的结构?
PS:所有那些build*functions 返回一个带有给定参数大小的方阵。 I 是整数,dt 和 dx 是浮点数,method 是字符串。
【问题讨论】:
-
不,它们不会被懒惰地评估。值在创建字典时进行评估。
-
如果构建函数的参数一致,您可以从函数对象本身构建一个字典,即
eh = {'c3': buildD4, ...},然后用Deh = eh[method](I)懒惰地调用该方法。但是he函数的参数并不一致——有时是I,有时是I-1,所以你不能这样做。 (您可以为eh函数执行此操作,因为它们都将I作为参数。) -
@JohnGordon 是的,
Is 在这种情况下并不一致。
标签: python dictionary switch-statement