Разбираем модуль argparse для Python 3, который используется для написания программ, которые могут принимать параметры командной строки.
Python
В этой рубрике я буду писать статьи по программированию на языке Python 3.
Python 3 Многопроцессорность
В статье рассмотрим многопроцессорность в Python 3, а именно модуль multiprocessing и его классы: Process, Queue, Manager, Listen и Client.
Python 3 Синхронизация потоков
В статье я опишу механизмы Python 3 с помощью которых выполняется синхронизация потоков, а именно классы Event, Condition, Barrier и Semaphore.
Python 3 Многопоточность
В этой статье мы разбираем многопоточность в Python 3. Вспомним про GIL, рассмотрим модуль threading и его классы Thread, Timer и Rlock.
Python 3 — Исключения
В этой статье разбираем исключения (exception) и их обработку в Python 3. Познакомимся с операторами try, raise, assert и with.
Python 3. Классы и ООП
В этой статье разбираем классы в Python 3 и программирование в стиле ООП. А также узнаем про методы, наследование, полиморфизм и другое.
Python 3. Модули
Из этой статьи вы узнаете что такое модули в Python, для чего они нужны и как с ними можно работать. Познакомимся с операторами import, from и as.
Python 3. Функции
Разберём функции Python 3. Узнаем зачем они нужны, как их создавать и выполнять. Познакомимся с рекурсией, замыканиями и декораторами.
Python 3. Циклы и условия
В этой статье разбираем циклы и условия в Python 3. Именно эти вещи делают ваш код не линейным и более интересным.
Python 3. Арифметические операции
В этой статье разберем числовые типы данных в Python 3: int, float и complex, а также разберём арифметические операции.
Python 3. Работа с файлами
В статье будет описана работа с текстовыми файлами в Python 3. Вы научитесь сохранять строки и другие объекты в файлы а затем считывать их.
Python 3. Множества
В этой статье я разбираю Множества в Python 3. Вы узнаете, какими свойствами обладают множества и как можно с ними работать.
Свойства множеств
Я уже писал про последовательности и множества в Python 3. Множество — это неупорядоченная совокупность объектов, в которой не может быть дубликатов. Множество можно изменять, добавляя и удаляя из него объекты.
Объявить множество можно с помощью фигурных скобок, но в отличии от словарей не нужно указывать ключи. Создание множества и получение некоторых свойств множества показаны ниже:
### Код my_set = {1, 2, 3, 4, 5} # создание множества print(type(my_set)) # тип print(len(my_set)) # длина print(my_set) ### Исполнение <class 'set'> 5 {1, 2, 3, 4, 5}
Так как множество не упорядочены, то: обращение по индексу, срезы, конкатенация и повторение — здесь не работают.
Множества часто используются для двух целей:
- для удаления дубликатов;
- для проверки, входит ли элемент в множество (поиск в множестве занимает очень мало времени даже для очень больших множеств).
Работа с множествами
Добавить элемент в множество можно с помощью метода add():
### Код my_set = {1, 2, 3, 4, 5} my_set.add(6) print(my_set) ### Исполнение {1, 2, 3, 4, 5, 6}
Можно одно множество соединить с другим с помощью метода update():
### Код my_set1 = {1, 2, 3, 4, 5} my_set2 = {3, 4, 5, 6, 7} my_set1.update(my_set2) print(my_set1) ### Исполнение {1, 2, 3, 4, 5, 6, 7}
Метод update() может принять любой список:
### Код my_set = {1, 2, 3, 4, 5} my_set.update([7, 5, 3, 6, 2]) print(my_set) ### Исполнение {1, 2, 3, 4, 5, 6, 7}
Как можно заметить из результата выполнения кода, повторяющиеся значения, добавляемые в множество, игнорируются.
Удаление элемента из множества можно выполнить с помощью методов remove() и discard(). При этом, если удалять несуществующий элемент:
- с помощью remove() — то приложение выдаст ошибку,
- с помощью discard() — приложение ничего не удалит, но и ошибки не будет.
### Код my_set = {1, 2, 3, 4, 5} my_set.remove(1) my_set.discard(3) print(my_set) ### Исполнение {2, 4, 5} ### Код (удаление несуществующего элемента методом remove()) my_set = {1, 2, 3, 4, 5} my_set.remove(6) print(my_set) print("Конец!") # Сюда выполнение кода не дойдёт ### Исполнение Traceback (most recent call last): File "test2.py", line 2, in <module> my_set.remove(6) KeyError: 6 ### Код (удаление несуществующего элемента методом discard()) my_set = {1, 2, 3, 4, 5} my_set.discard(6) print(my_set) print("Конец!") # Сюда выполнение кода дойдёт ### Исполнение {1, 2, 3, 4, 5} Конец!
Некоторые специфичные операции над множествами продемонстрированы на следующем рисунке:
Эти же операции в виде кода:
# Множества my_set1 = {1, 5, 9, 6, 4} my_set2 = {6, 5, 1, 8, 2} # Пересечение print(my_set1 & my_set2) # {1, 5, 6} # Объединение print(my_set1 | my_set2) # {1, 2, 4, 5, 6, 8, 9} # Симметричная разница print(my_set1 ^ my_set2) # {2, 4, 8, 9} # Разница print(my_set1 - my_set2) # {9, 4} print(my_set2 - my_set1) # {8, 2}
Проверка на то, входит ли элемент в множество, осуществляется с помощью оператора in:
my_set = {15, 85, 12, 55, 95, 87, 33} print(95 in my_set) # True print(11 in my_set) # False
Так как множества должны вычислять хеш-код для каждого элемента, в них могут храниться только хешируемые элементы. В языке Python изменяемые элементы (список, словарь) не являются хешируемыми. То есть, такое множество нельзя создать:
my_set = {[1, 2, 3], ["один", "два"]}
А такое можно:
my_set = {(1, 2, 3), ("один", "два")}
Итог
В этой статье я немного рассказал про множества (set) в Python 3. Дополнительно, про некоторые особенности множеств можете почитать в официальной документации.
Python 3. Словари
В этой статье я разбираю Словари в Python 3. Вы узнаете, какими свойствами обладают словари и как можно с ними работать.
Свойства словарей
Я уже писал про последовательности и множества в Python 3. Словарь — наиболее гибкий тип данных в Python. Если списки и кортежи можно рассматривать как упорядоченные коллекции объектов, то словари — неупорядоченные коллекции. То есть элементы словаря не индексируются и обратиться к ним по индексу не получится.
Создавая элемент словаря вам нужно задать ему ключ. Затем к созданному элементу можно обращаться по этому ключу. Создаётся словарь с помощью фигурных скобок:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(my_dict['name']) ### Исполнение Alex
Чем-то напоминает json.
Основные свойства словарей:
- так как словарь не является последовательностью, то некоторые операции не поддерживаются:
- обращение по индексу и срезы;
- конкатенация и повторение;
- словарь это изменяемый объект, то есть добавлять, изменять и удалять элементы словаря можно;
- ключи не обязаны всегда быть строками, можно использовать и числа.
С помощью функции len(), можем узнать количество элементов в словаре:
### Код my_dict = {'name': 'Alex', 'date': '12.05.1985'} print(len(my_dict)) ### Исполнение 2
Работа со словарями в Python
Вывод значения по его ключу я уже показывал выше, но что будет, если искомого ключа в словаре не окажется:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(my_dict['ip']) ### Исполнение Traceback (most recent call last): File "test2.py", line 2, in <module> print(my_dict['ip']) ~~~~~~~^^^^^^ KeyError: 'ip'
Чтобы избежать ошибку, лучше извлекать данные из словаря с помощью метода get:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(my_dict.get('ip')) print(my_dict.get('name')) ### Исполнение None Alex
Метод get позволяет указать значение по умолчанию, оно будет выводиться вместо None, если ключ отсутствует:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(my_dict.get('ip', 'Нет такого ключа')) ### Исполнение Нет такого ключа
Можно вывести все ключи с помощью метода keys(), или все значения с помощью метода values(). Или можно вывести кортежи в виде пар «ключ : значение», с помощью метода items():
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(my_dict.keys()) print(my_dict.values()) print(my_dict.items()) ### Исполнение dict_keys(['name', 'date']) dict_values(['Alex', '12.05.1985']) dict_items([('name', 'Alex'), ('date', '12.05.1985')])
Преобразуя вывод items() в список, получим список кортежей:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(list(my_dict.items())) ### Исполнение [('name', 'Alex'), ('date', '12.05.1985')]
В примере выше получился действительно список кортежей, и к его элементам можно обращаться по индексу:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(list(my_dict.items())[0]) print(list(my_dict.items())[0][1]) ### Исполнение ('name', 'Alex') Alex
Добавить элемент в словарь можно таким способом:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} my_dict['position'] = 'IT engineer' print(my_dict) ### Исполнение {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'}
Удалить элемент из словаря можно с помощью метода pop():
### Код my_dict = {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'} my_dict.pop('position') print(my_dict) ### Исполнение {'name': 'Alex', 'date': '12.05.1985'}
А чтобы не возникла ошибка, если удаляемого ключа нет в словаре, можно методу pop() задать дополнительный параметр:
### Код my_dict = {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'} my_dict.pop('ip') print(my_dict) ### Исполнение Traceback (most recent call last): File "test2.py", line 2, in <module> my_dict.pop('ip') KeyError: 'ip' ### Код my_dict = {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'} my_dict.pop('ip', None) print(my_dict) ### Исполнение {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'} ### Код # Введённый мною элемент (None), будет выведен в консоль, если мы используем функцию print()) # Вместо None можно было задать любой другой объект, например строку my_dict = {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'} print(my_dict.pop('ip', None)) ### Исполнение None
Так как словарь это изменяемый объект, нужно быть аккуратным с присвоением двум переменным одного словаря:
### Код my_dict = {'name': 'Alex', 'date': '12.05.1985'} my_dict2 = my_dict my_dict2['position'] = 'IT engineer' print(my_dict) ### Исполнение {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'}
Чтобы этого избежать, словарь можно копировать с помощью метода copy():
### Код my_dict = {'name': 'Alex', 'date': '12.05.1985'} my_dict2 = my_dict.copy() my_dict2['position'] = 'IT engineer' print(my_dict) print(my_dict2) ### Исполнение {'name': 'Alex', 'date': '12.05.1985'} {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'}
А если у нас в словаре содержится ещё один словарь, то простым копированием не отделаться:
### Код my_dict = {'name': 'Alex', 'date': '12.05.1985', 'network' : {'ip' : '192.168.0.12', 'gateway' : '192.168.0.1'} } my_dict2 = my_dict.copy() my_dict2['network']['ip'] = '192.168.0.13' print(my_dict) print(my_dict2) ### Исполнение {'name': 'Alex', 'date': '12.05.1985', 'network': {'ip': '192.168.0.13', 'gateway': '192.168.0.1'}} {'name': 'Alex', 'date': '12.05.1985', 'network': {'ip': '192.168.0.13', 'gateway': '192.168.0.1'}}
При простом копировании у нас не копируется вложенный словарь, копируется лишь ссылка на него. Поэтому когда мы изменяем вложенный словарь, то изменяем его в обоих словарях.
Чтобы этого избежать, существует глубокое копирование. Это метод deepcopy() модуля copy:
### Код import copy my_dict = {'name': 'Alex', 'date': '12.05.1985', 'network' : {'ip' : '192.168.0.12', 'gateway' : '192.168.0.1'} } my_dict2 = copy.deepcopy(my_dict) my_dict2['network']['ip'] = '192.168.0.13' print(my_dict) print(my_dict2) ### Исполнение {'name': 'Alex', 'date': '12.05.1985', 'network': {'ip': '192.168.0.12', 'gateway': '192.168.0.1'}} {'name': 'Alex', 'date': '12.05.1985', 'network': {'ip': '192.168.0.13', 'gateway': '192.168.0.1'}}
Итог
Словари — достаточно интересный тип данных в Python. Словарь может содержать вложенные словари или списки и допускает большую вложенность. Объект типа «Словарь» изменяемый, поэтому этот объект можно изменять — добавляя, изменяя или удаляя элементы. Некоторые особенности словарей можете посмотреть здесь.
Python 3. Кортежи
В этой статье я разбираю Кортежи в Python 3. Вы узнаете, какими свойствами обладают кортежи и как можно с ними работать.