Проблемы лямбды Python

re.match пытается соответствовать шаблону в начале строки . re.search пытается соответствовать шаблону всюду по строке , пока это не находит соответствие.

15
задан Dan Lorenc 10 July 2009 в 01:01
поделиться

5 ответов

лямбда-выражения в python - это замыкания ... передаваемые вами аргументы не будут оцениваться до тех пор, пока не будет вычислена лямбда. В то время, независимо от того, i = 9, поскольку итерация завершена.

Требуемое поведение может быть достигнуто с помощью functools.partial

import functools

def f(a,b):
    return a*b

funcs = []

for i in range(0,10):
    funcs.append(functools.partial(f,i))
19
ответ дан 1 December 2019 в 00:30
поделиться

Да, обычная «проблема с определением объема» (на самом деле привязка -позже, чем вы хотите, но ее часто называют этим именем). Вы уже получили два лучших (потому что самые простые) ответа - решение «поддельный по умолчанию» i = i и functools.partial , поэтому я даю только третий одна из трех классических, "фабричная лямбда":

for i in range(0,10):
    funcs.append((lambda i: lambda x: f(i, x))(i))

Лично я бы выбрал i = i , если нет риска случайного вызова функций в funcs с 2 параметры вместо 1,

13
ответ дан 1 December 2019 в 00:30
поделиться

Есть только один i , который привязан к каждой лямбде, вопреки тому, что вы думаете. Это частая ошибка.

Один из способов получить желаемое:

for i in range(0,10):
    funcs.append(lambda x, i=i: f(i, x))

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

11
ответ дан 1 December 2019 в 00:30
поделиться

Все лямбды в конечном итоге связаны с последним. См. Этот вопрос для более подробного ответа:

Как мне создать список лямбда-выражений Python (в цикле понимания списка / for)?

2
ответ дан 1 December 2019 в 00:30
поделиться

Учитывая окончательное значение i == 9

Как и любая хорошая функция Python, она будет использовать значение переменной в той области, в которой она была определена. Возможно, lambda: varname (поскольку это языковая конструкция) привязывается к имени, а не к значению, и оценивает это имя во время выполнения?

Аналогично:

i = 9
def foo():
    print i

i = 10
foo()

Мне было бы очень интересно при нахождении моего ответа правильный

2
ответ дан 1 December 2019 в 00:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: