Множества (set и frozenset)

Множество в python - "контейнер", содержащий не повторяющиеся элементы в случайном порядке.

Создаём множества:

>>> a = set()>>> aset()>>> a = set('hello')>>> a{'h', 'o', 'l', 'e'}>>> a = {'a', 'b', 'c', 'd'}>>> a{'b', 'c', 'a', 'd'}>>> a = {i ** 2 for i in range(10)} # генератор множеств>>> a{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}>>> a = {} # А так нельзя!>>> type(a)<class 'dict'>

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

Множества удобно использовать для удаления повторяющихся элементов:

>>> words = ['hello', 'daddy', 'hello', 'mum']>>> set(words){'hello', 'daddy', 'mum'}

С множествами можно выполнять множество операций: находить объединение, пересечение...

· len(s) - число элементов в множестве (размер множества).

· x in s - принадлежит ли x множеству s.

· set.isdisjoint(other) - истина, если set и other не имеют общих элементов.

· set == other - все элементы set принадлежат other, все элементы other принадлежат set.

· set.issubset(other) или set <= other - все элементы set принадлежат other.

· set.issuperset(other) или set >= other - аналогично.

· set.union(other, ...) или set | other | ... - объединение нескольких множеств.

· set.intersection(other, ...) или set & other & ... - пересечение.

· set.difference(other, ...) или set - other - ... - множество из всех элементов set, не принадлежащие ни одному из other.

· set.symmetric_difference(other); set ^ other - множество из элементов, встречающихся в одном множестве, но не встречающиеся в обоих.

· set.copy() - копия множества.

И операции, непосредственно изменяющие множество:

· set.update(other, ...); set |= other | ... - объединение.

· set.intersection_update(other, ...); set &= other & ... - пересечение.

· set.difference_update(other, ...); set -= other | ... - вычитание.

· set.symmetric_difference_update(other); set ^= other

· set.add(elem) - добавляет элемент в множество.

· set.remove(elem) - удаляет элемент из множества. KeyError, если такого элемента не существует.

· set.discard(elem) - удаляет элемент, если он находится в множестве.

· set.pop() - удаляет первый элемент из множества. Так как множества не упорядочены, нельзя точно сказать, какой элемент будет первым.

· set.clear() - очистка множества.

Frozenset

Единственное отличие set от frozenset заключается в том, что set - изменяемый тип данных, а frozenset - нет. Примерно похожая ситуация с списками и кортежами.



>>> a = set('qwerty')>>> b = frozenset('qwerty')>>> a == bTrue>>> type(a - b) >>> type(a | b) >>> a.add(1)>>> b.add(1)Traceback (most recent call last): File "", line 1, in b.add(1)AttributeError: 'frozenset' object has no attribute 'add'

Функции

Именные функции, инструкция def

Функция в python - объект, принимающий аргументы и возвращающий значение Обычно функция определяется с помощью инструкции def.

Определим простейшую функцию:

def add(x, y): return x + y

Инструкция return говорит, что нужно вернуть значение В нашем случае функция возвращает сумму x и y.

Теперь мы ее можем вызвать:

>>> add(1, 10)11>>> add('abc', 'def')'abcdef'

Функция может быть любой сложности и возвращать любые объекты (списки, кортежи, и даже функции!):

>>> def newfunc(n): def myfunc(x): return x + n return myfunc >>> new = newfunc(100) # new - это функция>>> new(200)300>>>

Функция может и не заканчиваться инструкцией return, при этом функция вернет значение None:

>>> def func(): pass >>> print(func())None>>>

Аргументы функции

Функция может принимать произвольное количество аргументов или не принимать их вовсе. Также распространены функции с произвольным числом аргументов, функции с позиционными и именованными аргументами, обязательными и необязательными.

>>> def func(a, b, c=2): # c - необязательный аргумент return a + b + c >>> func(1, 2) # a = 1, b = 2, c = 2 (по умолчанию)5>>> func(1, 2, 3) # a = 1, b = 2, c = 36>>> func(a=1, b=3) # a = 1, b = 3, c = 26>>> func(a=3, c=6) # a = 3, c = 6, b не определенTraceback (most recent call last): File "", line 1, in func(a=3, c=6)TypeError: func() takes at least 2 arguments (2 given)

Функция также может принимать переменное количество позиционных аргументов, тогда перед именем ставится *:

>>> def func(*args): return args >>> func(1, 2, 3, 'abc')(1, 2, 3, 'abc')>>> func()()>>> func(1)(1,)

Как видно из примера, args - это кортеж из всех переданных аргументов функции, и с переменной можно работать также, как и с кортежем.

Функция может принимать и произвольное число именованных аргументов, тогда перед именем ставится **:

>>> def func(**kwargs): return kwargs >>> func(a=1, b=2, c=3){'a': 1, 'c': 3, 'b': 2}>>> func(){}>>> func(a='python'){'a': 'python'}>>>

В переменной kwargs у нас хранится словарь, с которым мы, опять-таки, можем делать все, что нам заблагорассудится.

Анонимные функции, инструкция lambda

Анонимные функции могут содержать лишь одно выражение, но и выполняются они быстрее. Анонимные функции создаются с помощью инструкции lambda. Кроме этого, их не обязательно присваивать переменной, как делали мы инструкцией def func():

>>> func = lambda x, y: x + y>>> func(1, 2)3>>> func('a', 'b')'ab'>>> (lambda x, y: x + y)(1, 2)3>>> (lambda x, y: x + y)('a', 'b')'ab'>>>

lambda функции, в отличие от обычной, не требуется инструкция return, а в остальном, ведет себя точно так же:

>>> func = lambda *args: args>>> func(1, 2, 3, 4)(1, 2, 3, 4)>>>

Наши рекомендации