Использование лямбда-выражения в качестве аргумента функции - PullRequest
0 голосов
/ 05 декабря 2018

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

import re
rep = {"hi": "hello", "ya": "you"}
text = 'hi how are ya'
keys = re.compile('hi|ya')
text = keys.sub(lambda m: rep[m.group(0)], text)
print(text)

заменяет 'hi' и 'ya' на 'hello' и 'you', возвращая

"hello how are you"

Я запутался в том, чтопочему это работает, потому что мы никогда не указывали, какие значения принимает m и как функция re.sub() интерпретирует это, когда первый аргумент должен быть строкой.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

В дополнение к хорошему ответу iBug вы говорите, почему первый аргумент может работать с нестроковым объектом, это также относится к timeit и другим вещам.

Также, lambdas эквивалентны функциям, так что в основном вы помещаете функцию, даже если вы сделали функцию вручную и поместили в нее имя функции, она будет работать.

Примечание: есть не-regex no-moduleспособ сделать это:

' '.join([rep.get(i,i) for i in text.split()])

Демо:

>>> rep = {"hi": "hello", "ya": "you"}
>>> text = 'hi how are ya'
>>> ' '.join([rep.get(i,i) for i in text.split()])
'hello how are you'
>>> 
0 голосов
/ 05 декабря 2018

С Документация Python :

Если repl является функцией, она вызывается для каждого неперекрывающегося вхождения pattern .Функция принимает один аргумент объекта сопоставления и возвращает строку замены.

Вы можете рассматривать лямбда-выражения как однострочные функции, поскольку они функционально эквивалентны, поэтому

lambda m: rep[m.group(0)]

становится

def unnamed_function(m):
    return rep[m.group(0)]

, а m назначается в качестве аргумента функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...