2010-04-03 2 views
7

У меня есть следующие функции лямбды:Python лямбда не возвращается None вместо пустой строки

f = lambda x: x == None and '' or x 

Он должен возвращать пустую строку, если она не получает None в качестве аргумента, или аргумент, если он не не None.

Например:

>>> f(4) 
4 
>>> f(None) 
>>> 

Если я позвоню е (None) вместо того, чтобы пустая строка, я получаю None. Я напечатал тип возвращаемой функции и получил NoneType. Я ожидал струны.

тип ('') возвращает строку, поэтому я хотел бы знать, почему лямбда не возвращает пустую строку, когда я передаю None в качестве аргумента.

Я довольно новичок в лямбдах, поэтому я, возможно, неправильно понял некоторые вещи о том, как они работают.

+2

Вы совершили один из классических Грубые ошибки ... – PaulMcG

ответ

17

использовать если еще построить

f = lambda x:'' if x is None else x 
2

Это проблема не лямбда. Это pythonic if/else expressiong, которое вы там используете.

(condition) and (expression1) or (expression2) большую часть времени означает (condition) ? (expression1) : (expression2), которого вы ожидаете, за исключением случаев, когда expression1 оценивает False.

Это потому, что все это оценивается по порядку. Если condition сбой, оценивается expression1. Если это True, он возвращается из-за короткого замыкания, следовательно, ожидаемое поведение. Если нет, возвращается expression2. '' оценивает значение False.

+0

Да, и/или шаблон не очень Pythonic .. не используйте его! Держать его просто глупо! –

8

Проблема в вашем случае, что '' считается логическим значением False. bool ('') == False. Вы можете использовать

f =lambda x:x if x is not None else '' 
2

Попробуйте short-circuit evaluation:

>>> g = lambda x: x or '' 
>>> g(3) 
3 
>>> g(None) 
'' 
>>> # beware that ... 
>>> g(0) 
'' 
+0

Я не думаю, что 'g (0)' возвращает то, что хочет OP. –

2

Python дает and более высокий приоритет, чем or, поэтому круглые скобки падают здесь:

lambda x: (x == None and '') or x 

Пройдя None, это будет (True and '') or None. Булевы операторы Python работают, возвращая один или несколько аргументов (откуда этот небольшой трюк), поэтому это сводится к '' or None и, наконец, None.

Этот маленький трюк начинается со спины перед Python 2.5, у которого не было conditional operator. Оговорка, с которой вы столкнулись, заключается в том, что она не ведет себя так, как ожидалось, когда True имеет значение False. Если вы не заинтересованы в Python ≤ 2.4, просто используйте условный оператор.

4

Проблема в том, что Python обрабатывает пустую строку как False.Когда вы проходите Нет для вашей функции, она имеет значение:

None == None and '' or None 

который (фактически) становится:

True and False or None 

затем:

False or None 

и, наконец:

None 

Одним из решений будет:

lambda x: x if x is not None else '' 

Если вы знаете х будет строкой или None, то вы можете использовать тот факт, что ни один не является также Ложное значение в Python:

lambda x: x or '' 
Смежные вопросы