Кортеж (tuple) представляет последовательность элементов, которая во многом похожа на список за тем исключением, что кортеж является неизменяемым (immutable) типом. Поэтому мы не можем добавлять или удалять элементы в кортеже, изменять его.
Для создания кортежа используются круглые скобки, в которые помещаются его значения, разделенные запятыми:
| 1 2 | user = ("Tom", 23)print(user) |
Также для определения кортежа мы можем просто перечислить значения через запятую без применения скобок:
| 1 2 | user = "Tom", 23print(user) |
Если вдруг кортеж состоит из одного элемента, то после единственного элемента кортежа необходимо поставить запятую:
| 1 | user = ("Tom",) |
Для создания кортежа из списка можно передать список в функцию tuple(), которая возвратит кортеж:
| 1 2 3 | users_list = ["Tom", "Bob", "Kate"]users_tuple = tuple(users_list)print(users_tuple) # ("Tom", "Bob", "Kate") |
Обращение к элементам в кортеже происходит также, как и в списке по индексу. Индексация начинается также с нуля при получении элементов с начала списка и с -1 при получении элементов с конца списка:
| 1 2 3 4 5 6 7 | users = ("Tom", "Bob", "Sam", "Kate")print(users[0]) # Tomprint(users[2]) # Samprint(users[-1]) # Kate# получим часть кортежа со 2 элемента по 4print(users[1:4]) # ("Bob", "Sam", "Kate") |
Но так как кортеж – неизменяемый тип (immutable), то мы не сможем изменить его элементы. То есть следующая запись работать не будет:
| 1 | users[1] = "Tim" |
При необходимости мы можем разложить кортеж на отдельные переменные:
| 1 2 3 4 5 | user = ("Tom", 22, False)name, age, isMarried = userprint(name) # Tomprint(age) # 22print(isMarried) # False |
Особенно удобно использовать кортежи, когда необходимо возвратить из функции сразу несколько значений. Когда функция возвращает несколько значений, фактически она возвращает в кортеж:
| 1 2 3 4 5 6 7 8 9 10 11 | def get_user():name = "Tom"age = 22is_married = Falsereturn name, age, is_married user = get_user()print(user[0]) # Tomprint(user[1]) # 22print(user[2]) # False |
С помощью встроенной функции len() можно получить длину кортежа:
| 1 2 | user = ("Tom", 22, False)print(len(user)) # 3 |
Перебор кортежей
Для перебора кортежа можно использовать стандартные циклы for и while. С помощью цикла for:
| 1 2 3 | user = ("Tom", 22, False)for item in user:print(item) |
С помощью цикла while:
| 1 2 3 4 5 6 | user = ("Tom", 22, False)i = 0while i < len(user):print(user[i])i += 1 |
Как для списка с помощью выражения элемент in кортеж можно проверить наличие элемента в кортеже:
| 1 2 3 4 5 6 | user = ("Tom", 22, False)name = "Tom"if name in user:print("Пользователя зовут Tom")else:print("Пользователь имеет другое имя") |
Сложные кортежи
Один кортеж может содержать другие кортежи в виде элементов. Например:
| 1 2 3 4 5 6 7 8 9 10 11 | countries = (("Germany", 80.2, (("Berlin",3.326), ("Hamburg", 1.718))),("France", 66, (("Paris", 2.2),("Marsel", 1.6)))) for country in countries:countryName, countryPopulation, cities = countryprint("\nCountry: {} population: {}".format(countryName, countryPopulation))for city in cities:cityName, cityPopulation = cityprint("City: {} population: {}".format(cityName, cityPopulation)) |
Здесь кортеж countries, который представляет страны, состоит из кортежей, каждый из которых – отдельная страна.
Вложенные кортежи имеют три элемента: название страны, численность ее населения и города. Города представляют отдельный кортеж, где каждый отдельный город – это вложенный кортеж, содержащий название города и численность его населения.