Лямбда Python, не возвращая Ни один вместо пустой строки

У меня есть следующая функция лямбды:

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

Это должно возвратить пустую строку, если это не получает Ни один как аргумент или аргумент, если это не Ни один.

Например:

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

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

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

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

8
задан Virgiliu 3 April 2010 в 20:27
поделиться

6 ответов

используйте конструкцию if else

f = lambda x:'' if x is None else x
20
ответ дан 5 December 2019 в 04:52
поделиться

Проблема в том, что 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 ''
4
ответ дан 5 December 2019 в 04:52
поделиться

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

f =lambda x:x if x is not None else ''
8
ответ дан 5 December 2019 в 04:52
поделиться

Проблема не в лямбдах. Это питоническое выражение if / elseg, которое вы там используете.

(условие) и (выражение1) или (выражение2) в большинстве случаев означает (условие)? (выражение1): (выражение2) можно ожидать, кроме случая, когда выражение1 оценивается как Ложь.

Это потому, что все оценивается по порядку. Если условие не выполняется, вычисляется выражение1 . Если это Истина , оно возвращается из-за оценки короткого замыкания, следовательно, это ожидаемое поведение. В противном случае возвращается выражение2 . '' оценивается как Ложь.

2
ответ дан 5 December 2019 в 04:52
поделиться

Попробуйте оценку короткого замыкания :

 >>> g = lambda x: x or ''
 >>> g(3)
 3
 >>> g(None)
 ''
 >>> # beware that ...
 >>> g(0)
 ''
2
ответ дан 5 December 2019 в 04:52
поделиться

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

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

Когда передано Нет , это становится (Истина и '') или Нет . Логические операторы Python работают, возвращая тот или иной аргумент (отсюда и этот небольшой трюк), так что это сводится к '' или None , и, наконец, None .

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

3
ответ дан 5 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: