Python 精简 if 语句

Posted

技术标签:

【中文标题】Python 精简 if 语句【英文标题】:Python condensed if statements 【发布时间】:2022-01-02 09:55:08 【问题描述】:

我正在尝试在我的代码中如何压缩 if 语句。我有一个我正在做的项目,它有几个“if”语句(太多而无法跟踪)并且想找出一种方法来压缩它们。显然这涉及到一个 for 循环,但我无法在这个循环中添加额外的操作。

我想出了以下工作示例来演示我的问题:

num=6

if_options = [num==5, num==6]

for i in range(len(if_options)):
    if if_options[i]:
        print(num)

我想在代码中添加一个额外的部分。这个附加部分将在 if 语句中执行一个操作。请参阅以下无效示例作为我要完成的工作的框架:

num=6

if_options = [num==5, num==6]
operations = [num=num+1, num=num-1]

for i in range(len(if_options)):
    if if_options[i]:
        operations[i]
        print(num)

无论出于何种原因,它都不会执行代码的操作部分,并会因语法错误而失败。它不允许我在列表中声明命令“num=num+1”(不带引号),但是此声明对于执行命令是必需的。我觉得我错过了一件小事,这应该很容易解决。 提前致谢!

【问题讨论】:

你能解释一下这样做的目的吗?也许有更好的方法来做你的目标。 我不认为您的“工作示例”以您认为的方式工作。当您评估表达式[num==5, num==6] 时,比较是在在那个时刻执行的 - 您分配给if_options 的只是列表[False, True]。因此,即使您对operations 的表达式在语法上是有效的,它也毫无意义,因为所有操作都已经执行 @jasonharper 是 operations 行甚至有效吗? 【参考方案1】:

这里的问题是当您创建它们的列表时会评估这些操作。你想把它们写成字符串,然后在循环中 eval/exec 它们。我假设您还希望在循环中评估条件。

num = 6

if_options = ['num==5', 'num==6']
operations = ['num=num+1', 'num=num-1']

for i in range(len(if_options)):
    if eval(if_options[i]):
        exec(operations[i])
        print(num)

【讨论】:

抱歉,我在运行操作时将eval 更正为exec 然而,这通常不是您想要的。您可能实际上应该在函数中编写代码,并以其他方式进行重构。 也许有两个函数一个用于增加和一个用于减少将是一个更好的主意。您可以将它们的引用添加到列表中并在循环中调用它们。【参考方案2】:

为什么没有功能?

def check(inp):
    #you can do some logic and type checking here
    return type(inp)==int # for example, or return arguments to pass to the operatiins

def operation(inp2):
    if inp2: # check if true or not empty, as an example
        #do some operations

# and then you do something like

for x in input_of_things:
    operation( check( x ) )

【讨论】:

【参考方案3】:

你也可以使用 lambda 表达式。

num = 6
if_option_checks = [lambda x: x == 5, lambda x: x == 6]
operations = [lambda x: x + 1, lambda x: x - 1]
for check, operation in zip(if_option_checks, operations):
    if check(num):
        num = operation(num)

或者你可以使用字典和 lambda 表达式

num = 6
if_option_checks = "add": lambda x: x == 5, "sub": lambda x: x == 6
operations = "add": lambda x: x + 1, "sub": lambda x: x - 1
for key, check in if_option_checks.items():
    if check(num):
        num = operations[key](num)

【讨论】:

【参考方案4】:

也许 switch 语句结构会有所帮助。

先定义一个开关函数:

def switch(v): yield lambda *c: v in c

然后在一次迭代的 for 循环中使用,为开关值产生一个 case 函数:

for case in switch(num):

    if case(5):
        num = num + 1
        break

    if case(6):
        num = num - 1
        break

    ...

【讨论】:

以上是关于Python 精简 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句精简版

python 中 if 的用法(if else, if not, elif)

基于python的爬虫流程图(精简版)

代码精简技巧

一个精简的C#表达式执行框架Dynamic Expresso

精简mqtt-client(python)