2016-03-09 5 views
0
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] 

Я понимаю, как это работает, но не первое.

+1

Он отфильтровывает любой символ, который 'x' ...!? – deceze

+2

Я думаю, что источником вашей путаницы может быть, что вы не понимаете, что строки могут быть повторены в Python точно так же, как списки могут. Попробуйте запустить: 'для символа в« Привет »: print (character)' и посмотреть, что вы получаете ;-) – Carpetsmoker

+0

@deceze не следует ли проверять, был ли первый элемент IXXX! = X и т. Д., А затем вернуть пустой набор? – Jack

ответ

1

Учитывая, что вы сделать понять второй пример, но не первый пример, который фактически идентичен, я думаю, что источник вашей путаницы в том, что вы не понимаете, что строки могут быть итерации в Python в точно так же, как списки могут.

Вот простой пример:

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

Think строки в Python как «строка символов» или «список символов» (разница в том, что строки являются неизменными, чтобы «кортежем символов» на самом деле было бы более уместным, но звучит не так хорошо).

Для получения дополнительной информации см. the documentation.

ли это функция или ошибка является несколько спорным в сообществе Python, кстати, и многие люди предложили изменить это на Python 3. Проблема заключается в том, что это действительно может укусить вас, рассмотреть :

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

Это достаточно общий шаблон, и вы, как ожидается, называть его как `my_function ([ 'Hello', 'World']).

Но что, если я забыл, что эта функция ожидает список? И я называю это my_function('Hello')? В зависимости от того, что делает do_something(item), вы либо получаете ошибку, либо неточно неправильно. Будьте в курсе этого.

Лично мне это не нравится Python имеет много и предпочел бы, чтобы петли в явном виде ...

1

Вам просто нужно немного сломать его. Сначала у вас есть filter, который выполняет функцию и итерабельность и применяет функцию к каждому элементу в итерируемой последовательности и отбрасывает все, что возвращает функция False.

В этом случае функция лямбда, которая просто x != "X" что эквивалентно:

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

так что любой элемент в итерацию, который в этом случае ваша входная строка garbled, которая равна " X "удаляется.

Смежные вопросы