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 massivi

Python proqramlaşdırma dilində baytlarla işləmək üçün nəzərdə tutulan ikinci tip isə bytearray (baytlar massivi) tipidir. Bundan öncə tanış olduğumuz bytes tipli obyektlərə tətbiq edilən metod və əməliyyatlar bytearray obyektləri üçün də keçərlidir. Bununla belə, bytes tipindən fərqli olaraq, bytearray tipinin obyektlərini bilavasitə dəyişmək mümkündür. Məhz bu məqsədlə onlar üçün əlavə metodlar nəzərdə tutulmuşdur.
İndi isə gəlin bytearray obyektlərini meydana gətirən üsulları nəzərdən keçirək.

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

Bu funksiyadan parametrlərsiz istifadə edildiyi təqdirdə boş bytearray obyektini qaytarır:

>>> bytearray() 
bytearray(b'') 
>>>

Verilmiş sətri bytearray 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:

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

Funksiyanın üçüncü parametri olan xətalar isə xəta emaledicisinin göstərilməsi üçündür. Siz onlarla əvvəlki mövzuda tanış olmuşdunuz.
Aşağıdakı nümunələri nəzərdən keçirin:

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

bytearray([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ı bytearray obyektinə çevirməyə imkan verir. Verilmiş ədəd aralığa daxil deyilsə, ValueError xətası qeydə alınır:

>>> bytearray([97, 108, 109, 97]) 
bytearray(b'alma')
>>> bytearray([601, 116, 105, 114]) 
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module> 
   bytearray([601, 116, 105, 114])
ValueError: byte 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.

bytearray(ə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 massivinə çevirir:

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

bytearray.fromhex(sətir)

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

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

Dəyişən tip olduğuna görə baytlar massivini dəyişmək olur:

>>> s = bytearray('Python', 'utf-8') 
>>> s
bytearray(b'Python') 
>>> s[0] = 74
>>> s 
bytearray(b'Jython') 
>>>

bytearray obyektlərini dəyişmək üçün aşağıdakı metodlardan da istifadə edilə bilər:

bytearray.append(ədəd)

Bu metod obyektin sonuna kodu ədəd şəklində göstərilmiş elementi əlavə edir:

>>> s = bytearray('alma', 'utf-8') 
>>> s
bytearray(b'alma')
>>> s.append(110)
>>> s 
bytearray(b'alman') 
>>>

bytearray.extend([ardıcıllıq])

Bu metod obyektin sonuna kodları ardıcıllıq şəklində verilmiş elementləri əlavə edir:

>>> s = bytearray('alman', 'utf-8') 
>>> s
bytearray(b'alman')
>>> s.extend([108, 97, 114]) 
>>> s
bytearray(b'almanlar') 
>>>

Burada ardıcıllıq baytlar ardıcıllığı kimi də verilə bilər:

>>> s = bytearray('alman', 'utf-8') 
>>> s
bytearray(b'alman')
>>> s.extend(b'lar')
>>> s 
bytearray(b'almanlar') 
>>>

Baytlar massivinin sonuna bir neçə elementi ++= operatorları vasitəsilə də əlavə etmək olar:

>>> s = bytearray('kar', 'utf-8') 
>>> s
bytearray(b'kar')
>>> s = s + b'van'
>>> s 
bytearray(b'karvan')
>>> s += b'saray'
>>> s 
bytearray(b'karvansaray') 
>>>

bytearray obyektinin sonuna bir neçə elementi obyekt diliminə qiymət mənimsətməklə də əlavə etmək mümkündür:

>>> s = bytearray('bala', 'utf-8') 
>>> s[len(s):] = b'ban'
>>> s
bytearray(b'balaban')
>>>

bytearray.insert(indeks, ədəd)

Bu metod bytearray obyektinə kodu ədəd şəklində verilmiş elementi indeks kimi göstərilmiş mövqedən daxil edir:

>>> s = bytearray('zaan', 'utf-8') 
>>> s.insert(2, 109)
>>> s
bytearray(b'zaman')
>>>

bytearray.pop(indeks)

Bu metod bytearray obyektinin indeks kimi göstərilmiş mövqedəki elementini silir və onun kodunu qaytarır. Əgər indeks boş buraxılıbsa, ən son element silinir və kodu qaytarılır:

>>> s = bytearray('bazzar', 'utf-8')
>>> s.pop(2) 
122
>>> s
bytearray(b'bazar')
>>> s.pop() 
114
>>> s 
bytearray(b'baza') 
>>>

bytearray.remove(ədəd)

Bu metod bytearray obyekti daxilində kodu ədəd şəklində göstərilmiş ilk elementi taparaq silir. Göstərilmiş element obyekt daxilində yoxdursa, ValueError xətası qeydə alınır:

>>> s = bytearray('salat', 'utf-8') 
>>> s.remove(108)
>>> s
bytearray(b'saat')
>>> s.remove(97) 
>>> s 
bytearray(b'sat') 
>>> s.remove(108)
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    s.remove(108)
ValueError: value not found in bytearray 
>>>

bytearray obyektindən element(lər)i silmək üçün del operatorundan da istifadə edilə bilər:

>>> s = bytearray('dallan', 'utf-8') 
>>> del s[2]
>>> s
bytearray(b'dalan')
>>> del s[2:4] 
>>> s 
bytearray(b'dan') 
>>>

bytearray.reverse()

Bu metod bytearray obyektinin elementlərini tərs ardıcıllıqda düzür:

>>> s = bytearray('zaman', 'utf-8') 
>>> s.reverse()
>>> s
bytearray(b'namaz')
>>>

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

Verilmiş bytearray obyektini str (sətir) obyektinə çevirmək üçün decode() metodundan istifadə edilir. 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 əvvəlki mövzularda izah edildiyi 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 = bytearray('Gürzə', 'utf-8') 
>>> s2 = bytearray('Python', 'utf-8') 
>>> s1.decode()
'Gürzə'
>>> s2.decode("ascii", "strict") 
'Python'
>>>

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

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