Mateusz Mazurek – programista z pasją

Blog o Pythonie i kilku innych technologiach. Od developera dla wszystkich.

Programowanie Programowanie webowe

Tablice w Pythonie (nie mylić z listami)

Cześć.

Strzelam ślepo, że tej kolekcji w Pythonie nie znasz. I nie jest to dziwne, ponieważ jest spora szansa, że nigdy nie będziesz potrzebował jej używać. Mimo to, wiedza, że taki obiekt istnieje, do czego służy, jakie ma ograniczenia i jakie zalety, może się przydać. Może kiedyś tą wiedzą uratujesz projekt? Ale dość dywagacji, przejdźmy do sedna.

Czym są tablice w Pythonie?

Tablice w Pythonie, a precyzyjniej w CPythonie, to cieniutki wrapper na tablice znane z języka C. Wprost z tego faktu wynika inny fakt: tablice wymagają deklaracji tego, jaki typ danych będą przechowywać. Działa to tak:

1
2
3
4
5
6
7
8
from array import array
from collections.abc import Iterable

arr = array('i', [1, 2, 3, 4, 5])

print(arr)  # array('i', [1, 2, 3, 4, 5])

print(isinstance(arr, Iterable))  # True

Czyli pierwszy argument to deklaracja typu, gdzie możliwości są takie:

A próba przekroczenia zdefiniowanego typu skutkuje wyjątkiem:

1
2
3
4
5
6
7
8
9
10
from array import array

arr = array('h', [3658653, 245635])

"""
Traceback (most recent call last):
  File "/home/mmazurek/PycharmProjects/tests/c.py", line 3, in <module>
    arr = array('h', [3658653, 245635])
OverflowError: signed short integer is greater than maximum
"""

Więc już na samym początku jest ograniczenie. Wygodne to nie jest, ale nie uprzedzajmy się.

Praca z tablicami

Podstawowy interfejs znany z list jest wspólny dla obu typów, więc część metod działa zgodnie z przewidywaniem:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from array import array

arr = array('i', [2305, 11243, 86743])

for x in arr:
    print(x)

"""
2305
11243
86743
"""


arr.append(48493)

print(arr)  # array('i', [2305, 11243, 86743, 48493])

arr.extend([1, 3, 7])

print(arr)  # array('i', [2305, 11243, 86743, 48493, 1, 3, 7])

arr.remove(3)

print(arr)  # array('i', [2305, 11243, 86743, 48493, 1, 7])

arr.index(2305)  # zwraca 0

Dodatkowo, tak jak listy, są obiektami zmiennymi, zachowują kolejność elementów i pozwalają na duplikaty.


Czekaj, stop!

Podoba Ci się to co tworzę? Jeśli tak to zapraszam Cię do zapisania się na newsletter:
a w ramach prezentu otrzymasz całkowicie za darmo, dwa dokumenty PDF „6 (nie zawsze oczywistych) błędów popełnianych podczas nauki programowania” który jest jednym z efektów ponad siedmioletniej pracy i obserwacji rozwoju niejednego programisty oraz „Wstęp do testowania w Pythonie”, będący wprowadzeniem do biblioteki PyTest.
Jeśli to Cię interesuje to zapraszam również na swoje social media.

Więc kiedy warto użyć tablic zamiast list?

Przede wszystkim wtedy, kiedy jest sens korzystać z ich największej zalety. A tą zaletą jest zużycie pamięci. Tablice, zgodnie z tym co napisałem na samym początku, są cieniutkim wrapperem na odpowiadający im ten sam typ w języku C, więc omijają narzut który dodaje język Python, by uzyskać funkcje dostępne dla list. Zerknij na kod:

1
2
3
4
5
6
7
8
9
10
from array import array
from pympler.asizeof import asizeof

numbers = list(range(0, 10000))

numbers_as_array = array('i', numbers)


print(asizeof(numbers_as_array))  # 40064 B
print(asizeof(numbers))  # 400048 B

Kończąc

Wpis krótki, ale myślę, że ciekawy. Ja osobiście nie miałem nigdy konieczności skorzystania z tego obiektu, ale jestem przekonany, że ta wiedza nie jest bezużyteczna.

Dzięki za wizytę,
Mateusz Mazurek

A może wolisz nowości na mail?

Subskrybuj
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

2 komentarzy
Inline Feedbacks
View all comments
Ewelina

Dziękuję. Zanim zaczęłam uczyć się Pythona, miałam jakieś mgliste pojęcie o tablicach w C. I na początku drogi i nauce o wbudowanych typach obiektów, zastanawiałam się co z tablicami ;D