【问题标题】:Replacing multiple elif for a dictionary for multiple functions为多个功能的字典替换多个 elif
【发布时间】: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

我的问题是:

  1. 字典中的函数是惰性求值的,即只有当我将它们分配给DehDhe 时才求值?

1.1 如果不这样做。我怎样才能做到这一点?

  1. 是否有更好的(更紧凑、更易读和更惯用)的方式来编写它? (或者if/elif 是最好的结构?

PS:所有那些build*functions 返回一个带有给定参数大小的方阵。 I 是整数,dtdx 是浮点数,method 是字符串。

【问题讨论】:

  • 不,它们不会被懒惰地评估。值在创建字典时进行评估。
  • 如果构建函数的参数一致,您可以从函数对象本身构建一个字典,即eh = {'c3': buildD4, ...},然后用Deh = eh[method](I)懒惰地调用该方法。但是he 函数的参数并不一致——有时是I,有时是I-1,所以你不能这样做。 (您可以为 eh 函数执行此操作,因为它们都将 I 作为参数。)
  • @JohnGordon 是的,Is 在这种情况下并不一致。

标签: python dictionary switch-statement


【解决方案1】:
  1. 不,必须先构造字典,这意味着必须评估所有键和值。不过,您可以将函数存储为值:

    data = {'a': lambda x: print(f"hello, {x}!"), 'b': lambda x: print(f"Hi, {x}!")}
    data['a']("world")
    

    1.1 你可以这样做:unevaluated = lambda: do_stuff()。现在,do_stuff 只会在您调用 unevaluated() 时被调用,但这看起来有点难看。

  2. 使用包含单个函数的字典可能是可行的方法

【讨论】:

  • 看起来if/elif 是路要走。
猜你喜欢
  • 1970-01-01
  • 2019-05-20
  • 2021-11-16
  • 2013-10-19
  • 2011-11-24
  • 2012-09-23
相关资源
最近更新 更多