Множества (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)Функция также может принимать переменное количество позиционных аргументов, тогда перед именем ставится *:
Как видно из примера, 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():
lambda функции, в отличие от обычной, не требуется инструкция return, а в остальном, ведет себя точно так же:
>>> func = lambda *args: args>>> func(1, 2, 3, 4)(1, 2, 3, 4)>>>