Ошибки имен с лямбда-функциями в Python - PullRequest
0 голосов
/ 14 марта 2019

Я работаю со следующим примером. Я хотел запустить свой код с mu>=0.9 в последней строке следующего фрагмента.

alpha,beta,loc,scale = stats.beta.fit(value)  

error=(scale/(1.96))**2

gpdf = lambda B0, mu, sigma2: 1/np.sqrt(2*pi*sigma2)*np.exp(-1/2*((B0-mu)**2)/sigma2)
approx_sigma2 = lambda scale: (scale/(1.96))**2
ggpdf_v  = lambda B0, D0, error: gpdf(B0, mu=0.8, sigma2=error) * (D0 < 3) + (D0 >= 3) * gpdf(B0, mu=0.5, sigma2=error)
ggpdf_r  = lambda B0, D0, error: gpdf(B0, mu=0.5, sigma2=error)
ggpdf_c  = lambda B0, D0, error: gpdf(B0, mu=0.7, sigma2=error)
ggpdf_v  = lambda B0, D0, error: gpdf(B0, mu>=0.9, sigma2=error)

Однако я получаю эту ошибку NameError: name 'mu' is not defined. Это уже определено, но я не вижу проблемы. Как я могу исправить эту ошибку?

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

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

Вот минимальный пример, который показывает проблему.

>>> f1 = lambda a: None
>>> f2 = lambda: f1(a >= 0)
>>> f2()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
NameError: name 'a' is not defined
0 голосов
/ 14 марта 2019

Этот

gpdf(B0, mu=0.7, sigma2=error)

фактически является синтаксисом для функции, присваивая 0,7 аргументу с именем mu в этой функции, а значение error аргументу с именем sigma2 в этой функции.

mu>=0.9 не является допустимым синтаксисом Python для назначения ключевого аргумента в вызове функции, но это допустимое обычное выражение Python.Но для оценки этого выражения необходимо определить переменную mu, а это не так.Но даже если бы он был определен, я сомневаюсь, что он будет делать то, что вы хотите: он передаст True в качестве аргумента этой функции.

...