re.match пытается соответствовать шаблону в начале строки . re.search пытается соответствовать шаблону всюду по строке , пока это не находит соответствие.
лямбда-выражения в 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))
Да, обычная «проблема с определением объема» (на самом деле привязка -позже, чем вы хотите, но ее часто называют этим именем). Вы уже получили два лучших (потому что самые простые) ответа - решение «поддельный по умолчанию» 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,
Есть только один i
, который привязан к каждой лямбде, вопреки тому, что вы думаете. Это частая ошибка.
Один из способов получить желаемое:
for i in range(0,10):
funcs.append(lambda x, i=i: f(i, x))
Теперь вы создаете параметр по умолчанию i
в каждом замыкании лямбда и привязываете к нему текущее значение цикла переменная i
.
Все лямбды в конечном итоге связаны с последним. См. Этот вопрос для более подробного ответа:
Как мне создать список лямбда-выражений Python (в цикле понимания списка / for)?
Учитывая окончательное значение i == 9
Как и любая хорошая функция Python, она будет использовать значение переменной в той области, в которой она была определена. Возможно, lambda: varname
(поскольку это языковая конструкция) привязывается к имени, а не к значению, и оценивает это имя во время выполнения?
Аналогично:
i = 9
def foo():
print i
i = 10
foo()
Мне было бы очень интересно при нахождении моего ответа правильный