if/else 三元表达式中的 def

Posted

技术标签:

【中文标题】if/else 三元表达式中的 def【英文标题】:def inside if/else ternary expression 【发布时间】:2019-03-31 06:28:45 【问题描述】:

有没有办法转换这个:

if counts:
    def a(l):
        return a_with_counts(l)
else:
    def a(l):
        return a_without_counts(l)

转换成三元表达式?

我试过这样的

def a(l):
    return a_with_counts(l) if counts else a_without_counts(l)

但我不希望每次调用a(l) 时都评估if counts,我想在我的方法开始时执行一次,然后每次调用a(l) 时直接评估分配的函数。这可能吗?

谢谢!

【问题讨论】:

为什么要三元表达式 为什么不将counts作为参数添加到函数def a(l, counts=True):等中 @B001ᛦ,因为对于给定的输入,我必须多次运行该方法,而counts 保持不变。 @Chris_Rands 我不想每次都评估counts。对于给定的输入,我想做一次,然后在整个过程中使用分配的函数:) 【参考方案1】:

您可以通过如下定义闭包来实现:

def gen_a(counts):
    return a_with_counts if counts else a_without_counts

a = gen_a(counts)

这相当于写

a = a_with_counts if counts else a_without_counts

如果您只打算调用一次。

【讨论】:

啊哈!谢谢,这正是我需要的。我不得不承认这不会超出我的想法!【参考方案2】:

lambda 中有一个三元?

a = lambda counts:a_with_counts if counts else a_without_counts

然后

a(True)   # or False

将创建您可以调用的a_with_counts (resp a_without_counts) 函数。

【讨论】:

命名的 lambdas :S 请注意 Python PEP 8 style guide 始终使用 def 语句而不是将 lambda 表达式直接绑定到标识符的赋值语句。 @Skandix OP 不想每次都评估 counts 该死的,我现在对lambda感到内疚,因为你:) 它在 *** 上被很好地提及:参见 here、here 和 here

以上是关于if/else 三元表达式中的 def的主要内容,如果未能解决你的问题,请参考以下文章

java 三元表达式 求把他变成if...else的格式

js三元表达式

js 三元表达式

JavaScript-流程控制(if else三元表达式switch)循环(forwhilecontinue break)

三元表达式列表生成式生成器表达式

python中的三元表达式,列表解析 和 生成器表达式