Ответ 1
def myfunc(a,b):
c = a.intersection(b)
return bool(c)
bool()
будет делать что-то похожее на not not
, но более идеоматично и ясно.
Я пытаюсь найти более чистый способ возврата логического значения, если мой набор пуст в конце моей функции
Я беру пересечение двух наборов и хочу вернуть True
или False
на основании того, что результирующий набор пуст.
def myfunc(a,b):
c = a.intersection(b)
#...return boolean here
Моя первоначальная мысль заключалась в том, чтобы сделать
return c is not None
Однако в моем интерпретаторе я легко вижу, что оператор вернет true, если c = set([])
>>> c = set([])
>>> c is not None
True
Я также пробовал все из следующих действий:
>>> c == None
False
>>> c == False
False
>>> c is None
False
Теперь я прочитал из документации, что я могу использовать только and
, or
и not
с пустыми наборами, чтобы вывести логическое значение. Пока что единственное, что я могу придумать, это вернуть не c
>>> not not c
False
>>> not c
True
У меня есть чувство, что есть намного более питонический способ сделать это, я изо всех сил пытаюсь его найти. Я не хочу возвращать фактический набор в оператор if, потому что мне не нужны значения, я просто хочу знать, пересекаются ли они.
def myfunc(a,b):
c = a.intersection(b)
return bool(c)
bool()
будет делать что-то похожее на not not
, но более идеоматично и ясно.
не как пифонические, как другие ответы, а математика:
return len(c) == 0
Если вы хотите return True
для пустого набора, то я думаю, что было бы более ясным:
return c == set()
то есть. "c
равно пустой set
".
(Или, наоборот, return c != set()
).
По-моему, это более явный (хотя и менее идиоматический), чем полагающийся на интерпретацию Python пустого набора как False
в булевом контексте.
Если c
- это набор, вы можете проверить, пуст ли он: return not c
.
Если c
пусто, то not c
будет True
.
В противном случае, если c
содержит любые элементы not c
будет False
.
Когда вы говорите:
c is not None
Фактически вы проверяете, ссылаются ли c и None на один и тот же объект. Это то, что делает оператор "есть". В python None - это специальное значение null, которое обычно означает, что у вас нет доступного значения. Сорта вроде null в c или java. Поскольку python внутренне присваивает только одно значение None, используя оператор "is", чтобы проверить, работает ли что-то None (think null), и стал популярным. Однако это не связано с истинным значением множества c, он проверяет, что c фактически является множеством, а не нулевым значением.
Если вы хотите проверить, является ли набор пустым в условном выражении, он отображается как булев в контексте, поэтому вы можете просто сказать:
c = set()
if c:
print "it has stuff in it"
else:
print "it is empty"
Но если вы хотите, чтобы он преобразовывался в булев, который нужно сохранить, вы можете просто сказать:
c = set()
c_has_stuff_in_it = bool(c)
Не так чисто, как bool (c), но это было оправдание для использования тернарности.
def myfunc(a,b):
return True if a.intersection(b) else False
Также, используя бит одной и той же логики, нет необходимости назначать c, если вы не используете его для чего-то еще.
def myfunc(a,b):
return bool(a.intersection(b))
Наконец, я бы предположил, что вы хотите значение True/False, потому что вы собираетесь выполнять с ним некоторый булевский тест. Я бы рекомендовал пропустить накладные расходы на вызов функции и определение, просто проверив, где вам это нужно.
Вместо:
if (myfunc(a,b)):
# Do something
Возможно, это:
if a.intersection(b):
# Do something
"""
This function check if set is empty or not.
>>> c = set([])
>>> set_is_empty(c)
True
:param some_set: set to check if he empty or not.
:return True if empty, False otherwise.
"""
def set_is_empty(some_set):
return some_set == set()