В Python последователностите са подредени колекции от елементи или елементи. Те ви позволяват да съхранявате и манипулирате множество стойности заедно. Python предоставя няколко вида последователности, включително контейнерни последователности и плоски последователности, които могат да бъдат допълнително категоризирани въз основа на тяхната променливост.

Поредици от контейнери

Контейнерните последователности са структури от данни, които съдържат препратки към други обекти. Те предоставят начин за групиране на множество елементи заедно. Ключовите характеристики на контейнерните последователности са следните:

  • Хетерогенни данни: Контейнерните последователности могат да съдържат елементи от различни типове. Например списъкът може да съдържа цели числа, низове и дори други списъци като елементи.
  • Влагане: Контейнерните последователности могат да имат вложени структури, което означава, че елементите в контейнерна последователност могат сами по себе си да бъдат контейнерни последователности. Това позволява организиране на данните по йерархичен начин. Например, един списък може да съдържа други списъци като елементи, създавайки вложена структура.
  • Променливи и неизменни варианти: Python предоставя както променливи, така и неизменни контейнерни последователности. Списъците са променливи, което означава, че техните елементи могат да бъдат модифицирани след създаването. Кортежите, от друга страна, са неизменни и техните елементи не могат да бъдат променяни, след като бъдат присвоени.

Примери за последователности от контейнери:

  • Списък: my_list = [1, 'hello', [2, 3]]
  • Кортеж: my_tuple = (1, 'hello', [2, 3])
  • Комплект: my_set = {1, 2, 3}

Контейнерните последователности са гъвкави и осигуряват гъвкавост за съхраняване на различни типове данни, включително вложени структури и елементи от различни типове.

Плоски последователности

Плоските последователности съхраняват действителните стойности на своите елементи директно, без да съдържат препратки към други обекти. Те имат фиксиран тип елемент и не поддържат влагане. Основните характеристики на плоските последователности са следните:

  • Хомогенни данни: Плоските последователности съхраняват елементи от един и същи тип. Например низът може да съдържа само символи, а последователността от байтове може да съдържа само байтове.
  • Фиксиран тип: Типът елемент на плоските последователности е фиксиран. В низовете елементите са Unicode символи, а в байтовете елементите са байтове. Това гарантира последователно и еднакво представяне на данните.
  • Неизменни и променливи варианти: Низовете са неизменни, което означава, че техните елементи не могат да бъдат модифицирани след създаването. Байтовете също са неизменни. Python обаче предоставя типа bytearray, който е променлив и позволява модифициране на неговите елементи.

Примери за плоски последователности:

  • Низ: my_string = 'Hello, world!'
  • Байтове: my_bytes = b'\x48\x65\x6c\x6c\x6f'
  • Байтов масив: my_bytearray = bytearray(b'\x48\x65\x6c\x6c\x6f')

Плоските последователности са ефективни за съхраняване на хомогенни данни и осигуряват оптимизирано съхранение и манипулиране на стойности в компактна форма.

В Python последователностите също могат да бъдат категоризирани като неизменни или променливи въз основа на това дали могат да бъдат модифицирани, след като са създадени. Неизменни последователности

Неизменните последователности не могат да бъдат променяни, след като бъдат създадени. Всяка операция, която изглежда, че променя неизменна последователност, всъщност създава нова последователност с желаните промени.

Променливи последователности:

Променливите последователности, от друга страна, могат да бъдат модифицирани след създаването. Операциите могат директно да променят последователността, без да създават нова.

Основните разлики между неизменни и променливи последователности са следните:

Модификация:

  • Неизменни последователности: Неизменните последователности не позволяват директни модификации на техните елементи. Ако трябва да промените елемент в неизменна последователност, трябва да създадете нова последователност с модифицирания елемент.
  • Променливи последователности: Променливите последователности осигуряват методи или операции за директно модифициране на техните елементи. Можете да променяте, добавяте или премахвате елементи в променлива последователност, без да създавате нова последователност.

Памет и производителност:

  • Неизменни последователности: Тъй като неизменните последователности не могат да бъдат модифицирани, Python може да направи определени оптимизации. Например, ако две неизменни последователности имат едно и също съдържание, Python може да ги насочи към едно и също място в паметта, спестявайки памет.
  • Променливи последователности: Променливите последователности изискват допълнителна памет за съхраняване на техните елементи. Когато елементите се добавят или премахват, може да се наложи последователността да преоразмери или премести елементи, което може да повлияе на производителността.

Задание:

  • Неизменни последователности: Присвояването на неизменна последователност на нова променлива създава препратка към същото място в паметта. Всички промени, направени в последователността чрез една променлива, няма да засегнат другите променливи.
  • Променливи последователности: Присвояването на променлива последователност на нова променлива създава препратка към същото място в паметта. Промените, направени чрез една променлива, ще бъдат отразени във всички други променливи, отнасящи се до същата последователност.

Примери:

  • Неизменни последователности: Примерите за неизменни последователности в Python включват низове, кортежи и именувани кортежи.
  • Променливи последователности: Примерите за променливи последователности в Python включват списъци и байтови масиви.

Важно е да се отбележи, че тези разлики се отнасят за самите последователности, а не непременно за елементите, съдържащи се в тях. Например, можете да имате променлива последователност (напр. списък), която съдържа неизменни елементи (напр. низове).

Нека илюстрираме разликите между неизменни и променливи последователности, като използваме примери за код в Python:

# Create an immutable sequence (tuple)
tuple_seq = (1, 2, 3)

# Try modifying the sequence
tuple_seq[0] = 10  # Raises a TypeError: 'tuple' object does not support item assignment

# Create a new tuple with modified elements
new_tuple_seq = tuple_seq + (4,)

print(tuple_seq)       # Output: (1, 2, 3)
print(new_tuple_seq)   # Output: (1, 2, 3, 4)

В горния пример tuple_seq е неизменна последователност (кортеж). Когато се опитаме да модифицираме елемент в кортежа, той повдига TypeError, тъй като кортежите не поддържат присвояване на елементи. Вместо това създаваме нов кортеж, new_tuple_seq, като свързваме оригиналния кортеж с допълнителен елемент.

# Create a mutable sequence (list)
list_seq = [1, 2, 3]

# Modify the sequence directly
list_seq[0] = 10

print(list_seq)  # Output: [10, 2, 3]

# Add an element to the list
list_seq.append(4)

print(list_seq)  # Output: [10, 2, 3, 4]

# Remove an element from the list
list_seq.remove(2)

print(list_seq)  # Output: [10, 3, 4]

В този пример list_seq е променлива последователност (списък). Можем директно да променяме елементите в списъка, като използваме индексиране или методи като append() и remove(). Промените, направени в списъка, се отразяват незабавно.

Препратки

[1] L. Ramalho, Fluent Python: Ясно, кратко и ефективно програмиране, 2-ро издание. Пекин Китай; Бостън [MA]: O’Reilly Media, 2022 г.