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]
我理解这是如何工作的,但不是第一个。
答案 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功能,并且希望明确地循环 ......