Поблочное тестирование должно быть просто естественной частью рабочего процесса разработки кода, как компилятор.
Однако это требует обучения управления на преимуществах поблочного тестирования. У младших разработчиков есть относительно низкие возможности иметь такое влияние, все же. Таким образом, ли компания является сторонником поблочного тестирования, зависит от того, есть ли у них старший разработчик или архитектор, который является защитником поблочного тестирования.
я полагаю, что это - ответ на Ваш вопрос , "что отсутствует и почему не больше компаний, делающих поблочное тестирование" . :-)
Лямбда, которая возникла из Лямбда-исчисления и (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'
В этом случае пример Я действительно не хочу определять имя для какой-либо из этих функций, потому что я буду использовать их только в хэше, поэтому я буду использовать лямбды.
Я не знаю, какую книгу вы используете, но в Dive into Python есть раздел , который я считаю информативным.
Использование лямбда - это своего рода стиль. Когда вы можете обойтись очень простой функцией и обычно там, где вы просто где-то ее храните (возможно, в списке функций или в структуре данных инструментария графического интерфейса пользователя и т. Д.), Люди чувствуют, что лямбда уменьшает беспорядок в их коде.
В 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 ()
по-прежнему имеет ссылку на объект функции, поэтому объект функции продолжает существовать.