以Pythonic方式选择一个函数

Mar*_*rte 0 python python-3.x

假设我有以下变量:

x
y
Run Code Online (Sandbox Code Playgroud)

和功能:

def runx(x):
    print(x)

def runy(y):
    print (y)

def runxy(x, y):
    print(x + y)

def nonexy():
    print('none')
Run Code Online (Sandbox Code Playgroud)

什么是基于下一个要求选择函数的Pythonic方法:

- 如果value只比y运行func大runy

- 如果value只比x运行func大runx

- 如果value大于两者xy运行funcrunxy

- 如果value不是比这更好的x并且y愚弄功能nonexy

value,x,y可以是任何数量的

例:

x = 4
y = 6
value = 5
Run Code Online (Sandbox Code Playgroud)

这里value只是大于x,所以跑runx(x)

Mar*_*ark 7

if value > y :
    if value > x :
        runxy(x, y)
    else :
        runy(y)
else :
    if value > x :
        runx(x)
    else :
        nonexy()
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

  • 不.根据你是否需要返回值,你可以将内部语句压缩为``return runxy(x,y)if value> x else runy(y)``等. (2认同)

use*_*740 6

经常被遗忘的一种方法是使用逻辑表.现在,虽然我并不认为这是最好的方法,但我觉得这很有意思,所以这里有 - 接受或留下你想做的事情.

             value > y   value <= y
             ----------  ----------
value > x  | runxy       runx
value <= x | runy        nonex
Run Code Online (Sandbox Code Playgroud)

然后我们可以将其编成如此,利用函数是一等值的事实:

arr = [[runxy, runx], [runy, nonex]]
Run Code Online (Sandbox Code Playgroud)

并按如下方式访问它:

col = 0 if value > y else 1
row = 0 if value > x else 1
fn = arr[row][col]
Run Code Online (Sandbox Code Playgroud)

然后只需编辑当前设计,所有函数应该采用x和y参数(或使用上表中的包裹lambda)和..

fn(x, y)
Run Code Online (Sandbox Code Playgroud)

  • `fn =([nonexy,runy],[runx,runxy])[value> x] [value> y]` (2认同)