【问题标题】:Don't understand Python lambda function syntax不懂 Python lambda 函数语法
【发布时间】:2021-07-25 10:31:38
【问题描述】:

我不明白这种语法是如何工作的,也找不到关于它的文档:

word = '123xyz567'
s = ''.join (c if c.isdigit() else ' 'for c in word)

代码的第 2 行将采用 xyz123 并将 "123 567" 通过传入一个 lambda 函数加入到一个字符串中

但是,我对这种语法的工作原理感到困惑,通常是一条 python if-else 语句:

def example():
    for c in word:
        if c.isdigit():
            return c
        else:
            return ' ' 

有人可以解释或指导我查看向我解释传递给.join() 的 lambda 函数的语法结构以及如何正确使用它的文档吗?

【问题讨论】:

标签: python function conditional-statements


【解决方案1】:

这不是一个 lambda,而是一个生成器表达式。

https://www.python.org/dev/peps/pep-0289/

几乎像一个列表推导式,而是一个生成器文字。

list = [a for a in [1,2,3]]
generator = (a for a in [1,2,3])
print(list) # [1,2,3]
print(generator) # <generator object <genexpr> at 0x7f8ee3abd6d0>

【讨论】:

  • 请注意,您不应使用 list 作为变量名,因为它可能会覆盖内置函数。
【解决方案2】:

这里发生了几件事,没有一个是lambda

首先是生成器表达式,其形式为:(&lt;expresion&gt; for &lt;var&gt; in &lt;iterable&gt;)
在您的示例中,&lt;expresion&gt;c if c.isdigit() else ' '&lt;var&gt;citerableword
它创建了一个生成器(这是一种可迭代的)来传递给str.join

第二个是三元运算符,其形式为:&lt;expresion&gt; if &lt;bool-expresion&gt; else &lt;expresion&gt;
在您的示例中,第一个&lt;expresion&gt;c&lt;bool-expresion&gt;c.isdigit(),第二个&lt;expresion&gt;' '
如果&lt;bool-expresion&gt; 的计算结果为True,则返回第一个&lt;expresion&gt;,否则返回第二个&lt;expresion&gt;

所有东西放在一起,(c if c.isdigit() else ' 'for c in word) 是一个生成器,其中包含 word 的所有字符,但非数字字符替换为单个空格(每个)。

【讨论】:

    【解决方案3】:

    您显示的语法不是lambda 函数,而是生成器表达式。见:Generator expressions vs. list comprehensions

    您可以在此处阅读更多关于lambda 的信息:Why are Python lambdas useful?

    您显示的def 函数无法与return 语句一起正常工作;使用yield,这样函数就不会在第一个字符处跳出:

    def example(word):
        for c in word:
            if c.isdigit():
                yield c
            else:
                yield ' ' 
    

    更多关于yield这里:What does the "yield" keyword do?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多