Skip to content

Latest commit

 

History

History
540 lines (385 loc) · 24.5 KB

lesson4.md

File metadata and controls

540 lines (385 loc) · 24.5 KB

Лекция 4: Списки, строки детальнее, срезы, циклы.

Списки (Lists)

Список - это упорядоченная коллекция элементов, которая может содержать объекты разных типов. Они очень полезны при работе с множеством данных.

Вместе со строками в нашу жизнь приходят такие термины как изменяемые и не изменяемые типы данных. Пока что нам не очень важно знать детали того что это такое, но уже необходимо запомнить, что все типы данных в питоне делятся на изменяемые и не изменяемые. Все что мы учили до этого были не изменяемыми типами, а списки изменяемые. Строки, числа, булеаны (на самом деле булеан вообще является частным случаем числа), не изменяемые, списки изменяемые, это важно! А почему важно узнаете дальше.

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

Создать список можно, заключив элементы в квадратные скобки [] и разделив их запятыми.

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, но методов у списков гораздо больше, давайте их рассмотрим.

clear()

Метод очищает список. Параметров нет.

l = [1, 2, 3]
l.clear()
print(l)  # []

copy()

Метод возвращает копию списка. Параметров нет.

l = [1, 2, 3]
l2 = l.copy()
print(l is l2)  # False Вернемся к этому оператору после функций
print(l == l2)  # True

count(elem)

Метод считает сколько раз в списке встречается указанный элемент. Параметр один, что ищем.

l = [1, 2, 3, 1, 1]
print(l.count(1))  # 3
print(l.count(2))  # 1
print(l.count(5))  # 0

extend(collection)

Метод расширяет список другой коллекцией (пока читаем другим списком). Параметр один, принимает коллекцию (например список).

l1 = [1, 2, 3]
l2 = ['a', 'b']
l1.extend(l2)
print(l1)  # [1,2,3,'a','b']

index(elem)

Метод возвращает индекс указанного элемента, если элемент не найден, вызывает исключение 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

insert(pos, elem)

Метод добавляет объект на указанное место. Параметра два, на какое место, и какой элемент добавить.

l = [1, 2, 3]
l.insert(1, 4)
print(l)  # [1, 4, 2, 3]

Поддерживает механику обратных индексов, о ней дальше

pop(pos)

Метод "вытаскивает" елемент из указанной позиции, если позиция не указана, вытаскивает последний. Параметр один, позиция элемента и он не обязательный.

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

Поддерживает механику обратных индексов, о ней дальше

remove(elem)

Метод удаляет елемент есть находит его в списке. Параметр один, значение элемента.

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

reverse()

Метод разворачивает список. Параметров нет.

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
l.reverse()
print(l)  # [9, 8, 7, 6, 5, 4, 3, 2, 1]

sort()

Метод сортирует список. Параметров два, но детально мы будем его рассматривать в лекции по алгоритмам, там много деталей.

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 предоставляет множество методов для работы со строками. Ниже представлены некоторые из наиболее часто используемых методов.

str.upper() и str.lower()

Метод upper() преобразует все символы строки в верхний регистр, а lower() - в нижний.

text = "Привет, мир!"
uppercase = text.upper()  # Результат: "ПРИВЕТ, МИР!"
lowercase = text.lower()  # Результат: "привет, мир!"

str.strip()

Метод strip() удаляет пробелы и символы перевода строки с начала и конца строки.

text = "   Текст с лишними пробелами   "
stripped_text = text.strip()  # Результат: "Текст с лишними пробелами"

str.split()

Метод split() разбивает строку на список подстрок, используя разделитель.

text = "Яблоки, Груши, Бананы"
fruits = text.split(", ")  # Результат: ['Яблоки', 'Груши', 'Бананы']

str.replace()

Метод replace() заменяет все вхождения подстроки на другую подстроку.

text = "Привет, мир!"
new_text = text.replace("мир", "вселенная")  # Результат: "Привет, вселенная!"

str.find() и str.index()

Методы find() и index() находят первое вхождение подстроки в строку и возвращают индекс этого вхождения. Разница между ними в том, что find() возвращает -1, если подстрока не найдена, а index() вызывает исключение.

text = "Это пример текста с примерами"
index1 = text.find("пример")  # Результат: 4
index2 = text.index("пример")  # Результат: 4
index3 = text.find("нет")  # Результат: -1
# index4 = text.index("нет")  # Вызовет ValueError

str.count()

Метод count() подсчитывает количество вхождений подстроки в строку.

text = "Это пример текста с примерами"
count = text.count("пример")  # Результат: 2

str.startswith() и str.endswith()

Методы startswith() и endswith() проверяют, начинается ли строка с указанной подстроки или заканчивается ей.

text = "Это пример текста"
starts_with = text.startswith("Это")  # Результат: True
ends_with = text.endswith("текста")  # Результат: True

str.join()

Метод join() объединяет список строк с помощью текущей строки в качестве разделителя.

fruits = ['Яблоки', 'Груши', 'Бананы']
text = ', '.join(fruits)  # Результат: "Яблоки, Груши, Бананы"

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

Мы обсудили что строки можно конкатенировать, но это далеко не единственная возможность для форматирования строк в пайтоне всего их вроде 5, но мы рассмотрим два основных, современный и слегка устаревший, но все еще часто применяемый.

Python также предоставляет мощные инструменты для форматирования строк. Один из способов - это использование метода str.format().

name = "Иван"
age = 30
text = "Привет, меня зовут {} и мне {} лет.".format(name, age)
# Результат: "Привет, меня зовут Иван и мне 30 лет."

Для его использования вам необходимо указать в строке символы {} для обозначения места куда будут подставлены данные, и после вызвать метод .format() куда передать значения которые необходимо подставить, кол-во элементов должно совпадать с количеством скобок. Там довольно много деталей, можете изучить их самостоятельно

F-строки

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

Цикл for используется для итерации по коллекциям, таким как списки и строки (и не только).

fruits = ['яблоко', 'киви', 'груша', 'апельсин']

for fruit in fruits:
    print(fruit)

Цикл while

Цикл while выполняется до тех пор, пока условие истинно.

count = 0

while count < 5:
    print(count)
    count += 1

Ключевое слово break

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 используется для перехода к следующей итерации цикла, игнорируя оставшуюся часть текущей итерации. Обычно 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'

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

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

Практика:

  1. Создайте список numbers с числами от 1 до 10. Используя цикл for, выведите каждое число из списка numbers, возведенное в квадрат. Используя цикл for, найдите сумму всех чисел в списке numbers.

  2. Создайте строку text с произвольным текстом. Используя цикл for, выведите каждый символ из строки text.

  3. Используя срезы, выведите первые 5 символов и последние 5 символов из строки text.

  4. Создайте список чисел от 1 до 20. Используя цикл for, выведите все числа из списка, которые делятся на 3 без остатка.

  5. Используя цикл while, найдите сумму всех чисел от 1 до 100.

  6. Создайте бесконечный цикл с использованием while True, который будет предлагать пользователю ввод числа и выводить квадрат этого числа. Добавьте условие для выхода из цикла при вводе значения "0" или "exit".

  7. Создайте список слов words, включая некоторые повторяющиеся слова. Используя цикл for, выведите все уникальные слова из списка.

  8. Подсчет гласных букв: Попросите пользователя ввести строку текста, а затем используйте методы строк для подсчета количества гласных букв (а, е, и, о, у) в этой строке.

  9. Замена слов: Создайте строку, содержащую предложение, и попросите пользователя ввести слово. Затем замените все вхождения этого слова в предложении на слово "заменено". Выведите измененное предложение.

  10. Создайте список с повторяющимися элементами. Используйте методы списков для удаления дубликатов и выведите измененный список.

  11. Создать список со случайными числами. Найти самое большое и самое маленькое число (пользоваться встроенными методами для их поиска запрещено)

  12. 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, а любые числа введенные пользователем.