【问题标题】:If/Else or One Line [closed]如果/否则或一行[关闭]
【发布时间】:2022-11-28 17:39:08
【问题描述】:

假设我有一个类有一个名为MyClass.name 的属性。我正在遍历一些数据,我想将名称安排为 MyClass.nameother。我有一个方法:

def return_name(self, the_name):
    if the_name == self.name:
        return the_name
    else:
        return 'other'

将方法重写为:

def return_name(self, the_name):
    return the_name * (self.name == the_name) + 'other' * (self.name != the_name) 

我知道这两个示例都产生相同的输出(由于无分支,第二个示例的性能甚至可能略好,但这可以忽略不计,该方法太短了,根本不会影响运行时),所以我纯粹从可读性和代码长度的角度提问。

哪一个是首选?

【问题讨论】:

  • 如果你真的想写一个单行代码,你可以考虑return the_name if the_name == self.name else 'other'
  • Python 支持条件表达式 - 请参阅PEP 308
  • 您正在使用 Python,它使您所做的一切都变得缓慢,但同时您正在尝试在 CPU 级别上进行优化。在 python 中执行 2 * 4 时,你甚至不知道执行了多少个分支。不要那样做。如果您想要真正优化的代码,请不要使用 Python。如果您使用的是 Python,请接受它的缺点并利用它的优点。
  • 实际上并没有“无分支 Python”这样的东西。你正在用一种解释性语言写作,而解释器充满了分支。
  • 我更喜欢 if...else 实现。除非性能增益是明确的,否则第一种方法的明确性非常有吸引力。

标签: python


【解决方案1】:

我强烈建议不要使用第二个版本:除非您知道在 Python 中布尔值“是”整数,否则您不太清楚您在做什么。如果你想要一个单一的表达更喜欢这个

def return_name(self, the_name):
    return the_name if the_name == self.name else "other"

在这个版本和分支版本之间,我更喜欢前者,但我认为这更多的是个人品味,而不是实际的 Python 编码风格。

作为一般建议,您不应该更喜欢(可能)稍微快一点的代码版本,它的可读性也差得多。

请注意,在某些语言中,无分支版本将是惯用的解决方案(例如在 J 中),但在 Python 中不是(至少我不知道)。

【讨论】:

    【解决方案2】:

    由于可读性,第一个更好。作为你豪宅性能不是问题。你可以用一个计时器来测试它。

    branchless 的论点是体面的,但是 '*' 通常是一个缓慢的操作。

    Python 还允许您在一行中使用 if else。

    def return_name(self, the_name):
        return the_name if self.name == the_name else 'other'
    

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多