#8 – Функции строк. Индексы и срезы

Язык Питон обладает обширным набором функций для работы со строками. В ходе урока мы научимся использовать множество из этих функций, а также изучим тему индексов и срезов в языке Python.
Видеоурок
Индексы
Нумерация в списках начинается с нуля, так как список по большей части это просто массив, то как в обычном массиве отсчет ведется от 0. Первый элемент по индексу будет 0, второй — 1, третий — 2 и так далее. Если мы попытаемся взять несуществующий элемент, то это приведет к ошибке.
a = [0, 23, "Hi"] # Список print (a[4]) # Выдаст ошибку, так как элемента не существует
Удобной функцией языка Python является возможность брать элементы с конца при помощи отрицательных индексов. К примеру, если нам нужен второй элемент с конца, то мы можем записать это так:
a = [0, 23, "Hi", 1.56, 9] # Список print (a[-2]) # Будет выведено 1.56
Срезы
Срезы позволяют обрезать список, взяв лишь те элементы, которые нужны. Они работают по следующей схеме: list[НАЧАЛО:КОНЕЦ:ШАГ] .
- Начало — с какого элемента стоит начать (по умолчанию равно 0);
- Конец — по какой элемент мы берем элементы (по умолчанию равно длине списка);
- Шаг — с каким шагом берем элементы, к примеру каждый 2 или 3 (по умолчанию каждый 1).
В срезах один, несколько или даже все параметры могут быть пропущены.
list[::3] # Берем каждый третий элемент list[2::2] # Начиная со второго элемента берем каждый второй элемент list[4:6:] # Начиная с 4 элемента берем все элементы по 6 элемент list[::] # Берем все элементы
Также могут быть использованы отрицательные числа для срезов.
Функции по работе со строками
word = 'FootBALL, baskeTball, skate' # print(word.count('!')) # print(word.capitalize()) # print(word.find('pr')) hobby = word.split(', ') for i in range(len(hobby)): hobby[i] = hobby[i].capitalize() result = ", ".join(hobby) print(result)
Посмотреть остальной код можно после подписки на проект!
Задание к уроку
Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям
Большое задание по курсу
Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца
Также стоит посмотреть





Комментарии (8)
Николай 15 марта 2023 в 18:59
Какое отношение первое задание имеет к этой тем. В уроке функция enumate вообще не рассматривалась.
Anna 10 февраля 2023 в 17:06
Выведите в списке третий элемент с конца
list_2 = [3.4, 56, «Some», «Hi», 7, 3.8, 44]
print(list_2[-3])
Anna 10 февраля 2023 в 17:03
используйте функцию enumerate.
Anna 10 февраля 2023 в 17:03
Выведите каждый 3 элемент списка начиная с первого и заканчивая предпоследним.
list = [3.4, 56, «Some», «Hi», 7, 3.8, 44]
print(list[:-1:3])
Муса 04 февраля 2023 в 19:44
У вас написано list[2::2] # Начиная со ВТОРОГО элемента. А там с третьего
Zakhar 21 января 2023 в 22:50
import random print("Welcome to casino XBET!") user_logins = [''] user_passwords = [''] user_choose = input(('Choose registration or log into: ')) if user_choose == 'registration': user_logins.append(input('Create your login: ')) user_passwords.append(input('Create your password: ')) user_enter_login = input('Enter your login: ') if user_enter_login in user_logins: print('The login is Wright') else: print('The login is wrong') user_enter_password = input('Enter your password: ') if user_enter_password in user_passwords: print("The password is right") else: print('The password is wrong') elif user_choose == 'log into': user_enter_login = input('Enter your login: ') if user_enter_login in user_logins: print('The login is Wright') else: print('The login is wrong') user_enter_password = input('Enter your password: ') if user_enter_password in user_passwords: print("The password is right") else: print('The password is wrong') else: exit() balance = 100 print('Your balance = ', balance) while balance > 0: user_num = int(input("Enter your number 1-10: ")) if user_num == random.randrange(1,10): balance += 10 print('You won 10 USD') print('Your balnce is: ', balance) else: balance -= 10 print("You lose 10 USD") print("Your balance is: ", balance)
Сделал мини казино с тех знаний которые получил
Борис 18 июля 2023 в 15:39
Антон 12 ноября 2023 в 21:42
Shakhboz 24 декабря 2022 в 17:35
What is enumerate? At least, explain in text. There is nothing about it in the video. Thanks!
Андрей 20 октября 2022 в 12:19
enumerate вообще никак не объясняется в видео. Чтобы решить задание, нужно искать инфу в инете. Странный подход к обучению)
Срезы в Python
Скорее всего, вы уже знакомы со срезами. В предыдущих статьях мы касались слайсинга списков.
Технически слайсинг опирается на индексирование. Поэтому срезы работают только с типами последовательностей.
Для изменяемых типов последовательностей, таких как списки, можно использовать срезы для извлечения и присвоения данных. Например:
colors = ['красный', 'зеленый', 'синий', 'оранжевый'] # извлекаем данные print(colors[1:3]) # присваиваем новые значения colors[1:3] = ['розовый', 'черный'] print(colors)
Вывод
['зеленый', 'синий']
['красный', 'розовый', 'черный', 'оранжевый']
Однако срезы можно использовать для извлечения данных и из неизменяемых последовательностей. Например:
topic = 'Срезы в Python' # извлекаем данные print(topic[0:6])
Вывод
Срезы
Если вы попытаетесь использовать срезы для присвоения данных неизменяемой последовательности, Python сообщит об ошибке. Например:
topic[0:6] = 'Списки' # ошибка TypeError: 'str' object does not support item assignment
Срез последовательность[начало:конец] возвращает элементы с индекса начало до индекса конец — 1 .
Совет. Представляйте что индексы находятся между элементами, когда вы делаете срез последовательности — как показано на рисунке ниже.
Срез — это объект
В Python все является объектом, в том числе — срезы.
Когда вы используете синтаксис срезов:
последовательность[начало:конец]
. на самом деле начало:конец — объект класса slice.
slice(начало, конец)
Давайте убедимся в этом с помощью функции type() :
s = slice(1, 3) print(type(s)) print(s.start, s.stop)
Вывод
Тот факт, что срезы являются объектом типа slice, позволяет не использовать классический синтаксис срезов
colors[1:3]
. а, например, использовать срез как объект:
colors = ['красный', 'зеленый', 'синий', 'оранжевый'] s = slice(1, 3) print(colors[s])
Вывод
['зеленый', 'синий']
Границы срезов
Срез последовательность[начало:конец] выбирает элементы, чей индекс находится в промежутке между с индексами начало и конец (не включая элемент с индексом конец ).
Другими словами, он возвращает все элементы последовательности по индексу n , где n удовлетворяет следующему выражению:
началоЕсли начало или конец больше, чем длина последовательности, Python использует len(последовательность) вместо начало или конец соответсвенно.
Например, если указать конец больше длины списка, все равно выведутся все элементы. Python использует в качестве верхней границы len(последовательность) .
colors = ['красный', 'зеленый', 'синий', 'оранжевый'] print(colors[0:100])Вывод
['красный', 'зеленый', 'синий', 'оранжевый']Обе границы начало и конец опциональные. Если их не указывать, будут использованы зачения по умолчанию: начало — 0, конец — len(последовательность) .
colors = ['красный', 'зеленый', 'синий', 'оранжевый'] print(colors[10:])Вывод
['красный', 'зеленый', 'синий', 'оранжевый']Не указали верхнюю границы — все равно вывелся весь списка.
Отрицательные границы срезов
Объект slice также принимает отрицательные начальные и конечные границы.
В следующем примере для слайсинга списка используются отрицательные начальные и конечные границы:
colors = ['красный', 'зеленый', 'синий', 'оранжевый'] print(colors[-4:-2])Вывод
['красный', 'зеленый']Чтобы получить элементы 'синий' и 'оранжевый' из списка colors , можно объединить отрицательные и положительные границы:
colors = ['красный', 'зеленый', 'синий', 'оранжевый'] print(colors[-2:4])Вывод
['синий', 'оранжевый']Шаг в срезах
Срезы поддерживают третий аргумент — шаг. Если его не указывать, по умолчанию значение шага равно 1.
последовательность[начало:конец:шаг]Если вспомнить, что срезы являются объектом, срезы с шагом можно использовать и так:
s = slice(начало, конец, шаг) последовательность[s]Пример
colors = ['красный', 'зеленый', 'синий', 'оранжевый'] print(colors[0:4:2])Вывод
['красный', 'синий']Метод indices()
Объект slice по сути определяет последовательность индексов для выбора элементов последовательности.
Чтобы сделать выбор элементов более удобным, у класса slice есть метод indices() , который возвращает эквивалентный диапазон (начало, конец, шаг) для любого среза последовательности с заданной длиной:
slice(начало, конец, шаг).indices(длина) # вернется кортеж (i, j, k)Вы можете использовать значения кортежа, который возвращает indices() для создания списка индексов с помощью функции range() . Например:
colors = ['красный', 'зеленый', 'синий', 'оранжевый'] s = slice(0, 4, 2) t = s.indices(len(colors)) for index in range(*t): print(colors[index])Вывод
красный
синийКак это работает
- Создается объект slice со следующими параметрами: начало — 0, конец — 4, шаг — 2.
- Возвращается кортеж индексов среза последовательности, длина которого равна длине списка colors .
- Кортеж передается в функцию range() для выбора элементов из списка colors .
Что нужно запомнить
- Срезы работают только для последовательностей: изменяемых и неизменяемых.
- Срез — это объект класса slice.
СodeСhick.io - простой и эффективный способ изучения программирования.
2024 © ООО "Алгоритмы и практика"
Срезы — Python: Списки
Работать с одиночными элементами вы уже умеете. Настало время перейти к очень интересному инструменту, который Python предоставляет для работы с целыми подмножествами элементов списка: к так называемым срезам (slices).
Синтаксис описания срезов
Срезы встроены в язык и снабжены своим собственным синтаксисом — настолько широко они используются. Срез записывается так же, как записывается обращение к элементу списка по индексу:
some_list[START:STOP:STEP]
Всего у среза три параметра:
- START — индекс первого элемента в выборке
- STOP — индекс элемента списка, перед которым срез должен закончиться. Сам элемент с индексом STOP не будет входить в выборку
- STEP — шаг прироста выбираемых индексов
Математически говоря, во множество будут входить индексы элементов, которые будут выбраны:
Например, срез [3:20:5] означает выборку значений с индексами 3, 8, 13 и 18.
При этом любой из трех параметров среза может быть опущен и вместо соответствующего параметра будет выбрано некое значение по умолчанию:
- Умолчательный START означает «от начала списка»
- Умолчательный STOP означает «до конца списка включительно»
- Умолчательный STEP означает «брать каждый элемент»
Вот несколько примеров с разными наборами параметров:
- [:] или [::] — весь список
- [::2] — нечетные по порядку элементы
- [1::2] — четные по порядку элементы
- [::-1] — все элементы в обратном порядке
- [5:] — все элементы, начиная с шестого
- [:5] — все элементы, не доходя до шестого
- [-2:1:-1] — все элементы от предпоследнего до третьего в обратном порядке. Во всех случаях выборки от большего индекса к меньшему нужно указывать шаг
Срезы могут работать в двух режимах: собственно выборка и присваивание.
Выборка элементов
Срезы-выборки работают со списками, кортежами, строками. Результатом применения выборки всегда становится новое значение соответствующего типа — список, кортеж, строка:
'hello'[2:] # 'llo' (1, "foo", True, None)[2:] # (True, None) [1, 2, 3, 4, 5][2:] # [3, 4, 5]
Сразу сделаем несколько замечаний по использованию выборок:
- Кортежи чаще всего содержат разнородные элементы, поэтому срезы для них менее полезны, чем распаковка и перепаковка: тяжело удерживать в голове типы элементов вместе с индексами
- При выборке по срезу [:] создается новая копия списка, поэтому именно так обычно список и копируют
- Срез порождает новый список или кортеж, но для каждого выбранного элемента копируется только ссылка
Присваивание срезу
В отличие от строк и кортежей списки могут изменяться по месту. Одним из вариантов модификации является присваивание срезу. Срезу с указанным шагом можно присвоить список, содержащий соответствующее количество новых элементов:
l = [1, 2, 3, 4, 5, 6] l[::2] = [0, 0, 0] print(l) # => [0, 2, 0, 4, 0, 6]
Если вы попробуете присвоить срезу с шагом неверное количество элементов, то получите ошибку:
l = [1, 2, 3, 4] l[::2] = [5, 6, 7] # Traceback (most recent call last): # File "", line 1, in # ValueError: attempt to assign sequence of size 3 to extended slice of size 2
Если срез непрерывный, то есть шаг не указан и индексы идут подряд, то свободы нам дается больше. Такому срезу можно присвоить как больше элементов — тогда список вырастет, так и меньше, что приведет к урезанию списка:
l = [1, 2, 3] l[2:] = [4, 5] print(l) # => [1, 2, 4, 5] l[1:-1] = [100] print(l) # => [1, 100, 5] l[:] = [] print(l) # => []
Сначала список растет, потом уменьшается, а под конец вообще становится пустым — и все с помощью компактного, но мощного синтаксиса срезов.
Срезы-значения
Хоть срезы и имеют специальную поддержку со стороны синтаксиса, но мы можем создавать и использовать срезы сами по себе — как обычные значения.
Значение среза можно сконструировать с помощью функции slice :
first_two = slice(2) each_odd = slice(None, None, 2) print(each_odd) # => slice(None, None, 2) l = [1, 2, 3, 4, 5] print(l[first_two]) # => [1, 2] print(l[each_odd]) # => [1, 3, 5]
Функция slice принимает от одного до трех параметров — те самые START , STOP и STEP . При вызове функции с одним параметром, функция вызывается с параметром STOP .
Если вы хотите пропустить один из параметров, то подставьте вместо него None . Также None можно использовать и в записи срезов в квадратных скобках — там он так же будет означать пропуск значения.
На месте параметров среза могут быть любые выражения, лишь бы эти выражения вычислялись в целые числа или None .
Соотношение START и STOP
В срезе элемент с индексом STOP не попадает в выборку, в отличие от элемента с индексом START .
У такого поведения есть одна особенность. Какой бы неотрицательный индекс n мы ни выбрали, для любого списка будет соблюдаться указанное равенство:
l == l[:n] + l[n:]
Посмотрим на такой пример:
s = 'Hello!' print(s[:2] + s[2:]) # => 'Hello!' print(s[:4] + s[4:]) # => 'Hello!' print(s[:0] + s[0:] == s) # => True print(s[:100] + s[100:] == s) # => True
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Что такое срезы и как их использовать в Python
Откройте для себя мощь срезов в Python, узнайте, как извлекать части строк, списков и кортежей, а также сделать ваш код лаконичным и читаемым.
Алексей Кодов
Автор статьи
10 июля 2023 в 17:48
Срезы (slices) — это удобный инструмент в Python для работы с итерируемыми объектами, такими как строки, списки и кортежи. Они позволяют легко извлекать часть объекта, не изменяя его исходное состояние. В этой статье мы рассмотрим основы работы с срезами и приведем примеры их использования.
Основы срезов
Срезы создаются с помощью квадратных скобок [] и двоеточия : . Синтаксис среза выглядит следующим образом:
iterable_object[start:stop:step]
- start — индекс начала среза (включительно)
- stop — индекс окончания среза (исключительно)
- step — шаг (по умолчанию равен 1)
Важно отметить, что индексация в Python начинается с нуля.
Примеры использования срезов
Строки
Рассмотрим пример с использованием срезов для работы со строками:
text = "Python is fun!" # Извлечение подстроки с 0 по 6 индекс (не включая 6) substring = text[0:6] print(substring) # Вывод: Python
Списки
Срезы также применимы для работы со списками:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Извлечение чисел от 3 до 7 (не включая 7) sublist = numbers[3:7] print(sublist) # Вывод: [3, 4, 5, 6]
Шаг среза
Параметр step позволяет извлекать элементы с определенным шагом:
# Извлечение каждого второго числа из списка even_numbers = numbers[0::2] print(even_numbers) # Вывод: [0, 2, 4, 6, 8]
Отрицательные индексы
Отрицательные индексы позволяют работать с итерируемыми объектами в обратном порядке:
# Извлечение последнего символа строки last_char = text[-1] print(last_char) # Вывод: !
Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT

Заключение
Теперь вы знакомы с основами работы с срезами в Python и можете использовать их для удобства при работе с итерируемыми объектами. Срезы являются мощным инструментом, который поможет сделать ваш код более лаконичным и читаемым. Удачи вам в изучении Python!