Познакомимся с базовыми объектами языка Python и структурами данных. Если вы знаете хотя бы один высокоуровневый язык программирования, то скорее всего ничего нового вы тут не найдете. С другой стороны, я расскажу в этой статье о вещах, которые по-моему, сделаны удобнее в Python, нежели в Java.
Что за зверь Python?
Так как это моя первая статья о Python, пайтон или питон, называйте как нравится, я начну повествование с описания некоторых особенностей языка:
- Высокоуровневый язык, который позволяет писать программы в разных стилях: ООП, императивном, функциональном, аспекто-ориентированном и других. Одним словом – мультипарадигменный.
- Динамическая типизация. Переменная связывается с типом во время присвоения, а не в момент объявления. Если вы знакомы с PHP или JS, вы можете представить как это работает. В одном месте переменная используется как String, а в другом в нее можно положить Number и продолжить работу.
- Автоматическое управление памятью. В отличии от C/C++ вам не нужно самостоятельно управлять памятью, писать дескрипторы и прочие связанные вещи. Как и в Java, на помощь вам придет Garbage Collector.
- Поддерживает интроспекцию – получение типа объекта во время выполнения. В Python для этого нужно вызвать функцию type(object), в Java это оператор instanceof.
- Поддержка многопоточности.
- Возможность разбить код на модули и пакеты.
- Генераторы
- Компилируемый язык. Компилируется в python-байткод и выполняется на виртуальной машине python (PVM).
Numbers
В Python, есть 3 числовых типа: целочисленный тип (int), числа с плавающей точкой (float), а так же комплексные числа (complex). Поддерживает все базовые операции с числовыми типами. Над числами разных типов можно производить вычисления. Результатом будет являться более “широкий” тип: int+float=float; float + complex = complex;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
x=10 y=1000000000000000000000000 f=10.01 z=3+2j print(type(x)) print(type(y)) print(type(f)) print(type(z)) print(x+f) print(z) # ВЫВОД <class 'int'> <class 'int'> <class 'float'> <class 'complex'> 20.009999999999998 (3+2j) |
Обратите внимание, что число 10^24 является int!
String
Python имеет очень сильную поддержку и простоту в работе со строками. Как и в Java, объекты Sting являются неизменяемыми (Immutable). Строку можно записывать как в одинарные кавычки, так и в двойные, и тройные, и любое другое количество кавычек, даже 7:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
s1 = "Igor ivanovich" s2 = 'Igor Ivanovich' s3 = """Igor Ivanovich""" s4 = """""""Igor Ivanovich""""""" print(s1) print(s2) print(s3) print(s4) # Вывод Igor ivanovich Igor Ivanovich Igor Ivanovich Igor Ivanovich |
Интересной особенностью Python в работе как со строками так и со списками, является индексирование. Оно двунаправленное: от 0 до длины строки – 1, и в обратную сторону от -1 до -длины строки:

1 2 3 4 5 6 |
s1 = "Igor vanovich" print(s1[0]) print(s1[-1]) #Вывод I h |
Классной фичей языка является метод “нарезки” (slicing) – получение подстроки, перебор всех элементов списка с определенным шагом с определенной позиции. Прозрачный и простой синтаксис. Рассмотрим на примере и сразу все будет ясно:
1 2 3 4 5 6 7 8 9 10 |
s1 = "Igor_ivanovich" print(s1[1:]) # Получение строки начиная с символа индекса 1 print(s1[1:5]) # Получение подстроки с индекса 1 (включительно) по индекс 5 (не включая) print(s1[::-1]) # вывод строки в обратном порядке print(s1[::2]) # вывод строки с шагом 2 #Вывод gor_ivanovich gor_ hcivonavi_rogI Io_vnvc |
Работает следующим образом: строка[индекс начала:индекс конца:шаг]. Обратите внимание, что поля могут быть пустыми. Если указать отрицательный шаг, то проход будет осуществляться в обратную сторону! Данный функционал работает так же для списков и других итерируемых структур.
Для строк работает операция умножение (*) – увеличивает количество символов на множитель.
1 |
s1 = "Igor ivanovich "<br>print(s1*5)<br># Вывод<br><br>Igor ivanovich Igor ivanovich Igor ivanovich Igor ivanovich Igor ivanovich |
Lists
Списки в Python представляют собой последовательность элементов не обязательно одного типа. Структура изменяемая (Mutable) (в отличии от String), поддерживает хранение дублируемых данных. Для иницилизации списка нужно объявить его в квадратных скобках []:
1 2 3 4 5 |
my_list = [1, 2, 3, 4, 5, 'Igor', "Ivanovich", 3.5] print(my_list) # Вывод [1, 2, 3, 4, 5, 'Igor', 'Ivanovich', 3.5] |
Индексирование и “нарезка” работает аналогично строкам. В отличии от строк, мы можем изменить элемент списка.
1 2 3 4 5 6 7 8 9 |
my_list = [1, 2, 3, 4, 5, 'Igor', "Ivanovich", 3.5] print(my_list[::-1]) # выводит список в обратном порядке my_list[0]='Renat' # изменяем первый элемент в списке print(my_list) # Вывод [3.5, 'Ivanovich', 'Igor', 5, 4, 3, 2, 1] ['Renat', 2, 3, 4, 5, 'Igor', 'Ivanovich', 3.5] |
Списки поддерживают конкатенацию, умножение:
1 2 3 4 5 6 |
my_list = [1, 2, 3, 4, 5, 'Igor', "Ivanovich", 3.5] print(my_list + ['Renat']) # Слияние списков print(my_list*3) # Вывод [1, 2, 3, 4, 5, 'Igor', 'Ivanovich', 3.5, 'Renat'] [1, 2, 3, 4, 5, 'Igor', 'Ivanovich', 3.5, 1, 2, 3, 4, 5, 'Igor', 'Ivanovich', 3.5, 1, 2, 3, 4, 5, 'Igor', 'Ivanovich', 3.5] |
Так же для списков доступны методы, которые дают возможность работать со списком как с очередью или стеком:
1 |
my_list = [1, 2, 3, 4, 5, 'Igor', "Ivanovich", 3.5]<br>print(my_list.pop()) # получили последний элемент и удалили его из списка<br>print(my_list)<br># Вывод<br>3.5<br>[1, 2, 3, 4, 5, 'Igor', 'Ivanovich'] |
Списки могут быть любой вложенности. Навигация к объектам напоминает многомерный массив:
1 2 3 4 |
my_list = [1, 2, ['Igor',['Ivanovich']]] print(my_list[2][1][0]) # получение ивановича # Вывод Ivanovich |
Dictionaries
Словари – структура данных такая как Map в Java. Элементы хранятся как пары “ключ – значение“. Словарь записывается в фигурные скобки {} . Доступ к элементу осуществляется по ключу. Опять же в силу динамической типизации в одном словаре могут хранится разнотипные значения.
1 2 3 4 5 |
my_map = {'k1':1, 'k2':'Igor','k3':[1,2,3]} print(my_map['k3'][::-1]) # вывод списка, который лежит в словаре в обратном порядке # Вывод [3, 2, 1] |
Как видите из примера, синтаксис языка очень прост и понятен. Позволяет делать сложные операции в одной строке.
Tuples
Tuples или по-русски кортежи – это структура данных, по сути являющаяся неизменяемым списком. Объявляется в круглых скобках (). Доступ к элементу осуществляется по индексу, хранить можно элементы разных типов, поддерживает нарезку (slicing):
1 2 3 4 5 |
my_tuple = (1,2,'Igor') print(my_tuple[::-1]) # вывод кортежа в обратном порядке # Вывод ('Igor', 2, 1) |
Sets
Sets или множества – неупорядоченная структура данных, похожая на список, хранящая только уникальные элементы. Чтобы инициализировать множество можно воспользоваться функцией set(), либо объявить множество в фигурных скобках. Список можно преобразовать в множество. Т.к. Set – не упорядоченная структура, обращение к элементу по индексу невозможно:
1 2 3 4 5 6 7 8 9 |
my_set = {1,2,3,4,'Igor'} my_set.add(1) # Ничего не произойдет т.к. этот элемент уже етсь в списке print(my_set) my_set2 = set([1,1,1,2,2,2,3,3,3]) # Получение множества из списка print(my_set2) # Вывод {1, 2, 3, 4, 'Igor'} {1, 2, 3} |
Boolean
Много о Boolean не сказать. Есть два варианта: True или False. Является результатом сравнения элементов и подобных операций.
1 2 3 4 5 6 |
b = True print(b) print(5<3) # Вывод True False |
Выводы
Мы познакомились с основными типами данных языка программирования Python, рассмотрели основные операции над ними, некоторые возможности и функции. Так же коснулись некоторых особенностей самого языка Python. В отличии от других языков с строгой типизацией, Python является очень гибким, но за эту гибкость приходится платить в других местах. Если вы знаете основы программирования, или еще лучше, какой-нибудь высокоуровневый язык программирования, освоить азы работы с Python для вас не составит особого труда! Запомните: в фигурных скобках {} – множества и словари, в круглых () – кортежи, в квадратных [] – списки!
4 comments On Объекты Python и базовые структуры данных
>> Поддерживает интроспекцию — получение типа объекта во время выполнения. В Python для этого нужно вызвать функцию type(object), в Java это оператор instanceof.
мб в java это .getClass() ?
Тут нужно разделять интроспекцию и рефлексию. Интроспекция просто позволяет узнать к какому классу относится объект во время выполнения, для этого используется оператор instanceof. Рефлексия, например, через getClass(), позволяет не только узнать к какому классу относится объект, но и дает возможность манипулировать объектом.
Тут смысл не в рефлексии. Насколько я понял из статьи, то type(object) как раз возвращает ТИП ОБЪЕКТА, т.е. его класс. В java же instance of это оператор , который говорит, является ли ОБЪЕКТ подпитом класса, который передаем вторым параметром. Т.е. сравнивать type(object) и object instanceof не совсем корректно, и поэтому аналогом type является .getClass(). Аналогом instanceof в python будет оператор is
Да, вы все правильно поняли! И вы правы. Но все таки сравнивать type(object) и .getClass() так же некорректно, потому что через .getClass() вы можете проводить манипуляции над объектом: вызывать конструктор, методы, получить доступ к полям и т.п. возможности рефлексии. Используя type(object) вы не получите возможность изменять объект, а только лишь узнаете информацию о нем – его тип. В статье упор делается на то, что inctanceof и type(object) оба являются инструментами интроспекции – позволяют лишь узнать что это за объект, не давая возможности к его изменению. Хотя технически еще раз напишу вы абсолютно правы: type(object) вернет тип, а результатом вызова inctanceof будет булево значение