Возврат boolean, если set пуст

Я изо всех сил пытаюсь найти более чистый способ возврата логического значения, если мой набор пуст в конце моей функции

Я беру пересечение двух наборов и хочу вернуть 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 с пустыми наборами, вывести логическое значение. Пока что единственное, что я могу придумать, это возвращение не с

 >>> 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