2016-12-02 9 views
1

Есть ли Pythonic или компактный способ записать следующее if заявление:Simplify если заявление питон

if head is None and tail is None: 
    print("Test") 

Что-то вроде:

if (head and tail) is None: 
+0

Нет, вот как вы его пишете. Предложение Martijn будет достаточным, если нет действительных, но значений false-y (например, '' ''). – jonrsharpe

+0

Если нет вероятности того, что значения будут ложными по какой-либо другой причине: 'if not head and not tail:' –

+1

Может ли 'head' или' tail' взять любое другое значение false-ish? –

ответ

4

Если оба head и tail пользовательские экземпляры классов (как Node() или аналогичные) без длины или логического значения, тогда просто используйте:

if not (head or tail): 

Это не сработает, если эфиры head или tail могут быть объектами, отличными от None с значением false-y (False, числовые 0, пустые контейнеры и т. Д.).

В противном случае вы застряли в явных тестах. В логической логике нет «английской грамматики».

+0

Обратите внимание, что значение проверки не является правдивым (не только для значения «Нет») –

+2

'if not (head or tail)' (или 'if not head, а не tail') –

+0

@ KirillBulygin: Мне сегодня нужно больше кофеина. –

0

Кстати, описания, подобные (head and tail) is None, не допускаются при программировании по той же причине, почему (a and b) = 0 не допускается в математике (чтобы заставить каждое утверждение иметь только одну, каноническую форму; «Должен быть один очевидный способ сделать каждый вещь "также является explicit девизом Python).

+1

Что ты имеешь в виду? '(head и tail) - это None' отлично подходит для Python, но он не делает того, что можно было бы ожидать от него. :) –

+0

Я, конечно, имею в виду, что «(голова и хвост)« Ничто »написано с тем же намерением, что и« (a и b) = 0'. –

2
if head is None and tail is None: 
    print("Test") 

чистый и эффективный. И если один из head или tail может возможно принять ложно-иш значения кроме None но вы хотите только "Test" быть напечатаны, когда они оба None то, что вы написали безопаснее, чем

if not (head or tail):   
    print("Test") 

Более компактная версия (чем ваш код), который до сих пор безопасным & эффективным является

if head is None is tail: 
    print("Test") 

head is None is tail фактически эквивалентно (head is None) and (None is tail). Но я думаю, что это немного менее читаемо, чем ваша оригинальная версия.

КСТАТИ (head and tail) is Noneявляется действительным синтаксисом Python, но это не рекомендуется, так как он не делает то, что вы могли бы на первом ожидать, что это сделать:

from itertools import product 

print('head, tail, head and tail, result') 
for head, tail in product((None, 0, 1), repeat=2): 
    a = head and tail 
    print('{!s:>4} {!s:>4} {!s:>4} {!s:>5}'.format(head, tail, a, a is None)) 

выхода

head, tail, head and tail, result 
None None None True 
None 0 None True 
None 1 None True 
    0 None 0 False 
    0 0 0 False 
    0 1 0 False 
    1 None None True 
    1 0 0 False 
    1 1 1 False 
1

Ваш код примерно такой же Pythonic, каким он может быть.

Когда дело доходит до этих вещей, полезно помнить, что иногда простой вариант.

Beautiful is better than ugly. 
Explicit is better than implicit. 
Simple is better than complex. 
etc... 
Смежные вопросы