Список - это упорядоченная коллекция элементов, которая может содержать объекты разных типов. Они очень полезны при работе с множеством данных.
Вместе со строками в нашу жизнь приходят такие термины как изменяемые и не изменяемые типы данных. Пока что нам не очень важно знать детали того что это такое, но уже необходимо запомнить, что все типы данных в питоне делятся на изменяемые и не изменяемые. Все что мы учили до этого были не изменяемыми типами, а списки изменяемые. Строки, числа, булеаны (на самом деле булеан вообще является частным случаем числа), не изменяемые, списки изменяемые, это важно! А почему важно узнаете дальше.
Создать список можно, заключив элементы в квадратные скобки []
и разделив их запятыми.
fruits = ['яблоко', 'банан', 'груша', 'апельсин']
numbers = [1, 2, 3, 4, 5]
mixed_list = [1, 'два', 3.0, True]
Список может содержать в себе объекты любых типов.
Чтобы получить доступ к элементам списка, используйте индексацию (обращение к элементам по номеру). Нумерация в списках
начинается с 0. Если вам нужен 4-ый элемент коллекции его индекс будет 3. Синтаксис обращения по индексу, через
квадратные скобки []
print(fruits[0]) # Вывод: 'яблоко'
print(numbers[2]) # Вывод: 3
Списки можно изменять, например мы можем заменить объект по индексу
fruits[1] = 'киви'
print(fruits) # Вывод: ['яблоко', 'киви', 'груша', 'апельсин']
Практически у любого объекта в питоне есть возможность с ним совершить какие-то дополнительные действия. Обычно для этого используются методы (детально мы будем рассматривать эту тему дальше), что бы вызвать какой-либо метод, необходимо обратиться к объекту через точку, указать какой именно метод вам нужен, и если необходимо в скобках указать параметры для этого вызова
obj.method(params) # Параметры не обязательны
Чтобы добавить элемент в конец списка, используйте метод append()
.
fruits.append('ананас')
print(fruits) # Вывод: ['яблоко', 'киви', 'груша', 'апельсин', 'ананас']
Чтобы удалить элемент по индексу, используйте del
.
del fruits[2]
print(fruits) # Вывод: ['яблоко', 'киви', 'апельсин', 'ананас']
Мы уже поговорили про append
, но методов у списков гораздо больше, давайте их рассмотрим.
Метод очищает список. Параметров нет.
l = [1, 2, 3]
l.clear()
print(l) # []
Метод возвращает копию списка. Параметров нет.
l = [1, 2, 3]
l2 = l.copy()
print(l is l2) # False Вернемся к этому оператору после функций
print(l == l2) # True
Метод считает сколько раз в списке встречается указанный элемент. Параметр один, что ищем.
l = [1, 2, 3, 1, 1]
print(l.count(1)) # 3
print(l.count(2)) # 1
print(l.count(5)) # 0
Метод расширяет список другой коллекцией (пока читаем другим списком). Параметр один, принимает коллекцию (например список).
l1 = [1, 2, 3]
l2 = ['a', 'b']
l1.extend(l2)
print(l1) # [1,2,3,'a','b']
Метод возвращает индекс указанного элемента, если элемент не найден, вызывает исключение ValueError. Параметр один, что ищем, можно указать дополнительные параметры через запятую, от какого элемента искать, и до какого.
l = [1, 2, 3]
print(l.index(2)) # 1 - помним что счет начинается с 0
print(l.index(4)) # Вызовет ValueError
l.index(3, 0, 1) # Вызовет ValueError, потому что в списке ограниченном индексами 0 и 1 нет элемента 3
Метод добавляет объект на указанное место. Параметра два, на какое место, и какой элемент добавить.
l = [1, 2, 3]
l.insert(1, 4)
print(l) # [1, 4, 2, 3]
Поддерживает механику обратных индексов, о ней дальше
Метод "вытаскивает" елемент из указанной позиции, если позиция не указана, вытаскивает последний. Параметр один, позиция элемента и он не обязательный.
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
last_elem = l.pop()
elem_num_4 = l.pop(3)
print(l) # [1,2,3,5,6,7,8]
print(last_elem) # 9
print(elem_num_4) # 4
Поддерживает механику обратных индексов, о ней дальше
Метод удаляет елемент есть находит его в списке. Параметр один, значение элемента.
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
l.remove(4)
print(l) # [1,2,3,5,6,7,8,9]
l.remove('a') # вызовет ValueError
Метод разворачивает список. Параметров нет.
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
l.reverse()
print(l) # [9, 8, 7, 6, 5, 4, 3, 2, 1]
Метод сортирует список. Параметров два, но детально мы будем его рассматривать в лекции по алгоритмам, там много деталей.
l = [3, 5, 1, 2]
l.sort()
print(l) # [1, 2, 3, 5]
В случае работы со списками могут произойти ранее не рассмотренное исключения.
IndexError
- Случается когда мы пытаемся получить объект по индексу, а такого индекса не существует
l = [1, 2, 3]
print(l[5]) # IndexError
На самом деле строки в python-е являются коллекциями, а это значит что к ним применимы многие практики из списков,
например к ним применимы методы count
и index
Для доступа к символам строки используйте индексацию, так же как и для списков.
text = "Hello, World!"
print(text[0]) # Вывод: 'H'
У строк очень много разных полезных методов, и особенностей, мы рассмотрим только основные, хотя их там много, кто хочет детально почитать про все тыц сюда
Вы можете умножить строку на число, чтобы повторить ее несколько раз.
text = "Привет"
result = text * 3 # Результат: "ПриветПриветПривет"
Python предоставляет множество методов для работы со строками. Ниже представлены некоторые из наиболее часто используемых методов.
Метод upper()
преобразует все символы строки в верхний регистр, а lower()
- в нижний.
text = "Привет, мир!"
uppercase = text.upper() # Результат: "ПРИВЕТ, МИР!"
lowercase = text.lower() # Результат: "привет, мир!"
Метод strip()
удаляет пробелы и символы перевода строки с начала и конца строки.
text = " Текст с лишними пробелами "
stripped_text = text.strip() # Результат: "Текст с лишними пробелами"
Метод split()
разбивает строку на список подстрок, используя разделитель.
text = "Яблоки, Груши, Бананы"
fruits = text.split(", ") # Результат: ['Яблоки', 'Груши', 'Бананы']
Метод replace()
заменяет все вхождения подстроки на другую подстроку.
text = "Привет, мир!"
new_text = text.replace("мир", "вселенная") # Результат: "Привет, вселенная!"
Методы find()
и index()
находят первое вхождение подстроки в строку и возвращают индекс этого вхождения. Разница
между ними в том, что find()
возвращает -1, если подстрока не найдена, а index()
вызывает исключение.
text = "Это пример текста с примерами"
index1 = text.find("пример") # Результат: 4
index2 = text.index("пример") # Результат: 4
index3 = text.find("нет") # Результат: -1
# index4 = text.index("нет") # Вызовет ValueError
Метод count()
подсчитывает количество вхождений подстроки в строку.
text = "Это пример текста с примерами"
count = text.count("пример") # Результат: 2
Методы startswith()
и endswith()
проверяют, начинается ли строка с указанной подстроки или заканчивается ей.
text = "Это пример текста"
starts_with = text.startswith("Это") # Результат: True
ends_with = text.endswith("текста") # Результат: True
Метод join()
объединяет список строк с помощью текущей строки в качестве разделителя.
fruits = ['Яблоки', 'Груши', 'Бананы']
text = ', '.join(fruits) # Результат: "Яблоки, Груши, Бананы"
Мы обсудили что строки можно конкатенировать, но это далеко не единственная возможность для форматирования строк в пайтоне всего их вроде 5, но мы рассмотрим два основных, современный и слегка устаревший, но все еще часто применяемый.
Python также предоставляет мощные инструменты для форматирования строк. Один из способов - это использование
метода str.format()
.
name = "Иван"
age = 30
text = "Привет, меня зовут {} и мне {} лет.".format(name, age)
# Результат: "Привет, меня зовут Иван и мне 30 лет."
Для его использования вам необходимо указать в строке символы {}
для обозначения места куда будут подставлены данные,
и после вызвать метод .format()
куда передать значения которые необходимо подставить, кол-во элементов должно
совпадать с количеством скобок. Там довольно много деталей, можете изучить их самостоятельно
Python 3.6 и выше поддерживают f-строки (f-strings), которые представляют собой удобный способ вставки переменных и выражений в строки. Самый распространенный способ форматирования строк на данный момент
name = "Иван"
age = 30
text = f"Привет, меня зовут {name} и мне {age} лет."
print(text) # Привет, меня зовут Иван и мне 30 лет.
F-строки начинаются с буквы f
перед открывающей кавычкой, и в фигурных скобках {}
можно вставлять переменные или
выражения, которые будут вычислены и подставлены в строку.
Мы будем много использовать оба способа форматирования, а иногда даже сталкиваться с более старыми способами, так что рекомендую разобраться как это работает
Для многих коллекций к которым применим индекс (для нас пока это строки и списки) можно использовать обратный индекс. Что это такое? Это указание индекса от конца к началу.
l = [1,2,3]
print(l[-1]) # 3
print(l[-2]) # 2
print(l[-4]) # IndexError
Этот инструмент дает довольно много интересных особенностей с которыми мы будем сталкиваться в дальнейшем
Срез позволяет получить часть коллекции из коллекции, чаще всего применяются к строкам или спискам.
Синтаксис среза: строка[начало:конец:шаг]
.
text = "Hello, World!"
substring = text[2:5] # Получение подстроки "llo"
print(substring) # Вывод: 'llo'
substring = text[7:] # Получение подстроки с 7-го символа до конца
print(substring) # Вывод: 'World!'
substring = text[:5] # Получение подстроки с начала до 5-го символа
print(substring) # Вывод: 'Hello'
substring = text[::2] # Получение каждого второго символа
print(substring) # Вывод: 'Hlo ol!'
copy = text[:] # получение копии строки
Циклы позволяют выполнять повторяющиеся операции.
Цикл for
используется для итерации по коллекциям, таким как списки и строки (и не только).
fruits = ['яблоко', 'киви', 'груша', 'апельсин']
for fruit in fruits:
print(fruit)
Цикл while
выполняется до тех пор, пока условие истинно.
count = 0
while count < 5:
print(count)
count += 1
break
используется для выхода из цикла досрочно, даже если условие цикла остается истинным. Обычно break
используется внутри условия, чтобы определить момент завершения цикла.
Пример с циклом while
:
count = 0
while count < 5:
if count == 3:
break # Выход из цикла, если count равно 3
print(count)
count += 1
Пример с циклом for
:
fruits = ['яблоко', 'киви', 'груша', 'апельсин']
for fruit in fruits:
if fruit == 'груша':
break # Выход из цикла при нахождении 'груши'
print(fruit)
continue
используется для перехода к следующей итерации цикла, игнорируя оставшуюся часть текущей итерации.
Обычно continue
используется внутри условия для пропуска определенных действий.
Пример с циклом while
:
count = 0
while count < 5:
count += 1
if count == 3:
continue # Пропустить вывод числа 3
print(count)
Пример с циклом for
:
fruits = ['яблоко', 'киви', 'груша', 'апельсин']
for fruit in fruits:
if fruit == 'груша':
continue # Пропустить вывод 'груши'
print(fruit)
Ключевые слова break
и continue
полезны при создании более сложной логики в циклах и позволяют управлять потоком
выполнения программы в более гибком стиле.
Иногда может потребоваться создать бесконечный цикл, который будет выполняться до тех пор, пока его не прервут. Для
этого используется конструкция while True
.
while True:
# Этот цикл будет выполняться бесконечно
user_input = input("Введите что-нибудь (для выхода наберите 'q'): ")
if user_input == 'q':
break # Выход из цикла при вводе 'q'
Бесконечные циклы могут быть полезными в тех случаях, когда нужно создать программу, которая работает в фоновом режиме и ожидает какого-либо события, либо когда нужно регулярно выполнять какую-то задачу, например, мониторинг сенсоров или сетевых подключений.
Не забывайте, что бесконечные циклы должны иметь какой-то механизм для прерывания, иначе программа будет выполняться бесконечно и может привести к зависанию.
Практика:
-
Создайте список numbers с числами от 1 до 10. Используя цикл for, выведите каждое число из списка numbers, возведенное в квадрат. Используя цикл for, найдите сумму всех чисел в списке numbers.
-
Создайте строку text с произвольным текстом. Используя цикл for, выведите каждый символ из строки text.
-
Используя срезы, выведите первые 5 символов и последние 5 символов из строки text.
-
Создайте список чисел от 1 до 20. Используя цикл for, выведите все числа из списка, которые делятся на 3 без остатка.
-
Используя цикл while, найдите сумму всех чисел от 1 до 100.
-
Создайте бесконечный цикл с использованием while True, который будет предлагать пользователю ввод числа и выводить квадрат этого числа. Добавьте условие для выхода из цикла при вводе значения "0" или "exit".
-
Создайте список слов words, включая некоторые повторяющиеся слова. Используя цикл for, выведите все уникальные слова из списка.
-
Подсчет гласных букв: Попросите пользователя ввести строку текста, а затем используйте методы строк для подсчета количества гласных букв (а, е, и, о, у) в этой строке.
-
Замена слов: Создайте строку, содержащую предложение, и попросите пользователя ввести слово. Затем замените все вхождения этого слова в предложении на слово "заменено". Выведите измененное предложение.
-
Создайте список с повторяющимися элементами. Используйте методы списков для удаления дубликатов и выведите измененный список.
-
Создать список со случайными числами. Найти самое большое и самое маленькое число (пользоваться встроенными методами для их поиска запрещено)
-
FizzBuzz - классическая задача с легких собеседований: Задача заключается в написании программы, которая выводит числа от 1 до n, заменяя некоторые из них на определенные слова в зависимости от их делимости. Условия:
- Программа должна выводить числа от 1 до n (включительно).
- Для чисел, кратных 3, вместо числа должно выводиться слово "Fizz".
- Для чисел, кратных 5, вместо числа должно выводиться слово "Buzz".
- Для чисел, кратных и 3, и 5, вместо числа должно выводиться слово "FizzBuzz".
- Для всех остальных чисел должно выводиться само число.
Пример. Для n = 15 вывод программы должен быть следующим:
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
12.1 сделать так что бы пользователь вводил руками оба делителя и n
. Не 3, 5 и 15, а любые числа введенные пользователем.