понедельник, 7 декабря 2015 г.

Некоторые понятия в Python, Преобразование типов данных, срезы, строки

Основные понятия: функции, методы, объекты, итерация



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


Что такое объекты? Список, кортеж, словарь, строка, число - это все объекты. Это условное название некой завершенной структуры в Python, но давайте проведем более тонкую грань. Просто строка - это тип данных. Объектом оно станет только тогда, когда вы физически создадите строку в Python. Какая-то строка, находящаяся между кавычками ""('') - это объект. Также и с остальными типами данных. Создали какой-то вполне конкретный список  - это объект.


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


Новое и интересное слово - итерация. Итерация - это возможность разобрать какой-то объект по элементам. Мы можем по индексу обратиться к определенному элементу списка? Да. Значит список итерируемый. Мы можем вызвать по индексу букву из строки? И опять таки да, а значит и строка итерируемая. А вот с числа, мы не можем взять отдельный элемент и соответственно объект числа неитерируемый. Словари, списки, кортежи, строки - это итерируемые объекты. Посути, итерация означает возможность перебрать тот или иной объект по элементам в том порядке, в котором нам необходимо, но есть исключения, когда мы можем итерировать что-то только в той последовательности, которая предусмотрена в каком-то объекте.


Преобразование типов данных



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

str() - Переведет что-то в строку, если это возможно.

int() - Переведет строчный тип в целое число.

float() - Переведет строчный тип в число с плавающей точкой.

list() - Переведет что-то в список, если это возможно.

tuple() - Переведет что-то в кортеж, если это возможно.

dict() - Переведет что-то в словарь, если это возможно.

Давайте посмотрим, как это работает. Объявим переменную a и присвоим ей строчное значение 123.

>>> a = '123'

>>>


Есть замечательная функция, которая позволит нам посмотреть тип данных какого-то объекта.

>>> type(a)



>>>


Как мы видем - это действительно строка. Давайте переведем эту строку в число при помощи функции int() и сохраним результат в переменную b.

>>> b = int(a)

>>> b

123

>>> type(b)



>>>


Как нам подсказывает функция type(), при помощи функции int(), на выходе мы получили числовой, а точнее целочисленный тип данных. Как нам подсказывает логика, чтобы получить число с плавающей точкой, мы можем использовать функцию float()

>>> b = float(a)

>>> type(b)



>>> b

123.0

>>>


И действительно, тут очевидно, что функция float(), перевела строчный тип в число с



плавающей точкой.

Необходимо учитывать, что функция int(), не переведет записанное в строке десятичное число.

>>> a = "123.0"

>>> a

'123.0'

>>> int(a)

Traceback (most recent call last):

  File "", line 1, in

ValueError: invalid literal for int() with base 10: '123.0'

>>>


Если в строке записано число с плавающей точкой, его необходимо преобразовывать в десятичную дробь при помощи команды float(). Это значит, что если в теории, мы подразумеваем то, что в строке может быть десятичная дробь, мы всегда должны использовать для преобразования функцию float().

Преобразование целочисленного типа или числа с плавающей точкой в строку, происходит аналогично при помощи функции str().

>>> a = 123

>>> type(a)



>>> b = str(a)

>>> b

'123'

>>> type(b)



>>>


Преобразования типа float в str, ничем не отличается от преобразования int в str. На выходе, мы получим строку с записанным числом.


Срезы



Срез позволяет нам обратиться к ряду элементов строки, списка или кортежа от какого-то начального элемента, который мы можем указать самостоятельно, до какого-то элемента, который мы тоже можем указать явно. Также мы можем указать шаг этого обращения, скажем если нам необходимо, вывести не все элементы подряд, а каждый третий. Формула среза примерно такая: [Индекс элемента с которого мы начнем:Индекс элемента до которого мы хотим пройтись не включая его:шаг с которым мы хотим пройтись]. Для более наглядного примера, посмотрим на следующее.

>>> a = "012345"

>>> a[0:5] # Элементы от начала до индекса 5, не включая его

'01234'

>>> a[2:6] #С элемента под индексом 2, до конца

'2345'

>>> # Если мы имеем ввиду начало или конец списка элементов, мы можем пропустить 0 вначале или номер индекса в конце

>>> a[:5]

'01234'

>>> a[2:]

'2345'

>>> a[::2] # Пробежимся по элементам от начала до конца с шагом в 2 элемента

'024'

>>> a[::3] # Пробежимся по элементам от начала до конца с шагом в 3 элемента

'03'

>>> a[1:5:2] # Пробежимся от элемента с индексом 1, до индекса 5, не включая его

 с шагом в 2 элемента

'13'

>>>



Взаимодействие со строкой, несколько методов



Рассмотрим несколько часто используемых методов для строки. Вы помните о чем я писал раньше? Метод - это функция, которая закреплена за конкретным объектом. Формат обращения к  методам объектов такой: Объект.метод(). Где объект, там или непосредственный объект в виде списка, строки, кортежа и Т.Д. Или переменная, которая ссылается на этот объект. Рассмотрим метод split(), который позволяет разбить строку по определенному символу. Скажем строку из нескольких слов, мы можем превратить в список отдельных слов, разбив ее по пробелу.

>>> a = "Code is poetry"

>>> a.split(" ")

['Code', 'is', 'poetry']

>>>


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

>>> b = a.split(" ")

>>> type(b)



>>>


Теперь мы можем обращаться к отдельным словам по их индексу в списке.

Также есть обратный split(), метод, он позволяет собрать список в строку, разделив каким-то знаком элементы списка в строке. Допустим был у нас список ['Red', 'green', 'black'], а нам нужно свести этот список в строку, таким образом, чтобы каждый элемент списка был разделен пробелом. Для этого мы используем метод join().

>>> a = ['Red', 'Green', 'Black']

>>> ' '.join(a)

'Red Green Black'

>>>


Я сказал, что мы обращаемся к объекту, затем через точку указываем метод, а тут все происходит наоборот? Сначала мы указываем символ которым элементы списка будут разделены в строке, потом через точку указываю метод, а потом в скобочках передаю переменную списка. Кажется, что все наоборот, но нет. Дело в том, что метод join() - метод строки а не списка и его нужно читать примерно так: Мы просим строку принять в себя список и разделить его элементы тем символом, который мы показали строке. Строка-строка, вот тебе пробел ' '. А теперь отделяя каждый элемент списка вот тем пробелом, собери в строку список ().

Еще один из самых часто используемых методов строки - это поиск подстроки, слова или нескольких слов. Метод find(), позволяет найти указанный набор символов в строке. Этот метод, возвращает индекс первого символа того, что вы ему укажете Т.Е. Он скажет индекс откуда начинается слово/фраза/набор символов, который вы передали методу find() для поиска.

>>> a = "Code is poetry"

>>> a.find("is")

5

>>> a[5:7] # проверим, что с 5 до 7 индекса, действительно находится слово is

'is'

>>> a.find(" is ") # Поскольку сочитание букв is, может быть в другом слове, явно окружили is пробелами

4

>>> a[4:8]

' is '

>>>


Если find() ничего не найдет в строке, вернет -1.

Давайте, используя метод find(), выведем при помощи среза, строку от is до конца.

>>> a[a.find(" is "):]

' is poetry'

>>> a[a.find(" is ")+1:] # Приплюсуем 1 к индексу от find, чтобы в начале выводимой строки не болтался пробел

'is poetry'

>>>


Метод find(), имеет 2 необязательных(опциональных) аргумента:

find("что ищем", С какого индекса начинать поиск, до какого индекса производить поиск)

Также есть метод index(), в Python 2.7, он выполняет такуюже функцию как и метод find(), но при случае отсутствия искомого в строке, выдаст не -1, а ошибку.

>>> a.find("blablabla")

-1

>>> a.index("blablabla")

Traceback (most recent call last):

  File "", line 1, in

ValueError: substring not found

>>>

Комментариев нет:

Отправить комментарий