Кортежи tuple
в Python предназначены, как и списки, для хранения последовательностей, состоящих из данных любого типа. Однако, в отличие от списков, кортежи относятся к неизменяемым типам данных. По этой причине в них часто хранят информацию, которую необходимо защитить от случайного изменения – например, конфигурационные данные.
Кортеж в Питоне: свойства и особенности
1. Кортежи не поддерживают добавление и удаление элементов, но допускают расширение и дополнение для тех элементов, которые относятся к изменяемым типам (списки, словари), а также любые операции с элементами элементов:
>>> numbers = ([1, 2, 3, 4], [5, 4, 5])
>>> numbers[1].extend([3, 5, 9])
>>> numbers[0].append([7, 7, 8])
>>> numbers[1][1] += 5
>>> print(numbers)
([1, 2, 3, 4, [7, 7, 8]], [5, 9, 5, 3, 5, 9])
2. Кортежи поддерживают неограниченный уровень вложенности:
numbers = ((4, 5, 8, (5, 1, (5, 3))), (7, 2, (4, 5, (3, 1, 1))))
3. Кортежи работают немного быстрее, чем списки – это связано с особенностями хранения tuple
в памяти:
>>> from timeit import timeit
>>> times = 1000000
>>> t1 = timeit("list(['груша', 'виноград','яблоко', 'банан', 'апельсин'])", number=times)
>>> t2 = timeit("tuple(('груша', 'виноград','яблоко', 'банан', 'апельсин'))", number=times)
>>> diff = "{:.0%}".format((t2 - t1)/t1)
>>> print(f'Время копирования списка {times} раз: {t1}')
Время копирования списка 1000000 раз: 0.5761922669999961
>>> print(f'Время копирования кортежа {times} раз: {t2}')
Время копирования кортежа 1000000 раз: 0.22475764600000048
>>> print(f'Разница: {diff}')
Разница: -61%
4. Кортежи занимают меньше места в памяти:
>>> from sys import getsizeof
>>> numbers1 = ((1, 2, 3, 4), (5, 4, 5))
>>> numbers2 = [[1, 2, 3, 4], [5, 4, 5]]
>>> print(getsizeof(numbers1))
36
>>> print(getsizeof(numbers2))
44
5. Кортежи поддерживают конкатенацию +
и повторение * n
:
>>> num1 = (1, 2, 3)
>>> num2 = (4, 5, 6)
>>> print(num1 + num2)
(1, 2, 3, 4, 5, 6)
>>> print(num1 * 3)
(1, 2, 3, 1, 2, 3, 1, 2, 3)
6. Элементы tuple
можно использовать в качестве значений переменных; этот прием называют распаковкой кортежа:
>>> seasons = ('весна', 'лето', 'осень', 'зима')
>>> s1, s2, s3, s4 = seasons
>>> print(s1, s3)
весна осень
Создание tuple в Питоне
Пустой кортеж можно создать двумя способами – с помощью круглых скобок ()
и с использованием функции tuple()
:
my_tuple = ()
my_tuple2 = tuple()
При создании кортежа с одним элементом после этого элемента необходимо ставить запятую, иначе Python не определяет конструкцию как кортеж:
>>> my_tuple = (5)
>>> print(type(my_tuple))
<class 'int'>
>>> my_tuple = (5,)
>>> print(type(my_tuple))
<class 'tuple'>
Создать кортеж с несколькими элементами можно следующими способами.
Способ 1: Перечисление элементов
Как и в случае со списками и словарями, кортеж с данными можно создать вручную. Кортеж может содержать данные различных типов:
info = ('Егор', 'разработчик', 350000, 28)
Элементы кортежа необязательно перечислять в круглых скобках – когда Python получает более одного значения для переменной, создание ("упаковка") кортежа происходит автоматически:
>>> letters = 'a', 'b', 'c', 'd'
>>> print(letters)
('a', 'b', 'c', 'd')
Способ 2: Преобразование других типов данных
С помощью встроенной функции tuple()
можно создать кортеж из списка, строки или множества:
>>> my_lst = [4, 6, 2, 8]
>>> print(tuple(my_lst))
(4, 6, 2, 8)
>>> my_str = 'Я изучаю Python'
>>> print(tuple(my_str))
('Я', ' ', 'и', 'з', 'у', 'ч', 'а', 'ю', ' ', 'P', 'y', 't', 'h', 'o', 'n')
>>> my_set = {2, 5, 6, 7}
>>> print(tuple(my_set))
(2, 5, 6, 7)
Однако при подобном преобразовании словаря в кортеж останутся только ключи:
>>> my_dict = {'яблоки': 52, 'апельсины': 35}
>>> print(tuple(my_dict))
('яблоки', 'апельсины')
Число напрямую преобразовать в кортеж нельзя:
>>> num = 178394
>>> print(tuple(num))
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: 'int' object is not iterable
Но если конвертировать число в строку, преобразование пройдет без ошибок:
>>> num = 31232534
>>> print(tuple(str(num)))
('3', '1', '2', '3', '2', '5', '3', '4')
В ходе преобразования строки в кортеж с помощью одной лишь функции tuple()
строка разбивается на отдельные символы. Если нужно разбить строку по одному разделителю, подойдет метод partition()
:
>>> st = 'Я изучаю***Python'
>>> print(st.partition('***'))
('Я изучаю', '***', 'Python')
Чтобы разбить строку по всем разделителям, вместе с tuple()
используют split()
:
>>> st = tuple(input().split())
Код на языке Python
>>> print(st)
('Код', 'на', 'языке', 'Python')
Способ 3: Генератор кортежей
Генераторы кортежей, в отличие от списков и словарей, не слишком удобно использовать для решения практических задач:
>>> my_tuple = (i for i in range(5))
>>> print(my_tuple)
<generator object <genexpr> at 0x023B5830>
Но если генератор кортежа все-таки необходимо использовать, это можно сделать двумя способами:
1. Распаковать сгенерированный объект при выводе:
>>> numbers = (i for i in range(10))
>>> print(*numbers)
0 1 2 3 4 5 6 7 8 9
2. Либо использовать в генераторе функцию tuple()
:
>>> my_tuple = tuple(i ** 2 for i in range(1, 12, 2))
>>> print(my_tuple)
(1, 9, 25, 49, 81, 121)
Способ 4: Распаковка строк и списков
Оператор распаковки *
и запятая после имени переменной автоматически превращают строки и списки в кортежи:
>>> st = 'Я изучаю Python'
>>> sp = ['Python', 'HTML5', 'CSS', 'JavaScript']
>>> tuple1 = (*st,)
>>> tuple2 = (*sp,)
>>> print(tuple1)
('Я', ' ', 'и', 'з', 'у', 'ч', 'а', 'ю', ' ', 'P', 'y', 't', 'h', 'o', 'n')
>>> print(tuple2)
('Python', 'HTML5', 'CSS', 'JavaScript')
Отлично! Вы полностью разобрались в том, что такое кортежи и как их создавать.
Вы знаете их ключевые отличия от списков, понимаете их преимущества в скорости и памяти, и владеете всеми способами их создания.
Но как извлечь из кортежа нужные данные, отсортировать их или посчитать количество элементов? В полной версии урока вы:
- Освоите все методы для работы с данными в кортежах: от поиска элементов с помощью
.index()
до их подсчета с.count()
. - Научитесь сортировать данные из кортежей и преобразовывать их в другие типы данных (списки, словари) для дальнейшей обработки.
- Закрепите навыки на 10 практических задачах, включая работу с вложенными структурами и обработку данных.
Комментарии
Почему удалили задач?
удалили задачи?
Судя по всему здесь тоже ошибка.
спасибо, что заметили :) это из-за копипасты:
Вот здесь ошибка.