Есть ли Pythonic или компактный способ записать следующее if
заявление:Simplify если заявление питон
if head is None and tail is None:
print("Test")
Что-то вроде:
if (head and tail) is None:
Есть ли Pythonic или компактный способ записать следующее if
заявление:Simplify если заявление питон
if head is None and tail is None:
print("Test")
Что-то вроде:
if (head and tail) is None:
Если оба head
и tail
пользовательские экземпляры классов (как Node()
или аналогичные) без длины или логического значения, тогда просто используйте:
if not (head or tail):
Это не сработает, если эфиры head
или tail
могут быть объектами, отличными от None
с значением false-y (False
, числовые 0, пустые контейнеры и т. Д.).
В противном случае вы застряли в явных тестах. В логической логике нет «английской грамматики».
Обратите внимание, что значение проверки не является правдивым (не только для значения «Нет») –
'if not (head or tail)' (или 'if not head, а не tail') –
@ KirillBulygin: Мне сегодня нужно больше кофеина. –
Кстати, описания, подобные (head and tail) is None
, не допускаются при программировании по той же причине, почему (a and b) = 0
не допускается в математике (чтобы заставить каждое утверждение иметь только одну, каноническую форму; «Должен быть один очевидный способ сделать каждый вещь "также является explicit девизом Python).
Что ты имеешь в виду? '(head и tail) - это None' отлично подходит для Python, но он не делает того, что можно было бы ожидать от него. :) –
Я, конечно, имею в виду, что «(голова и хвост)« Ничто »написано с тем же намерением, что и« (a и b) = 0'. –
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
Ваш код примерно такой же Pythonic, каким он может быть.
Когда дело доходит до этих вещей, полезно помнить, что иногда простой вариант.
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
etc...
Нет, вот как вы его пишете. Предложение Martijn будет достаточным, если нет действительных, но значений false-y (например, '' ''). – jonrsharpe
Если нет вероятности того, что значения будут ложными по какой-либо другой причине: 'if not head and not tail:' –
Может ли 'head' или' tail' взять любое другое значение false-ish? –