У меня есть следующая функция лямбды:
f = lambda x: x == None and '' or x
Это должно возвратить пустую строку, если это не получает Ни один как аргумент или аргумент, если это не Ни один.
Например:
>>> f(4)
4
>>> f(None)
>>>
Если я называю f (Ни один) вместо того, чтобы получить пустую строку, я не получаю Ни один. Я распечатал тип того, что возвращенная функция и я получил NoneType. Я ожидал строку.
введите ('') строку возвратов, таким образом, я хотел бы знать, почему лямбда не возвращает пустую строку, когда я не передаю Ни один как аргумент.
Я довольно плохо знаком с лямбдами, таким образом, я, возможно, неправильно понял некоторые вещи о том, как они работают.
используйте конструкцию if else
f = lambda x:'' if x is None else x
Проблема в том, что Python обрабатывает пустую строку как False. Когда вы передаете None своей функции, она оценивается как:
None == None and '' or None
, что (фактически) становится:
True and False or None
, затем:
False or None
и, наконец:
None
Одно решение:
lambda x: x if x is not None else ''
Если вы знаете, что x будет либо строка или None, тогда вы можете использовать тот факт, что None также является значением False в Python:
lambda x: x or ''
Проблема в вашем случае в том, что '' считается логическим False. bool ('') == False. Вы можете использовать
f =lambda x:x if x is not None else ''
Проблема не в лямбдах. Это питоническое выражение if / elseg, которое вы там используете.
(условие) и (выражение1) или (выражение2)
в большинстве случаев означает (условие)? (выражение1): (выражение2)
можно ожидать, кроме случая, когда выражение1
оценивается как Ложь.
Это потому, что все оценивается по порядку. Если условие
не выполняется, вычисляется выражение1
. Если это Истина
, оно возвращается из-за оценки короткого замыкания, следовательно, это ожидаемое поведение. В противном случае возвращается выражение2
. ''
оценивается как Ложь.
Попробуйте оценку короткого замыкания :
>>> g = lambda x: x or ''
>>> g(3)
3
>>> g(None)
''
>>> # beware that ...
>>> g(0)
''
Python дает и
более высокий приоритет, чем или
, поэтому здесь располагаются круглые скобки:
lambda x: (x == None and '') or x
Когда передано Нет
, это становится (Истина и '') или Нет
. Логические операторы Python работают, возвращая тот или иной аргумент (отсюда и этот небольшой трюк), так что это сводится к '' или None
, и, наконец, None
.
Этот небольшой трюк появился еще до Python 2.5, в котором не было условного оператора . Предупреждение, с которым вы только что столкнулись, заключается в том, что он не ведет себя должным образом, когда ветвь True
имеет значение False
. Если вас не интересует Python ≤ 2.4, просто используйте условный оператор.