这个lambda是如何工作的?

时间:2016-03-09 10:48:54

标签: python lambda

garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX"
message = filter(lambda x: x != "X",garbled)
print message

I am another secret message!

这个世界如何运作?帮助我理解

list = range(1,101)    
print filter(lambda x:x>30 and x<70, list)

[31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69]

我理解这是如何工作的,但不是第一个。

2 个答案:

答案 0 :(得分:1)

你只需要稍微分解一下。首先,你有filter,它接受​​一个函数和一个iterable,并将函数应用于iterable中的每个元素,并删除函数返回False的任何内容。

在这种情况下,函数是lambda,它只是x != "X",相当于:

def foo(x):
    return x != "X"

所以iterable中的任何元素,在本例中都是你的输入字符串garbled,等于&#34; X&#34;将被删除。

答案 1 :(得分:1)

考虑到你了解第二个例子,但不是第一个实际相同的例子,我认为你的困惑的根源是你没有意识到这些字符串可以在Python中以与列表完全相同的方式迭代。

这是一个简单的例子:

>>> for character in 'Hello': print('->', character, '<-')
... 
-> H <-
-> e <-
-> l <-
-> l <-
-> o <-

将Python中的字符串视为“字符串”或“字符列表”(区别在于字符串是不可变的,“字符元组”实际上更合适,但听起来不太好)。

有关详细信息,请参阅the documentation

这是一个功能还是一个 bug 在Python社区中有点争议,顺便说一下,许多人建议为Python 3改变它。是的,这真的可以咬你,考虑:

def my_function(list_expected):
    for item in list:
        do_something(item)

这是一个很常见的模式,你应该把它称为`my_function(['Hello','World'])。

但是如果我忘了这个函数需要一个列表怎么办?我称之为my_function('Hello')?根据{{​​1}}的作用,您可能会收到错误或某些巧妙的错误行为。请注意这一点。

就个人而言,我不太喜欢这个Python功能,并且希望明确地循环 ......