Baytlar ardıcıllığı

Bildiyiniz kimi, bayt rəqəmsal informasiyanın saxlanması və emalının minimal vahididir. Baytların məntiqi ardıcıllığı hansısa bir informasiyanı (mətn, şəkil, musiqi və s.) özündə saxlayır. Baytlarla işləmək üçün Python dilində iki tip nəzərdə tutulub: bytes (baytlar ardıcıllığı) və bytearray (baytlar massivi). Biz bu dərsimizdə bytes tipi ilə yaxından tanış olacağıq.
bytes — [0…255] aralığında yerləşən tam ədədlərin ardıcıllığını saxlamağa imkan verən dəyişməz tipdir. Bu tam ədədlər informasiya parçalarının (məsələn: sətrin simvollarının) kodlarıdır. Qısa şəkildə desək, bytes baytlar ardıcıllığıdır.
Python proqramlaşdırma dilində bytes tipli obyekti meydana gətirməyin bir neçə üsulu vardır. Gəlin onları bir-bir nəzərdən keçirək.

b’sətir’

Sətir önünə b (və ya B) prefiksini qoymaqla bytes tipli obyektləri əldə etmək olar. Burada sətirlər tək, qoşa və ya üç qoşa dırnaq arasında göstərilə bilər:

>>> b'Python' 
b'Python'
>>> b"Cobra" 
b'Cobra'
>>> b"""Anaconda""" 
b'Anaconda'
>>>

Burada diqqət etməlisiniz ki, sətir içərisində yalnız ASCII kodlaşdırmasına daxil olan simvollar yer alsın, əks halda, xəta qeydə alınacaq:

>>> b'Koramal'
b'Koramal'
>>> b'Gürzə'
SyntaxError: bytes can only contain ASCII literal characters. 
>>>

Verilmiş sətirdə ASCII kodlaşdırmasına daxil olmayan simvollar, başqa sözlə, Unicode simvolları (indiki halda üə) varsa və siz də bu sətirdən b (və ya B) prefiksi ilə bytes tipli obyekt əldə etmək istəyirsinizsə, onda həmin simvolları baytlar ardıcıllığı kimi göstərməlisiniz:

>>> b'G\xc3\xbcrz\xc9\x99' 
b'G\xc3\xbcrz\xc9\x99'
>>>

bytes([sətir, kodlaşdırma[, xətalar]])

Bu funksiya parametrlərsiz istifadə edildiyi təqdirdə boş bytes obyektini qaytarır:

>>> bytes() 
b''
>>>

Verilmiş sətri bytes obyektinə çevirmək üçün funksiyadan minimum iki parametrlə istifadə olunmalıdır. Sadəcə sətir verilib, kodlaşdırma göstərilmədiyi təqdirdə xəta qeydə alınacaq:

>>> bytes('Python','utf-8') 
b'Python'
>>> bytes('Python')
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module> 
    bytes('Python')
TypeError: string argument without an encoding 
>>>

Funksiyanın üçüncü parametri olan xətalar isə xəta emaledicisinin göstərilməsi üçündür. Aşağıdakı cədvəldə mümkün xəta emaledicilərinin siyahısı verilmişdir:

Xəta emalediciTəyinatı
strictXəta zamanı UnicodeEncodeError istisnası qeydə alınır. Xəta emaledicisi göstərilmədikdə default olaraq (susmaya görə) bu qiymət qəbul edilir.
replaceKodlaşdırıla bilməyən simvol ‘?‘ (sual işarəsi) ilə əvəz olunur.
ignoreKodlaşdırıla bilməyən simvol iqnor edilir (məhəl qoyulmur).
xmlcharrefreplaceKodlaşdırıla bilməyən simvol müvafiq XML simvol istinadı ilə əvəz olunur.
backslashreplaceKodlaşdırıla bilməyən simvol tərs- kəsrli keçid ardıcıllığı ilə əvəz olunur.
namereplaceKodlaşdırıla bilməyən simvol \N{…} keçid ardıcıllığı ilə əvəz olunur.

Aşağıdakı nümunələri nəzərdən keçirin:

>>> bytes('Azərbaycan','ascii','strict') 
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    bytes('Azərbaycan','ascii','strict')
UnicodeEncodeError: 'ascii' codec can't encode character 
'\u0259' in position 2: ordinal not in range(128)
>>> bytes('Azərbaycan','ascii','replace')
b'Az?rbaycan'
>>> bytes('Azərbaycan','ascii','ignore') 
b'Azrbaycan'
>>> bytes('Azərbaycan','ascii','xmlcharrefreplace') 
b'Az&#601;rbaycan'
>>> bytes('Azərbaycan','ascii','backslashreplace') 
b'Az\\u0259rbaycan'
>>> bytes('Azərbaycan','ascii','namereplace') 
b'Az\\N{LATIN SMALL LETTER SCHWA}rbaycan' 
>>>

str.encode(kodlaşdırma, xətalar)

Bu funksiya verilmiş sətri kodlaşdıraraq baytlar ardıcıllığına çevirir. Burada kodlaşdırmaxətalar parametrlərinin yazılması məcburi deyil. Parametrlər boş buraxıldığı təqdirdə default olaraq (susmaya görə) kodlaşdırma utf-8, xəta emaledicisi də strict qəbul ediləcək. Digər xəta emaledicilərinin istifadəsi yuxarıda olduğu kimidir. Sətirlərin kodlaşdırılması üçün müxtəlif kodlaşdırmalardan istifadə edə bilərsiniz. Bununla bağlı Python dilinin rəsmi dokumentasiyasında (https://docs.python.org/3.14) Standart Kodlaşdırmalar Cədvəlinə baxa bilərsiniz.
Aşağıdakı nümunələri nəzərdən keçirin:

>>> "Gürzə".encode() 
b'G\xc3\xbcrz\xc9\x99' 
>>> "ü".encode() 
b'\xc3\xbc'
>>> "ə".encode()
b'\xc9\x99'
>>> "Gürzə".encode('ascii', 'ignore') 
b'Grz'
>>>

bytes([ardıcıllıq])

Bu funksiya 0 ilə 255 (hər ikisi daxil olmaqla) aralığında yerləşən tam ədədlərin ardıcıllığını bytes obyektinə çevirməyə imkan verir. Verilmiş ədəd aralığa daxil deyilsə, ValueError xətası qeydə alınır:

>>> bytes([97, 108, 109, 97]) 
b'alma'
>>> bytes([601, 116, 105, 114]) 
Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module> 
    bytes([601, 116, 105, 114])
ValueError: bytes must be in range(0, 256) 
>>>

Diqqətlə baxsanız, görəcəksiniz ki, ardıcıllıq şəklində verdiyimiz tam ədədlər Unicode simvollarının kodlarıdır.

bytes(ədəd)

Burada ədəd elementlərin sayıdır. Hər bir element sıfırıncı simvolu özündə saxlayır. Funksiya miqdarı verilmiş bu elementləri baytlar ardıcıllığına çevirir:

>>> bytes(5) 
b'\x00\x00\x00\x00\x00' 
>>>

bytes.fromhex(sətir)

Burada sətir verilmiş simvolların onaltılıq say sistemindəki kodlarından ibarətdir. Funksiya bu sətri bytes tipli obyektə çevirir. Çevrilmə zamanı sətirdəki boşluqlar nəzərə alınmır:

>>> bytes.fromhex("61 6c 6d 61")
b'alma'
>>>

İndi isə gəlin bytes tipli obyektlər üzərində həyata keçirilə bilən əməliyyatlar haqqında danışaq. Bildiyiniz kimi, bytes obyektləri ardıcıllıqlara aiddir. Odur ki, ardıcıllıqlar üzərində aparılan indeksləmə (indeksə görə elementə müraciət), dilimləmə (bölünmə), konkatenasiya (birləşdirmə), iterasiya (təkrarlama) və daxilolmanın yoxlanması əməliyyatları baytlar ardıcıllığına da şamil edilir.
Aşağıdakı nümunələri nəzərdən keçirin:

>>> s = b'Python' 
>>> s
b'Python'
>>> s[2]
116
>>> s[1:3] 
b'yt'
>>>
>>> s1 = b'sem'
>>> s2 = b'inar'
>>> s1 + s2 
b'seminar'
>>> s = b'-oxu-'
>>> s * 3 
b'-oxu--oxu--oxu-' 
>>>
>>> s = b'salamat' 
>>> b'm' in s 
True
>>> b'k' in s 
False
>>> b'mat' in s 
True
>>> 108 in s 
True
>>> bytes([109, 97, 116]) in s 
True
>>>

Yuxarıdakı ilk nümunədə bir məqama diqqətinizi cəlb etmək istəyirəm. Burada bytes obyektini bütövlükdə və dilim şəklində çıxaranda ekranda simvollar təsvir olunur. Amma obyektə indeksinə görə müraciət olunduqda həmin simvolun kodu çıxır.
Verilmiş bytes obyektinə list() funksiyasını tətbiq etsək, tam ədədlərin (simvolların kodlarının) siyahısını almış olarıq:

>>> list(b'Python')
[80, 121, 116, 104, 111, 110] 
>>>

Dəyişməyən tip olduğuna görə baytlar ardıcıllığını dəyişmək olmur:

>>> s = b'tavan'
>>> s[2] = 108
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module> 
    s[2] = 108
TypeError: 'bytes' object does not support item assignment 
>>>

Verilmiş bytes obyektini str (sətir) obyektinə çevirmək üçün decode() metodundan istifadə edilir. Metodun sintaksisi aşağıdakı kimidir:

bytes.decode(kodlaşdırma, xətalar)

Burada kodlaşdırmaxətalar parametrlərinin yazılması məcburi deyil. Parametrlər boş buraxıldığı təqdirdə default olaraq (susmaya görə) kodlaşdırma utf-8, xəta emaledicisi isə strict qəbul ediləcək. Digər xəta emaledicilərinin istifadəsi yuxarıda olduğu kimidir.
Müxtəlif kodlaşdırmalar ilə bağlı Python dilinin rəsmi dokumentasiyasında (https://docs.python.org/3.14) Standart Kodlaşdırmalar Cədvəlinə baxa bilərsiniz.
Aşağıdakı nümunələri nəzərdən keçirin:

>>> s1 = b'G\xc3\xbcrz\xc9\x99' 
>>> s2 = b'Python'
>>> s1.decode()
'Gürzə'
>>> s2.decode("ascii","strict") 
'Python'
>>>

Baytlar ardıcıllığını sətrə çevirmək üçün str() funksiyasından da istifadə edilə bilər:

>>> s = bytes('Azərbaycan', 'utf-8') 
>>> s
b'Az\xc9\x99rbaycan'
>>> str(s, 'utf-8')
'Azərbaycan' 
>>>

Baytlar ardıcıllığı” üçün bir şərh

Şərh üçün bağlıdır.