【问题标题】:Python condensed if statementsPython 精简 if 语句
【发布时间】: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 行甚至有效吗?

标签: python string function loops for-loop


【解决方案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
      
          ...
      

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 2019-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 2015-09-12
        相关资源
        最近更新 更多