Skip to content

Latest commit

 

History

History
326 lines (247 loc) · 14.4 KB

File metadata and controls

326 lines (247 loc) · 14.4 KB

Урок 4. Еще о типах данных. String, List

Изменяемые и неизменяемые типы данных

В Python есть изменяемые (mutable) и неизменяемые (immutable) типы данных.

Ранее рассматривался тип данных int, который является неизменяемым. Так же неизменяемыми являются типы данных tuple (кортеж) и string (строка).

Что значит неизменяемыми? Значит, что изначально созданную строку мы изменить не можем. Это легко покажут дальнейшие примеры со строками и кортежами. Если же кажется, что объект одного из перечисленных данных изменился - значит теперь имя объекта просто указывает на новую область в памяти с новым объектом.

Строки

Создание строк, кавычки

В python между одинарными и двойными кавычками практически нет разницы, а ведь есть еще два вида тройных. Все типы кавычек могут быть вставлены друг в друга. Тройные так же позволяют вставлять переход на новую строку внутрь строки:

S1 = 'Welcome to strings'
S2 = "Another string"
S3 = """And '''another'''
long
string"""
S4 = 'This "string" is a bit """crazy"""'

Простые операции

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

S = 'abc'
print (len(S)) # Выведет 3
S = S + '12' # В S будет 'abc12'
print (S[2])   # Выведет 'c'
print ('ab'*2) # Выведет abab

Строка - неизменяемый тип

Теперь давайте проверим, насколько неизменяемы строки и как с этим бороться:

S = 'asdfghj'
S[5] = 's'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
# Python ругается, строки такую операцию не поддерживают. Ок...
S = S[:5] + 's' + S[6:]

Срезы строк

Python позволяет взять или даже составить из элементов строки любую подстроку, используя slices (срезы). Примеры:

>>> S = "Welcome to California!"
>>> S
'Welcome to California!'
>>> S[:5] # от начала показать пять элементов
'Welco'
>>> S[5:] # от пятого элемента и дальше
'me to California!'
>>> S[:] # показать всю строку
'Welcome to California!'
>>> S[:-3] # Показать до третьего элемента с конца
'Welcome to Californ'
>>> S[::-1] # Показать всю строку задом наперед
'!ainrofilaC ot emocleW'
>>> S[:5:2] # Показать до пятого элемента с шагом два
'Wlo'

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

Полезные функции работы со строками

>>> S
'Welcome to California!'
>>> len(S) # получить длину строки
22
>>> S.find('C') # найти индекс начала первой подстроки в строке
11
>>> S.replace('C', '7') # Заменяет все подстроки на новые
'Welcome to 7alifornia!'
>>> S.split() # Разбивает строку по разделителю и создает список. По умолчанию разделитель - пробел
['Welcome', 'to', 'California!']
>>> S.upper()
'WELCOME TO CALIFORNIA!'
>>> S += '\n\n'
>>> S
'Welcome to California!\n\n'
>>> S.rstrip() # удаление пробельных символов в конце
'Welcome to California!'

Дополнительную информацию о строках и функциях работы с ними можно найти по ссылке: Подробнее о строках

Форматирование строк

Существует несколько способов создания строки, включающей в себя как литералы (заранее известные элементы), так и данные из переменных. Простейший и уже известный вам вариант - конкатенация строк:

>>> S = 'Welcome to'
>>> C = 'Ukraine!'
>>> print(S + ' ' + C)
>>> 
Welcome to Ukraine!

Форматирование с оператором %

Есть довольно старинный метод форматирования через оператор %, пришедший из языка Fortran и 60-х годов. (функция Printf как прародитель) Работает форматирующий оператор % следующим образом:

>>> S = 'Welcome to'
>>> C = 'Ukraine!'
>>> print('%s %s' % (S, C))
>>>
Welcome to Ukraine!

где %s внутри строки означает, что здесь будет подставляться строка, % после строки - сам оператор подстановки, и тьюпл с двумя переменными - строками, которые по-очереди подставляются в заранее обозначенные %s места. Помимо %s для обозначения строки часто используются %d для целых чисел и %f для чисел с плавающей точкой:

>>> C = 'Ukraine'
>>> S = 'welcomed'
>>> print('%d people are %s in %s!' % (3, S, C))
3 people are welcomed in Ukraine!

Еще варианты использования оператора форматирования %

Форматирование с оператором % с использованием словаря

>>> D = {'country': 'Ukraine', 'greetings': 'welcomed', 'pretext': 'in', 'number': 3}
>>> S = "Information! %(number)d people are %(greetings)s %(pretext)s %(country)s!"
>>> print(S % D)
Information! 3 people are welcomed in Ukraine!

Как видно из примера, можно поместить переменные в словарь и использовать их не придерживаясь порядка.

Форматирование при помощи метода .fromat()

При помощи метода .format() можно форматировать строку разлиными способами:

  • подставляя переменные по порядку с указанием позиции
  • подставляя переменные по порядку без указания позиции
  • подставляя переменные по названию
  • в смешанном стиле

Работает это так. Укажем позиции подставляемых значений порядку от нуля:

>>> S = "Information! {0} people are {1} {2} {3}!"
>>> S.format(3, 'welcomed', 'in', 'Ukraine')
'Information! 3 people are welcomed in Ukraine!'

Аналогичный пример, но укажем позиции подставляемых значений порядку без укзаания позиции:

>>> S = "Information! {} people are {} {} {}!"
>>> S.format(3, 'welcomed', 'in', 'Ukraine')
'Information! 3 people are welcomed in Ukraine!'

Аналогичный пример, но укажем позиции подставляемых значений порядку без укзаания позиции:

>>> S = "Information! {} people are {} {} {}!"
>>> S.format(3, 'welcomed', 'in', 'Ukraine')
'Information! 3 people are welcomed in Ukraine!'

List (список)

Создание списков

В python отсутствуют массивы в традиционном понимании этого термина. Вместо них для хранения однородных (и не только) объектов используются списки. Они задаются многими способами:

# пустой список
>>>empty_list = []
# Простое перечисление:
>>> a = [2, 2.25, "Python"]
>>> a
[2, 2.25, 'Python']

# Преобразуем строку в список
>>> b = list("help")
>>> b
['h', 'e', 'l', 'p']

>>> b = 'welcome to the hell'.split()
>>> b
['welcome', 'to', 'the', 'hell']

Операции срезов и вставок со списками

К спискам применимы все те срезы, что применимы к строкам. Более того, в списки таким образом можно еще и добавлять новые элементы.

L = [1, 2, 's']
>>> L
[1, 2, 's']
>>> L[1:3]
[2, 's']
>>> L[2] = '17'
>>> L
[1, 2, '17']
>>> L[1:2]
[2]
>>> L[1:2] = ['new', 'list']
>>> L
[1, 'new', 'list', '17']

Некоторые функции работы со списками

Ниже представлены примеры работы некоторых функций работы со списками:

>>> L = list(range(1, 11))
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> L.append(12) # Добавляет элемент в конец списка
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12]
>>> L.extend([13, 14]) # Добавляет элементы второго списка в конец первого
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14]
>>> L.insert(2, 5) # Вставляет на второе место цифру 5
>>> L
[1, 2, 5, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14]
>>> L.remove(5) # Удаляет первую встретившуюся пятерку
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14]
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# функция map применяет переданную ей функцию к списку
>>> L = list(map(str, range(1, 11)))
>>> L # В данном случае мы преобразовали в число все цифры
['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
>>> S = ': '.join(L) # склеивает строки в списке в одну, вызывается от разделителя
>>> S
'1: 2: 3: 4: 5: 6: 7: 8: 9: 10'

Циклы и списки

Цикл for специально создан для того, чтобы выполнять повторяющиеся действия со списками и другими итерируемыми объектами. Пара примеров:

>>> S = 'This is Sparta!!'
>>> L = S.split()
>>> L
['This', 'is', 'Sparta!!']
>>> for elem in L:
...     print('say ' + elem)
...
say This
say is
say Sparta!!

>>> for num, elem in enumerate(L):
...     print (str(num) + '. say ' + elem)
...
0. say This
1. say is
2. say Sparta!!

Обратите внимание на функцию enumerate, которая выдает не только содержимое списка, но и его порядковый номер.

List comprehensions (Списковые включения)

В языках программирования существует такое понятие, как синтаксический сахар. Это возможности языка по некоторому упрощению языковых конструкций, которые не влияют на исполнение конструкций, но упрощают жизнь программиста. Самый популярный и распространенный пример - списковые включения, list comprehensions. Ниже - примеры приведения обычного цикла к списковому включению:

>>> l = []
>>> for x in range(1, 11):
...     l.append(x*x)
...
>>> l
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# то же самое с list comprehension
>>> l2 = [x*x for x in range(1, 11)]
>>> l2
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Синтаксис у list comprehensions примерно следующий:

result_list = [actions_with_var for var in list if condition]

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

Ссылки

List comprehensions за 5 минут

Срезы

Домашка

Следующий урок