Python Урок 4 — Основные типы данных (Числа, Строки)

В Python 3 все является объектом. Мы забегаем немного вперед, но какое-то общее понимание нам необходимо чтобы двигаться дальше. Если говорить абстрактно, то объект это некоторое состояние (набор характеристик/свойств и их значения) и методы, которые могут работать с внутренним состоянием и входящими данными. С объектом тесно связано определение класса. Если быть точнее, то на основе описания класса, мы можем создавать новые объекты этого класса, иногда говорят «этого типа», эти определения наверное можно считать идентичными.

Перечислим некоторые основные типы данных:

  • Числа
  • Строки
  • Списки
  • Словари
  • Кортежи
  • Множества
  • Файлы
  • Прочие типы (булевские значения, сами типы, None)
  • Типы программных единиц (функции, модули, классы)
  • и т.д

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

Числа

Кроме целых чисел, есть еще множество уже встроенных реализаций (вещественные числа; десятичные дроби; комплексные числа; и т.д.). Возможно кого-то это удивит, но числа (как и все остальное) в Python являются объектом. Это означает что у этих объектов есть свои свойства и методы этого типа объекта.

На примере чисел, узнаем как определить тип данных, узнать список характеристик и функций, а так же какие методы есть у этого типа данных и как получить описание метода. Урок предлагаю проводить в интерактивном режиме, это лучший способ для изучения чего-то нового.

# Чтобы узнать тип данных, используйте оператор type >>> type(24) <class 'int'> >>> type(3.14) <class 'float'> # Мы так же можем посмотреть все свойства и методы с помощью оператора dir >>> dir(7) ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes'] # Вызов оператора с названием типа объекта а не самого объекта этого типа, # выдаст тот же ответ >>> dir(int) ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes'] # С помощью оператора help, мы можем получить справку # Методы с двумя нижними подчеркиваниями в начале и в конце названия # говорят о том что это не нужно использовать стороннему пользователю >>> help(int.bit_length) Help on method_descriptor: bit_length(self, /) Number of bits necessary to represent self in binary. >>> bin(37) '0b100101' >>> (37).bit_length() 6 # Исследуйте и изучайте все возможности встроенных типов данных

Есть два модуля, которыми вы обязательно будете пользоваться. В отличии от встроенных типов, для работы с модулями их нужно импортировать. Я покажу пару примеров, как изучить модули вы уже знаете. Возможно стоит найти общее описание в интернет, но а далее приучаться читать документацию прямо в ИР.

>>> import math >>> math.pi 3.141592653589793 >>> math.sqrt(9) 3.0 >>> import random >>> random.random() 0.7296371330138162 >>> random.choice([1,3,4,5,34]) 1

Строки

В действительности строки представляют из себя последовательность отдельных символов. Последовательность - это позиционно упорядоченный набор данных. Строки, как и числа, являются неизменяемыми объектами. Вы скажите как же так, мы можем присвоить переменной name значение 'Антон', а потом заменить на 'Александр', и уж тем более это сделать с числами. На самом деле, во всех этих случаях создается новый объект, с новым адресом в памяти и присваивается заново переменной. Числа и строки в Python неизменяемы, они каждый раз создаются заново. И вот как это можно продемонстрировать.

>>> name = 'Антон' # Оператор id возвращает адрес в памяти для объекта, он постоянен на протяжение всей его жизни >>> id(name) 2046378934800 >>> name = 'Александр' >>> id(name) 2046378903904 # Попробуйте тоже самое для чисел

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

>>> s = 'spam' # Оператор len возвращает длину строки (длину последовательности) >>> len(s) 4 # Т.к. последовательность это упорядоченная последовательность, то мы можем получить # символ по индексу. В Python индексы начинаются с 0, т.е. символ с индексом 0 это # первый символ в последовательности. >>> s[2] 'a' # Мы так же можем указать индекс с конца >>> s[-1] 'm' >>> s[-2] 'a' # Фактически при отрицательном значении это число вычитается из длины последовательности >>> s[len(s)-1] 'm' # Вы так же можете получить срез. Т.е. указывает с какой включительно, # по какой исключительно интервал вас интересует. >>> s[1:3] 'pa' # Если индекс не указывать, то вместо начального подставляется 0, # вместо последнего длина последовательности или len(s) >>> s[1:] 'pam' >>> s[:-1] 'spa' >>> s[:] 'spam' # В Python везде где ожидается какое-то значение, # вы можете использовать так же и полноценное выражение и даже с некоторой логикой >>> s[1+1:-2+1] 'a' >>> s[2-1:-2+1] 'pa'

Чтобы еще раз подтвердить что строки неизменны, мы можем попробовать изменить конкретный символ в строке.

>>> s[1] = 'i' TypeError: 'str' object does not support item assignment

Давайте посмотрим на некоторые методы, специфичные для строк. Напоминаю что вы так же можете посмотреть все доступные методы и изучить их описание.

>>> s = 'spam' # Поиск смещения подстроки в строке s >>> s.find('pa') 1 # Поиск и замена подстроки новой подстрокой >>> new_s = s.replace('pa', 'tatata') >>> new_s 'statatam' # Разбиение строки на список подстрок >>> new_s.split('a') ['st', 't', 't', 'm'] # Перевод в верхний регистр всех символов строки >>> s.upper() 'SPAM'

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

В качестве практики, предлагаю вам несколько заданий.

  1. Изучите операции для чисел на следующих примерах и постарайтесь найди описание этих операций в интернет: "2**4", "9//2","21%10".
  2. Создайте строку из вашего имени и фамилии через дефиса. Разделите строку с помощью дефиса. Ваше имя переведите в верхний регистр.
  3. Задание со звездочкой. Из строки вашего имени и фамилии через дефис получите запись вида "А.Н."
33
реклама
разместить
2 комментария

вы обязательно будитене буди лихо

=)) спасибо, поправил