Управляющие конструкции
Списки
Операции над списками
Обращаnmся к элементам списка можно по индексу. Обращение по несуществующему индексу вызовет ошибку
>>> e = [12, 345, 65, 72]
>>> e[0]
12
>>> e[-1] # последний элемент
72
Списки можно изменять в отличие от строки
>>> e = [12, 345, 65, 72]
>>> e[1] = 421
>>> e
[12, 421, 65, 72]
Функции списков
len(L) – возвращает число элементов в списке L
max(L) – возвращает максимальное значение в списке L
min(L) – возвращает минимальное значение в списке L
sum(L) – возвращает сумму значений в списке L
sorted(L) – возвращает копию списка L, в котором элементы упорядочены
по возрастанию. Не изменяет список L
Операция сложения, умножения и удаления
>>> s = [23, 14, 51]
>>> t = s + [4] # сложение
>>> t
[23, 14, 51, 4]
>>> t = t * 2 # умножение
>>> t
[23, 14, 51, 4, 23, 14, 51, 4]
>>> del t[1] # удаление
>>> t
[23, 51, 4, 23, 14, 51, 4]
Опеартор in
e = [12, 32, 62]
if 32 in e:
print ('Значение есть в списке')
Операции взятия среза и удаления
>>> t = [21, 42, 21, 421]
>>> n = t[1:3] # срез
>>> n
[42, 21]
>>> del n[1:2] # удаление
>>> n
[42]
Срезы выполняются аналогично строкам
Псевдонимы и копирование списков
Важная особенность списков
>>> h = [23, 53, 15, 63]
>>> p = h # содержат указатель на один и тот же список
>>> p
[23, 53, 15, 63]
>>> p[0] = 555 # модифицируем одну из переменных
>>> p
[555, 53, 15, 63]
>>> h # изменилась другая переменная!
[555, 53, 15, 63]
В Python две переменные называются псевдонимами, когда они содержат одинаковые адреса памяти
Проверка ссылаются ли переменные на один и тот же объект:
>>> x = y = [2, 4]
>>> x is y
True
>>> x = [2, 4]
>>> y = [2, 4]
>>> x is y
False
Есть два вида копирования списков: поверхностное копирование, при котором создается новый объект, но он будет заполнен ссылками на элементы, которые содержались в оригинале и глубокое копирование, котором создается новый объект и рекурсивно создаются копии всех объектов, содержащихся в оригинале
Поверхностное
>>> a = [1,2,3,4]
>>> b = a
>>> b[1] = 7
>>> a
[1, 7, 3, 4]
Глубокое
>>> a = [1,2,3,4]
>>> import copy
>>> b = copy.deepcopy(a)
>>> b[1] = 7
>>> a
[1, 2, 3, 4]
Методы списка
Примеры
>>> colors = ['red', 'orange', 'green']
>>> colors.extend(['black','blue']) # расширяет список списком
>>> colors
['red', 'orange', 'green', 'black', 'blue']
>>> colors.append('purple') # добавляет элемент в список
>>> colors
['red', 'orange', 'green', 'black', 'blue', 'purple']
>>> colors.insert(2,'yellow') # добавляет элемент в указанную позицию
>>> colors
['red', 'orange', 'yellow', 'green', 'black', 'blue', 'purple']
>>> colors.remove('black') # удаляет элемент из списка
>>> colors
['red', 'orange', 'yellow', 'green', 'blue', 'purple']
>>> colors.count('red') # считает количество повторений аргумента метода
1
>>> colors.index('green') # возвращает позицию в списке аргумента метода
3
Еще несколько полезных методов для списка
>>> colors
['red', 'orange', 'yellow', 'green', 'blue', 'purple']
>>> colors.pop() # удаляет и возвращает последний элемент списка
'purple'
>>> colors
['red', 'orange', 'yellow', 'green', 'blue']
>>> colors.reverse() # список в обратном порядке
>>> colors
['blue', 'green', 'yellow', 'orange', 'red']
>>> colors.sort() # сортирует список (вспомните о сравнении строк)
>>> colors
['blue', 'green', 'orange', 'red', 'yellow']
>>> colors.clear() # очищает список. Метод появился в версии 3.3. Аналог del color[:]
>>> colors
[]
Преобразование типов
Пеобразуем строки в список, измение списка, затем возврат его в строку
>>> s = 'это строка'
>>> list(s) # функция list() пытается преобразовать аргумент в список
['э', 'т', 'о', ' ', 'с', 'т', 'р', 'о', 'к', 'а']
>>> lst = list(s)
>>> lst[0] = 'Е' # изменяем список, полученный из строки
>>> lst
['Е', 'т', 'о', ' ', 'с', 'т', 'р', 'о', 'к', 'а']
>>> s = ''.join(lst) # преобразуем список в строку с помощью строкового метода join()
>>> s
'Ето строка'
Метод join() принимает на вход список, который необходимо преобразовать в строку, а в качестве строкового объекта указывается соединитель элементов списка
>>> L = ['tra', 'ta', 'ta']
>>> ' '.join(L)
'tra ta ta'
Аналогично можно преобразовать число к списку (через строку) и затем изменить полученный список
>>> n = 9987
>>> list(str(n))
['9', '9', '8', '7']
Если строка содержит разделитель, то ее можно преобразовать к списку с помощью строкового метода split(), который по умолчанию в качестве разделителя использует пробел
>>> s = 'da ad adadsasd adsasd'.split()
>>> s
['da', 'ad', 'adadsasd', 'adsasd']
Другой разделитель
>>> s = 's:f:g:h:e'.split(':')
>>> s
['s', 'f', 'g', 'h', 'e']
Вложенные списки
>>> lst = [['A', 1], ['B', 1], ['C', 3]]
>>> lst
[['A', 1], ['B', 1], ['C', 3]]
>>> lst[1]
['B', 1]
>>> lst[1][1] # обращение к вложенному списку
1
Операторы сравнения
Ещё один тип данных - логический тип (boolean): True или False.
Для сравнения значений используются операторы сравнения:
Синтаксис
Описание
>
Больше
<
Меньше
>=
Больше или равно
<=
Меньше или равно
==
Равно
1=
Не равно
Инструкции If, elif, else
if <<условие>>: # блок выражений выполняется только в том случае, если выражение, которое находится в условии, является истинным
<<блок выражения>>
elif <<условие>>:
<<блок выражения>>
else: # выполняется, когда все вышестоящие условия вернули False.
<<блок выражения>>
Для выполнения более сложных сравнений можно использовать вложенные инструкции if.
Булевая логика
У Python есть три логических оператора and, or, not
Результатом применения логического оператора not (НЕ) произойдет отрицание операнда, т.е. если операнд истинный, то not вернет – ложь, если ложный, то – истину:
>>> x = 6 > 7
>>> x
False
>>> not x
True
>>> not None
True
>>> not 2
False
>>>
Логический оператор and (И) вернет True (истину) или False (ложь), если его операндами являются логические высказывания:
>>> 2 > 5 and 4 > 1 # комбинация False and (И) True вернет False
False
Если операндами оператора and являются объекты, то в результате Python вернет объект:
>>> '' and 4 # False and True
''
Для вычисления оператора and Python вычисляет операнды слева направо и возвращает первый объект, имеющий ложное значение:
>>> 0 and 2 # вернет первый ложный объект-операнд
0
>>> 5 and 4 вернет крайний правый объект-операнд
4
Если Python не удается найти ложный объект-операнд, то он возвращает крайний правый операнд.
Логический оператор or действует похожим образом, но для объектов-операндов Python возвращает первый объект, имеющий истинное значение. Python прекратит дальнейшие вычисления, как только будет найден первый объект, имеющий истинное значение
>>> 0 or 3 # вернет первый истинный объект-операнд
3
>>> None or 6 # вернет второй объект-операнд, т.к. первый всегда ложный
6
>>> None or 0 # вернет оставшийся объект-операнд
0
>>>
В Python любое число, не равное нулю, или непустой объект интерпретируется как истина/
Числа, равные нулю, пустые объекты и специальный объект None интерпретируются как ложь:
>>> '' and '3' # False and True
''
>>> '' or '3' # False or True
'3'
>>>
Логические выражения можно комбинировать:
>>> 1+(3+7) # приоритет + выше, чем >
11
>>> 1+(3>7) # скобки способствуют наглядности и избавляют от ошибок
1
>>> 1 + False
1
>>> 1 + True
2
В Python можно проверять принадлежность интервалу:
>>> x = 1
>>> -1 < x < 4 # эквивалентно: x > -1 and x < 14
True
>>>
Можно сравнить строки.
Определить какое число соответствует символу можно с помощью функции ord():
>>> ord('F')
70
>>> 'B' > 'b'
False
Для сравнения строк Python их сравнивает посимвольно:
>>> 'Aaaaa' < 'AAaaa'
False
Оператор in проверяет наличие подстроки в строке:
>>> 'a' in 'abc'
True
>>> 'A' in 'abc' # большой буквы А нет
False
>>> '' in 'abc' # пустая строка есть в любой строке
True
>>> '' in ''
True
Приоритет операторов
Оператор
Описание
**
Возведение в степень
~ + -
Комплиментарный оператор
* / % //
Умножение, деление, деление по модулю, целочисленное деление
+ -
Сложение и вычитание
>> <<
Побитовый сдвиг вправо и побитовый сдвиг влево
&
Бинарный "И"
^
Бинарный "Исключительное ИЛИ" и бинарный "ИЛИ"
<= < > >=
Операторы сравнения
<> == !=
Операторы равенства
= %= /= //= -= += = *=
Операторы присваивания
is is not
Тождественные операторы
in not in
Операторы членства
not or and
огические операторы
Циклы
while
while <<выражение>>:
<<тело цикла>> # тело цикла выполняется многократно (итерация), пока выражение явдяется истинным
# или пока не вышли по break
# инструкция continue переводит выполнение цикла в начало
for
Цикл for позволяет перебрать все элементы указанного списка. Цикл сработает ровно столько раз, сколько элементов находится в списке. Имя переменной, в которую на каждом шаге будет помещаться элемент списка, выбирает программист.
>>> l = [12, 124, 5135, 12]
>>> for i in l:
>>> print(i)
12
124
5135
12
Цикл for работает и для строк
>>> for i in 'hello':
>>> print(i)
h
e
l
l
o
Цикл for позволяет не только выводить элементы строки или списка на экран, но и производить над ними определенные операции
>>> l = [12, 124, 5135, 12]
>>> for i in l:
>>> if i == 124:
>>> print(i)
124
>>> word = 'Hello'
>>> for i in word:
>>> if i.isupper():
>>> print(i)
H
range
Функция range() создаёт последовательность (диапазон) чисел. В качестве аргументов функция принимает: начальное значение диапазона (по умолчанию 0), конечное значение (не включительно) и шаг (по умолчанию 1)
>>> for i in range(4):
>>> print(i)
0
1
2
3
>>> for i in range(1, 7, 2):
>>> print(i)
1
2
5
В обратном порядке
>>> for i in range(4, 1, -1):
>>> print(i)
4
3
2
Вычислить сумму чисел в заданном диапазоне:
>>> t = 0
>>> for i in range(1,101):
>>> t = t + i
>>> print(t)
5050
Альтернативный вариант
>>> sum(list(range(1, 101)))
5050
Диапазон, создаваемый функцией range(), часто используется для задания индексов. Например, если необходимо изменить существующий список, умножив каждый его элемент на 2:
lst = [4, 10, 5, -1.9]
>>> print(lst)
>>> for i in range(len(lst)):
>>> lst[i]=lst[i] * 2
>>> print(lst)
[4, 10, 5, -1.9]
[8, 20, 10, -3.8]
Способы создания списков
С помощью строкового метода append
>>> lst = []
>>> for i in range(1,11):
>>> lst.append(i)
>>> print(lst)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
С помощью диапозона
a = list(range(1,4))
print(a)
С помощью "строкового влючения"
>>> a = [i for i in range(1,5)] # i - что делаем с элементом, второй i - что берём, range - откуда берём.
>>> print(a)
[1, 2, 3, 4]
Пример использования
>>> a = [i*2 for i in range(1,10)]
>>> print(a)
[2, 4, 6, 8, 10, 12, 14, 16, 18]
Списковое включение позволяет задавать условие для выбора значения из диапазона
>>> a = [i*2 for i in range(1,10) if i != 5]
>>> print(a)
[2, 4, 6, 8, 12, 14, 16, 18]
Вместо диапазонов списковое включение позволяет указывать существующий список
>>> b = [1, 2, 3, 4]
>>> b = [i*2 for i in b]
>>> print(b)
[2, 4, 6, 8]
По аналогии можно перебирать символы из строки и формировать из них список
>>> a = [i*2 for i in 'asf']
>>> print(a)
['aa', 'ss', 'ff']
В Python есть интересная функция map(), которая позволяет создавать новый список на основе существующего списка
>>> def func(x):
>>> return x + 3
>>> b = list(map(func,[1,2,3])) # в качестве второго аргумента может принимать строку. Результат работы
функции добавляется как элемент нового списка
>>> print(b)
[4, 5, 6]
Получить результат вызова функцииmap() можно через цикл for или функцию list(). Функции, которые принимают на вход другие функции, называются функциями высшего порядка
Пример вызова для строки
>>> def func(s):
>>> return s * 3
>>> b = list(map(func,'hello'))
>>> print(b)
['hhh', 'eee', 'lll', 'lll', 'ooo']
Получить список, состоящий из случайных целых чисел
>>> from random import randint
>>> a = [(randint(1,5)) for i in range(5)]
>>> print(a)
[3, 5, 1, 4, 1]
Ручной ввод значений для списка
>>> a = []
>>> n = int(input()) # количество элементов в списке
>>> for i in range(n):
>>> new_alement = int(input()) # считывание очередного элемента
>>> a.append(new_alement) # добавление его в список
>>> # a.append(int(input()) # вместо двух последних строчек
>>> print(a)
3
2
3
1
[2, 3, 1]
Решение этой же задачи через списковое влючение:
A = [int(input()) for i in range(int(input()))]
Вложенные циклы
Циклы можно вкладывать друг в друга:
first = ['a', 'b', 'c']
second = [1, 2, 3]
for i in first:
for j in second:
print('i = ', i, 'j = ', j)
first = ['a', 'b', 'c']
second = [1, 2, 3]
for i in first:
for j in second:
print('i = ', i, 'j = ', j)
Данный прием активно используется при работе с вложенными списками. Сначала пример с одним циклом for:
lst = [['a', 'b', 'c'],[1, 2, 3]]
for i in lst:
print(i)
['a', 'b', 'c']
[1, 2, 3]
В примере с помощью цикла for перебираются все элементы списка, которые также являются списками. Если мы хотим добраться до элементов вложенных списков, то придется использовать вложенный цикл for:
lst = [['a', 'b', 'c'],[1, 2, 3]]
for i in lst:
print()
for j in i:
print(j, end="")
abc
123
Last updated