Что “лямбда” означает в Python, и что самый простой путь состоит в том, чтобы использовать его?

Поблочное тестирование должно быть просто естественной частью рабочего процесса разработки кода, как компилятор.

Однако это требует обучения управления на преимуществах поблочного тестирования. У младших разработчиков есть относительно низкие возможности иметь такое влияние, все же. Таким образом, ли компания является сторонником поблочного тестирования, зависит от того, есть ли у них старший разработчик или архитектор, который является защитником поблочного тестирования.

я полагаю, что это - ответ на Ваш вопрос , "что отсутствует и почему не больше компаний, делающих поблочное тестирование" . :-)

18
задан Sinan Ünür 18 October 2009 в 00:47
поделиться

3 ответа

Лямбда, которая возникла из Лямбда-исчисления и (AFAIK) была впервые реализована в Лиспе , по сути, является анонимной функцией - функцией, которая не ' t имеют имя и используются в строке, другими словами, вы можете назначить идентификатор лямбда-функции в одном выражении как таковом:

>>> addTwo = lambda x: x+2
>>> addTwo(2)
4

Это назначает addTwo анонимной функции, которая принимает 1 аргумент x, а в теле функции он добавляет 2 к x, он возвращает последнее значение последнего выражения в теле функции, поэтому нет ключевого слова return .

Приведенный выше код примерно эквивалентен :

>>> def addTwo(x):
...     return x+2
... 
>>> addTwo(2)
4

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

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

Пример хеш-дерева с использованием лямбда-выражений:

>>> mapTree = {
...     'number': lambda x: x**x,
...     'string': lambda x: x[1:]
... }
>>> otype = 'number'
>>> mapTree[otype](2)
4
>>> otype = 'string'
>>> mapTree[otype]('foo')
'oo'

В этом случае пример Я действительно не хочу определять имя для какой-либо из этих функций, потому что я буду использовать их только в хэше, поэтому я буду использовать лямбды.

39
ответ дан 30 November 2019 в 06:42
поделиться

Я не знаю, какую книгу вы используете, но в Dive into Python есть раздел , который я считаю информативным.

4
ответ дан 30 November 2019 в 06:42
поделиться

Использование лямбда - это своего рода стиль. Когда вы можете обойтись очень простой функцией и обычно там, где вы просто где-то ее храните (возможно, в списке функций или в структуре данных инструментария графического интерфейса пользователя и т. Д.), Люди чувствуют, что лямбда уменьшает беспорядок в их коде.

В Python можно создать только лямбда, которая возвращает одно выражение, а лямбда не может охватывать несколько строк (если вы не соедините несколько строк с помощью трюка с обратной косой чертой в конце строки). Люди просили Python добавить улучшения для лямбда, но этого не произошло. Насколько я понимаю, изменения, позволяющие лямбде писать любую функцию, значительно усложнили бы синтаксический анализ кода в Python. И поскольку у нас уже есть def для определения функции, усиление не считается стоящим усложнения. Таким образом, есть некоторые случаи, когда вы можете захотеть использовать лямбда, когда это невозможно. В этом случае вы можете просто использовать def :

object1.register_callback_function(lambda x: x.foo() > 3)

def fn(x):
    if x.foo() > 3:
        x.recalibrate()
        return x.value() > 9
    elif x.bar() > 3:
        x.do_something_else()
        return x.other_value < 0
    else:
        x.whatever()
        return True

object2.register_callback_function(fn)
del(fn)

Первая функция обратного вызова была простой, и лямбда-выражения было достаточно. Для второго использовать лямбду просто невозможно. Мы достигаем того же эффекта, используя def и создавая функциональный объект, связанный с именем fn , а затем передавая fn в register_callback_function () . Затем, чтобы показать, что мы можем, мы вызываем del () для имени fn , чтобы отвязать его. Теперь имя fn больше не связано с каким-либо объектом, но register_callback_function () по-прежнему имеет ссылку на объект функции, поэтому объект функции продолжает существовать.

вы можете просто использовать def :

object1.register_callback_function(lambda x: x.foo() > 3)

def fn(x):
    if x.foo() > 3:
        x.recalibrate()
        return x.value() > 9
    elif x.bar() > 3:
        x.do_something_else()
        return x.other_value < 0
    else:
        x.whatever()
        return True

object2.register_callback_function(fn)
del(fn)

Первая функция обратного вызова была простой, и лямбда-выражения было достаточно. Для второго использовать лямбду просто невозможно. Мы достигаем того же эффекта, используя def и создавая функциональный объект, связанный с именем fn , а затем передавая fn в register_callback_function () . Затем, чтобы показать, что мы можем, мы вызываем del () для имени fn , чтобы отвязать его. Теперь имя fn больше не связано с каким-либо объектом, но register_callback_function () по-прежнему имеет ссылку на объект функции, поэтому объект функции продолжает существовать.

вы можете просто использовать def :

object1.register_callback_function(lambda x: x.foo() > 3)

def fn(x):
    if x.foo() > 3:
        x.recalibrate()
        return x.value() > 9
    elif x.bar() > 3:
        x.do_something_else()
        return x.other_value < 0
    else:
        x.whatever()
        return True

object2.register_callback_function(fn)
del(fn)

Первая функция обратного вызова была простой, и лямбда-выражения было достаточно. Для второго использовать лямбду просто невозможно. Мы достигаем того же эффекта, используя def и создавая функциональный объект, связанный с именем fn , а затем передавая fn в register_callback_function () . Затем, чтобы показать, что мы можем, мы вызываем del () для имени fn , чтобы отвязать его. Теперь имя fn больше не связано с каким-либо объектом, но register_callback_function () по-прежнему имеет ссылку на объект функции, поэтому объект функции продолжает существовать.

просто невозможно использовать лямбду. Мы достигаем того же эффекта, используя def и создавая функциональный объект, связанный с именем fn , а затем передавая fn в register_callback_function () . Затем, чтобы показать, что мы можем, мы вызываем del () для имени fn , чтобы отвязать его. Теперь имя fn больше не связано с каким-либо объектом, но register_callback_function () по-прежнему имеет ссылку на объект функции, поэтому объект функции продолжает существовать.

просто невозможно использовать лямбду. Мы достигаем того же эффекта, используя def и создавая функциональный объект, связанный с именем fn , а затем передавая fn в register_callback_function () . Затем, чтобы показать, что мы можем, мы вызываем del () для имени fn , чтобы отвязать его. Теперь имя fn больше не связано с каким-либо объектом, но register_callback_function () по-прежнему имеет ссылку на объект функции, поэтому объект функции продолжает существовать.

мы вызываем del () для имени fn , чтобы отвязать его. Теперь имя fn больше не связано с каким-либо объектом, но register_callback_function () по-прежнему имеет ссылку на объект функции, поэтому объект функции продолжает существовать.

мы вызываем del () для имени fn , чтобы отвязать его. Теперь имя fn больше не связано с каким-либо объектом, но register_callback_function () по-прежнему имеет ссылку на объект функции, поэтому объект функции продолжает существовать.

3
ответ дан 30 November 2019 в 06:42
поделиться
Другие вопросы по тегам:

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