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 语句的主要内容,如果未能解决你的问题,请参考以下文章
python 中 if 的用法(if else, if not, elif)