Для человека без comp-sci фона, что такое лямбда в мире компьютерных наук?
Я проиллюстрирую его интуитивно шаг за шагом в простой и понятной форме python.
Короче говоря, лямбда - это просто анонимная и встроенная функция.
Давайте начнем с назначения, чтобы понять
lambdas
как первокурсник с фоном базовой арифметики.Схема присвоения - это «имя = значение», см.:
In [1]: x = 1 ...: y = 'value' In [2]: x Out[2]: 1 In [3]: y Out[3]: 'value'
«x», «y» - это имена и 1, «значение» - значения. Попробуйте функцию в математике
In [4]: m = n**2 + 2*n + 1 NameError: name 'n' is not defined
Отчеты об ошибках, вы не можете написать математику непосредственно в качестве кода, «n» должно быть определено или присвоено значению.
In [8]: n = 3.14 In [9]: m = n**2 + 2*n + 1 In [10]: m Out[10]: 17.1396
Теперь он работает, что если вы настаиваете на объединении двух линий seperarte с одним. Наступает
lambda
In [13]: j = lambda i: i**2 + 2*i + 1 In [14]: j Out[14]:
> Не сообщалось об ошибках.
Это взгляд на
lambda
, он позволяет вам написать функцию в одной строке, как вы это делаете в математически в компьютер.Мы увидим это позже.
Давайте продолжим углубляться в «присвоение».
Как показано выше, символ равенства
=
работает для простых данных (1 и «значение») и простого выражения (n ** 2 + 2 * n + 1).Попробуйте следующее:
In [15]: x = print('This is a x') This is a x In [16]: x In [17]: x = input('Enter a x: ') Enter a x: x
Он работает для простых операторов, в python 7 имеется 11 типов. Простые инструкции - Документация Python 3.6.3
Как насчет составной инструкции,
In [18]: m = n**2 + 2*n + 1 if n > 0 SyntaxError: invalid syntax #or In [19]: m = n**2 + 2*n + 1, if n > 0 SyntaxError: invalid syntax
Наступает
def
включить ее работуIn [23]: def m(n): ...: if n > 0: ...: return n**2 + 2*n + 1 ...: In [24]: m(2) Out[24]: 9
Tada, проанализируйте его, 'm' - это имя, 'n ** 2 + 2 * n + 1' является значением.
:
является вариантом '='.Теперь вернемся к
lambda
, у нас есть функция с именем «m»Попробуйте:
g23]
In [28]: m = m(3) In [29]: m Out[29]: 16
Здесь есть два имени «m», функция
m
уже имеет имя, дублируется.Это форматирование:
In [27]: m = def m(n): ...: if n > 0: ...: return n**2 + 2*n + 1 SyntaxError: invalid syntax
Это не умная стратегия, поэтому отчеты об ошибках
Мы должны удалить одну из них, установить функцию без имени.
m = lambda n:n**2 + 2*n + 1
Это называется «анонимная функция»
В заключение,
lambda
в встроенной функции, которая позволяет вам написать функцию в одной прямой так же, как в математикеlambda
, АнонимНадеюсь, это поможет.
Если я правильно понимаю, вы не хотите, чтобы ваш код был связан с NServiceBus или MassTransit, и вы не хотите показывать, какой из них вы используете.
Во-первых, разделение:
Вы выполнили часть этого, определив свой собственный интерфейс IServiceBus
. Пока ваша библиотека зависит только от этого интерфейса, а не от какой-либо реализации, вы не должны быть связаны ни с одним из них.
Чтобы избежать такого соединения, я бы оставил конкретные реализации в отдельных проектах / библиотеках. Ваш «основной» домен также не должен ссылаться напрямую. Если вы можете выполнить модульное тестирование кода без какой-либо конкретной реализации, тогда вы можете свободно переключаться между реализациями.
Когда вы публикуете свою библиотеку, вы можете публиковать композицию вашей базовой библиотеки вместе с реализациями ее интерфейсов, которые вы выбрали.
Затем, скрывая, какая реализация используется:
Что касается не разоблачения, используете ли вы NServiceBus
или MassTransit
, вы не можете. Если кто-то ссылается на вашу библиотеку, и это зависит от одного из этих пакетов, ему также придется добавить этот пакет. Предполагая, что ваша библиотека упакована для NuGet, этот пакет покажет свои зависимости.