Является ли строка панграммой?

Требуется проверить, является ли строка панграммой, т.е если в строке все буквы алфавита.

И я ее решил таким образом:

def is_pangram(s):
    return set('abcdefghijklmnopqrstuvwxyz') == set(s.lower().replace(' ', ''))

text = input()

print(is_pangram(text))

Но нашел схожее решение:

def is_pangram(s):
    return not set('abcdefghijklmnopqrstuvwxyz') - set(s.lower())

text = input()

print(is_pangram(text))

Не могу понять 2х вещей:

  1. почему вычитая одно множество из другого куда-то девается знак пробела
  2. почему добавляя логический оператор not функция возвращает булево значение

Ответы (1 шт):

Автор решения: MaxU

почему вычитая одно множество из другого куда-то девается знак пробела?

Когда мы вычитаем множество B из A в результирующем множестве остаются только те элементы из множества A, которые не встречаются в множестве B.

В множества A символ пробела отсутствует, поэтому он не может быть в результате.


почему добавляя логический оператор not функция возвращает булево значение?

In [163]: not set()
Out[163]: True

интерпретируется как:

In [165]: not bool(set())
Out[165]: False

именно это и происходит при проверке результата

PS здесь можно подробнее прочитать о том как работает not <expression> в Python и как это реализовано в исходном коде Python

→ Ссылка