forked from yazbel/python-istihza
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbaytlar_ve_bayt_dizileri.html
605 lines (557 loc) · 37.4 KB
/
baytlar_ve_bayt_dizileri.html
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
<!DOCTYPE html>
<html lang="tr">
<html lang="tr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta content="Python 3.x'te baytlar adlı veri tipi" name="description" />
<meta content="python, bayt, baytlar, bytes, karakter, karakter dizisi, encode" name="keywords" />
<title>Baytlar (Bytes) ve Bayt Dizileri (Bytearrays) — Python 3 için Türkçe Kılavuz</title>
<link rel="stylesheet" href="_static/pyramid.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script>
<script src="_static/translations.js"></script>
<link rel="search" title="Ara" href="search.html" />
<link rel="next" title="Sözlükler" href="sozlukler.html" />
<link rel="prev" title="Karakter Kodlama (Character Encoding)" href="karakter_kodlama.html" />
<!--[if lte IE 6]>
<link rel="stylesheet" href="_static/ie6.css" type="text/css" media="screen" charset="utf-8" />
<![endif]-->
</head><body>
<div class='header'><a href='https://yazbel.com'>yazbel.com</a></div>
<ul class='navbar'>
<li><a href="#"><del>pdf desteği sonlanmıştır</del></a></li>
<li class="forum"><a href="http://forum.yazbel.com">forum</a></li>
</ul>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Gezinti</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="sozlukler.html" title="Sözlükler"
accesskey="N">sonraki</a></li>
<li class="right" >
<a href="karakter_kodlama.html" title="Karakter Kodlama (Character Encoding)"
accesskey="P">önceki</a> |</li>
<li class="nav-item nav-item-0"><a href=".">⌂</a></li>
<li class="nav-item nav-item-this"><a href="">Baytlar (Bytes) ve Bayt Dizileri (Bytearrays)</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="body" role="main">
<div class="section" id="baytlar-bytes-ve-bayt-dizileri-bytearrays">
<h1>Baytlar (Bytes) ve Bayt Dizileri (Bytearrays)<a class="headerlink" href="#baytlar-bytes-ve-bayt-dizileri-bytearrays" title="Bu başlık için kalıcı bağlantı">¶</a></h1>
<p>Bu bölüme gelinceye kadar veri tipi olarak karakter dizilerinden, listelerden ve
dosyalardan söz etmiştik. Bu bölümde ise Python programlama dilindeki iki veri
tipinden daha söz edeceğiz. Birbirleriyle doğrudan bağlantılı oldukları için
bu bölümde birlikte ele alacağımız bu veri tiplerinin adı ‘baytlar’(<em>bytes</em>) ve
‘bayt dizileri’ (<em>bytearrays</em>).</p>
<p>Bu bölümde yalnızca ‘baytlar’ ve ‘bayt dizileri’ adlı veri tiplerinden söz
etmeyeceğiz. Bu iki yeni veri tipini bilgi dağarcığımıza eklemenin yanısıra,
önceki bölümlerde öğrendiğimiz konuları zihnimizde pekiştirmeye ve
sağlamlaştırmaya da devam edeceğiz.</p>
<div class="section" id="giris">
<h2>Giriş<a class="headerlink" href="#giris" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Bilgisayar teknolojisi ve bilimi açısından ‘karakter’ tamamen soyut bir
kavramdır. Son birkaç bölümdür üstüne basa basa tekrar ettiğimiz gibi, karakter
dediğimiz şey, bilgisayarların anlayabildiği tek kavram olan sayılara biz
insanların atadığı birtakım işaretlerden ibarettir. Dolayısıyla bilgisayarlar
açısından karakterler değil, ikili sayma düzenindeki birtakım sayılar, yani
bitler ve baytlar vardır.</p>
<p>Teknik olarak 1 bit, ikili sayma sistemindeki her bir basamağa verilen isimdir.
Zaten ‘bit’ kelimesinin de İngilizcede ‘ikili basamak’ anlamına gelen ‘<em>binary
digit</em> ifadesinin kısaltması olduğunu geçen bölümde öğrenmiştiniz.</p>
<p>Örneğin ikili sayma sistemindeki <cite>0</cite>, bir bitlik bir sayı iken, <cite>100</cite> üç bitlik
bir sayıdır. Bu bit’lerin <cite>8</cite> tanesi bir araya gelince ‘bayt’ denen birimi
oluşturur. Yani bayt, 8 adet bit’ten oluşan bir birimdir. Nasıl bir düzinede 10,
bir destede de 12 öğe olmasını biz insanlar tercih etmiş ve belirlemişsek, bir
bayt’ta da 8 bit olmasını yine biz insanlar tercih etmiş ve belirlemişizdir.</p>
<p>Önceki derslerimizde de öğrendiğimiz gibi, 8 adet bit, yani 1 bayt,
Genişletilmiş ASCII sisteminde bir adet karakteri temsil etmek için
kullanılabilecek en büyük birim olarak tasarlanmıştır. Yani Genişletilmiş ASCII
tablolarının en sonundaki 255 numaralı karakteri temsil edebilmek için 8 adet
bit, yani toplam 1 bayt kullanmamız gerekir. Standart ASCII sistemi ise 7 bitlik
bir sistem olduğu için, bir adet karakteri temsil etmek için kullanılabilecek en
büyük birimin 7 bit olduğunu biliyorsunuz. Dolayısıyla ASCII sistemindeki son
karaktere karşılık gelen 127. sayıyı temsil edebilmek için toplam 7 bit
yeterlidir.</p>
<p>Farklı bir sistem olan UTF-8 ise birden fazla bayt kullanarak çok sayıda
karakteri temsil etmeye imkan tanır. UTF-8 ile, duruma göre 1, 2, 3 veya 4 bayt
kullanarak, UNICODE sistemi içinde tanımlanmış bütün karakterleri temsil
edebilirsiniz. UTF-8, değişken boyutlu bir kodlama sistemi olması sayesinde, bir
karakteri temsil edebilmek için kaç bayt gerekiyorsa, o karakteri temsil etmek
için o kadar bayt kullanır. Ama mesela UTF-32 adlı kod çözücü hangi karakter
olursa olsun hepsini 4 bayt (32 bit) ile temsil eder. Bu durumda aslında tek
baytla temsil edilebilecek ‘a’, ‘b’, ‘c’ gibi karakterler de boşu boşuna 4 bayt
yer kaplamış olur. Zaten UTF-8’in bu kadar yaygın ve gözde olmasının nedeni de
hem çok sayıda karakteri kodlayabilmesi, hem de bu işi yaparken tasarruflu
olmayı başarabilmesidir.</p>
<p>Python programlama dilinde karakter dizileri UNICODE kod konumları şeklinde
temsil edilir. Dolayısıyla <cite>str</cite> adı verilen veri tipi esasında karakter
dizilerini birtakım UNICODE kod konumları şeklinde gösteren soyut bir yapıdır.
Yani biz Python’da karakter dizileri üzerinde işlem yaparken aslında baytlarla
değil, UNICODE kod konumları ile muhatap oluyoruz. Ancak UNICODE kod konumları
da tamamen soyut kavramlardır. Bunları bilgisayarın belleğinde bu şekilde temsil
edemezsiniz ya da bu kod konumlarını herhangi bir ağ üzerinden başka
bilgisayarlara iletemezsiniz. Bu kod konumlarını anlamlı bir şekilde
kullanabilmek için öncelikle bunları bilgisayarların anlayabileceği bir biçim
olan baytlara çevirmeniz gerekir. Çünkü dediğimiz gibi bilgisayarlar yalnızca
bitler ve baytlardan anlar. İşte kod çözücülerin görevi de zaten bu kod
konumlarını baytlara çevirmektir.</p>
<p>Esasında programcılık maceranız boyunca genellikle metin ihtiyaçlarınızı UNICODE
kod konumları üzerinden halledeceksiniz. Python sistemdeki öntanımlı kod
çözücüyü kullanarak bu kod konumlarını alttan alta bayta çevirip bellekte
saklayacaktır. Ama eğer yazdığınız programlarda herhangi bir şekilde doğrudan
baytlarla muhatap olmanız gerekirse <cite>str</cite> veri tipini değil, <cite>bytes</cite> adlı başka
bir veri tipini kullanacaksınız. Örneğin ikili (<em>binary</em>) dosyalar üzerinde
çeşitli çalışmalar yapacaksanız ve bu ikili dosyalara birtakım veriler
girecekseniz, gireceğiniz bu veriler <cite>bytes</cite> tipinde olacaktır.</p>
<p>Bütün bu sebeplerden ötürü, <cite>str</cite> ve <cite>bytes</cite> veri tipleri arasındaki farkı
anlamak, yazdığınız programların kararlılığı ve sağlamlığı açısından büyük önem
taşır. O anda elinizde olan verinin hangi tipte olduğunu bilmezseniz, bu
verinin, programınızın çalışması esnasında size ne tür tuzaklar kurabileceğini
de kestiremezsiniz. Örneğin bütün karakterlerin 1 bayt olduğunu ve bunların da
yalnızca 0 ile 127 arası sayılarla temsil edilebileceğini zanneden
yazılımcıların tasarladığı programlara Türkçe karakterler girdiğinizde nasıl bu
programlar patır patır dökülüyorsa, eğer siz de baytlar ve karakterler
arasındaki farkı anlamazsanız sizin yazdığınız programlar da hiç beklemediğiniz
bir anda tökezleyebilir.</p>
<p>Örneğin yazdığınız bir programın bir aşamasında programa yalnızca tek
karakterlik verilerin girilmesi temeli üzerinden bir işlem yaptığınızı düşünün.
Yani programınız içinde yapacağınız bir işlem, birden fazla karakter girişinin
engellenmesini gerektiriyor olsun.</p>
<p>Bunun için şöyle bir şey yazmış olun:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="s2">"k"</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Lütfen yalnızca tek bir karakter giriniz!"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Teşekkürler!"</span><span class="p">)</span>
</pre></div>
</div>
<p>Ben burada temsili olarak <cite>a</cite> adlı bir değişken oluşturdum ve örnek olması
açısından da bunun değerini ‘k’ olarak belirledim. Bu değerlerle programımız
düzgün bir şekilde çalışır. Çünkü <cite>a</cite> değişkeninin değeri tek bir karakter olan
‘k’ harfi. Ama eğer <cite>a</cite> değişkeninin değeri mesela ‘kz’ gibi bir şey olsaydı
programımız ‘Lütfen yalnızca tek bir karakter giriniz!’ uyarısı verecekti…</p>
<p>Şimdi bu <cite>a</cite> değişkeninin sizin tarafınızdan belirlenmediğini, bu değerin başka
bir kaynaktan geldiğini düşünün. Eğer size bu değeri gönderen kaynak, bu değeri
UNICODE kod konumu olarak gönderiyorsa programınız düzgün çalışır. Ama peki ya
gelen bu veri bayt olarak geliyorsa ne olacak?</p>
<p>Yukarıda verdiğimiz örneğin neden önemli olduğunu, daha doğrusu bu örnekle ne
demek istediğimiz ve nereye varmaya çalıştığımızı anlamamış olabilirsiniz. Ama
endişe etmenize hiç gerek yok. Zira bu bölümde yukarıda sorduğumuz sorunun
cevabını derinlemesine ele alacağız. Bu bölümün sonuna vardığımızda neler olup
bittiğini ve baytların neden bu kadar önemli olduğunu gayet iyi anlıyor
olacaksınız.</p>
</div>
<div class="section" id="eskisi-ve-yenisi">
<h2>Eskisi ve Yenisi<a class="headerlink" href="#eskisi-ve-yenisi" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Gelin isterseniz tam olarak ne ile karşı karşıya olduğumuzu daha iyi
anlayabilmek için Python3 öncesi durumun nasıl olduğuna bakalım. Eğer geçmişte
Python programlama dilinin karakter dizileri ve baytları nasıl ele aldığını
bilirsek bugünkü durumu ve dolayısıyla genel olarak karakter dizisi ve bayt
kavramını çok daha net bir şekilde kavrayabiliriz.</p>
<p>Python’ın 2.x sürümlerinde, bir karakter dizisi tanımladığınızda Python bu
karakter dizisini bir bayt dizisi olarak temsil ediyordu. Örneğin:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">kardiz</span> <span class="o">=</span> <span class="s2">"e"</span>
</pre></div>
</div>
<p>Burada <cite>kardiz</cite> adlı değişkenin değeri, bir baytlık bir karakter dizisidir. Bunu
<code class="docutils literal notranslate"><span class="pre">len()</span></code> fonksiyonu ile teyit edelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="n">kardiz</span><span class="p">)</span>
<span class="go">1</span>
</pre></div>
</div>
<p>Bir de şuna bakalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">kardiz</span> <span class="o">=</span> <span class="s2">"ş"</span>
</pre></div>
</div>
<p>Burada ise <cite>kardiz</cite> adlı değişkenin değerinin kaç baytlık bir karakter dizisi
olduğu, yani bir bakıma <code class="docutils literal notranslate"><span class="pre">len()</span></code> fonksiyonunun ne çıktı vereceği işletim
sisteminden işletim sistemine farklılık gösterir. Eğer kullandığınız işletim
sistemi Windows ise muhtemelen <code class="docutils literal notranslate"><span class="pre">len(kardiz)</span></code> komutu <cite>1</cite> çıktısı verecektir.
Ama eğer bu komutu GNU/Linux dağıtımlarından birinde veriyorsanız alacağınız
çıktı büyük ihtimalle <cite>2</cite> olacaktır.</p>
<p>Dediğimiz gibi, Python2’de <cite>str</cite> veri tipi bize bir dizi bayt verir. Dolayısıyla
bu veri tipinin içinde tuttuğu karakter dizisinin kaç bayt ile gösterileceği,
sistemdeki öntanımlı kod çözücünün hangisi olduğuna bağlıdır. Kullandığınız
işletim sisteminde öntanımlı kod çözücünün hangisi olduğunu şu komutla
bulabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">locale</span>
<span class="gp">>>> </span><span class="n">locale</span><span class="o">.</span><span class="n">getpreferredencoding</span><span class="p">()</span>
</pre></div>
</div>
<p>Eğer Windows kullanıyorsanız buradan alacağınız çıktı muhtemelen cp1254
olacaktır. cp1254, Microsoft’un Türkçe için özel olarak kullandığı bir kod
sayfası olduğu için, 128 ile 256 sayıları arasında Türkçe karakterleri içerir. O
yüzden bu kodlama sisteminde Türkçe karakterler 1 bayt ile gösterilebilir. Bu
kod sayfasının içeriğinde hangi karakterlerin hangi sayılara karşılık geldiğini
görmek için <a class="reference external" href="http://en.wikipedia.org/wiki/Windows-1254">en.wikipedia.org/wiki/Windows-1254</a> adresindeki tabloyu
inceleyebilirsiniz.</p>
<p>Ama eğer yukarıdaki komutların çıktısı UTF-8 veya başka bir kod çözücü ise,
Türkçe karakterler 1 bayt ile gösterilemeyeceği için <code class="docutils literal notranslate"><span class="pre">len(kardiz)</span></code> komutu <cite>1</cite>
değil, <cite>2</cite> çıktısı verecektir.</p>
<p>Bir de şuna bakalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="s2">"€"</span><span class="p">)</span>
</pre></div>
</div>
<p>Bu komutu hangi işletim sisteminde verdiğinize bağlı olarak yukarıdaki komuttan
alacağınız çıktı farklı olacaktır. <cite>str</cite> tipi Python2’de karakter dizilerini
bayt olarak temsil eder. Bu temsilin de hangi kurallara göre yapılacağı
kullanılan kod çözücüye bağlıdır. Eğer karakter dizileri baytlara çevrilirken
cp1254 adlı kod çözücü kullanılırsa, bu kod çözücü ‘€’ simgesini tek bayt
ile gösterilebildiği için yukarıdaki komut <cite>1</cite> çıktısı verir. Ama UTF-8 adlı kod
çözücü ‘€’ simgesini <cite>3</cite> baytla gösterebildiği için yukarıdaki komutun çıktısı
da buna paralel olarak <cite>3</cite> olacaktır.</p>
<p><cite>str</cite> veri tipi ile gösterilen bu karakter dizilerinin içindeki baytlara ulaşmak
için şu yöntemi kullanabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="s2">"ş"</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="go">'\xc5'</span>
<span class="gp">>>> </span><span class="s2">"ş"</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="go">'\x9f'</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, <cite>str</cite> veri tipi gerçekten de bize bir dizi bayt veriyor. Eğer
karakter dizilerini baytlarına göre değil de sahip oldukları karakter sayısına
göre saymak isterseniz bunları UNICODE olarak tanımlanız gerekiyor:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="sa">u</span><span class="s1">'ş'</span><span class="p">)</span>
<span class="go">1</span>
</pre></div>
</div>
<p>Python3 ile birlikte yukarıda bahsettiğimiz durumda bazı değişiklikler oldu.
Artık <cite>str</cite> veri tipi UNICODE kod konumlarını döndürüyor. Dolayısıyla artık her
karakter dizisi, sahip oldukları karakter sayısına göre sayılabiliyor:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="s2">"ş"</span><span class="p">)</span>
<span class="go">1</span>
<span class="gp">>>> </span><span class="nb">len</span><span class="p">(</span><span class="s2">"€"</span><span class="p">)</span>
<span class="go">1</span>
</pre></div>
</div>
<p>İşte eğer Python2’deki <cite>str</cite> veri tipini elde etmek istiyorsanız, Python3’te
<cite>bytes</cite> adlı yeni veri tipini kullanmanız gerekiyor.</p>
</div>
<div class="section" id="bayt-tanimlamak">
<h2>Bayt Tanımlamak<a class="headerlink" href="#bayt-tanimlamak" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Bildiğiniz gibi Python programlama dilinde her veri tipinin kendine özgü bir
tanımlanma biçimi var. Örneğin bir liste tanımlamak için şöyle bir şey
yazıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">liste</span> <span class="o">=</span> <span class="p">[]</span>
</pre></div>
</div>
<p>Böylece boş bir liste tanımlamış olduk. Aynı şekilde karakter dizilerini de
şöyle tanımlıyorduk:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">kardiz</span> <span class="o">=</span> <span class="s1">''</span>
</pre></div>
</div>
<p>Bu şekilde de boş bir karakter dizisi tanımlamış olduk. İşte boş bir bayt
tanımlamak için de şu yapıyı kullanıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">bayt</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">''</span>
</pre></div>
</div>
<p>Gelin tanımladığımız bu veri tipinin bayt olduğunu teyit edelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">type</span><span class="p">(</span><span class="n">bayt</span><span class="p">)</span>
<span class="go"><class 'bytes'</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, gerçekten de bayt tipinde bir veri tanımlamışız. Nasıl karakter
dizileri ‘str’, listeler ‘list’ ifadesiyle gösteriliyorsa, baytlar da ‘bytes’
ifadesi ile gösterilir.</p>
<p>Peki bu şekilde bir bayt veri tipi tanımlamak ne işimize yarar?</p>
<p>Hatırlarsanız bayt veri tipini ikili (<em>binary</em>) dosyaları anlatırken de
görmüştük. Orada da söylediğimiz gibi, ikili dosyaları okuduğunuzda elde
edeceğiniz şey karakter dizisi değil bayttır. Aynı şekilde, ikili dosyalara da
ancak baytları yazabilirsiniz. Dolayısıyla eğer ikili dosyalarla birtakım
işlemler yapacaksanız bu bayt veri tipini yoğun olarak kullanacağınızdan hiç
şüpheniz olmasın. Yani bayt veri tipi kolayca görmezden gelebileceğiniz
gereksiz bir veri tipi değildir.</p>
</div>
<div class="section" id="bytes-fonksiyonu">
<h2>bytes() Fonksiyonu<a class="headerlink" href="#bytes-fonksiyonu" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Bayt veri tipi temel olarak ASCII karakterleri kabul eder. Dolayısıyla ASCII
tablosu dışında kalan karakterleri doğrudan bayt olarak temsil edemezsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="sa">b</span><span class="s1">'ş'</span>
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>
<span class="gr">SyntaxError</span>: <span class="n">bytes can only contain ASCII literal characters.</span>
</pre></div>
</div>
<p>Ama ASCII dışında kalan karakterleri de bayt’a dönüştürmenin bir yolu var. Bunun
için <code class="docutils literal notranslate"><span class="pre">bytes()</span></code> adlı bir fonksiyondan yararlanacağız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">b</span> <span class="o">=</span> <span class="nb">bytes</span><span class="p">(</span><span class="s2">"ş"</span><span class="p">,</span> <span class="s2">"utf-8"</span><span class="p">)</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, ilgili karakterin hangi kod çözücü ile kodlanacağını
belirterek, bayt tipinde bir veri oluşturabiliyoruz.</p>
<p>Tahmin edebileceğiniz gibi, <code class="docutils literal notranslate"><span class="pre">bytes()</span></code> fonksiyonu, belirttiğimiz kod çözücü ile
kodlanamayan karakterlerle karşılaşılması durumunda ne yapılacağını
belirlememizi sağlayan <cite>errors</cite> adlı bir parametreye de sahiptir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">b</span> <span class="o">=</span> <span class="nb">bytes</span><span class="p">(</span><span class="s2">"Fırat"</span><span class="p">,</span> <span class="s2">"ascii"</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">"xmlcharrefreplace"</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">b</span>
<span class="go">b'F&#305;rat'</span>
</pre></div>
</div>
<p>Önceki derslerimizde <cite>errors</cite> parametresinin hangi değerleri alabileceğini
tartışmıştık. Orada anlattığımız şeyler burada da geçerlidir.</p>
</div>
<div class="section" id="baytlarin-metotlari">
<h2>Baytların Metotları<a class="headerlink" href="#baytlarin-metotlari" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Bütün veri tiplerinde olduğu gibi, <cite>bytes</cite> adlı veri tipinin de birtakım
metotları bulunur. Bu metotların listesini almak için şu komutu
kullanabileceğinizi biliyorsunuz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">dir</span><span class="p">(</span><span class="nb">bytes</span><span class="p">)</span>
</pre></div>
</div>
<p>Listeye baktığınızda bu metotları karakter dizilerinin metotları ile hemen hemen
aynı olduğunu göreceksiniz. Baytların metotları arasında olup da karakter
dizilerinin metotları arasında olmayan metotları şu şekilde elde edebilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="nb">bytes</span><span class="p">):</span>
<span class="gp">... </span> <span class="k">if</span> <span class="n">i</span> <span class="ow">not</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span>
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="go">decode</span>
<span class="go">fromhex</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, <code class="docutils literal notranslate"><span class="pre">decode()</span></code> ve <code class="docutils literal notranslate"><span class="pre">fromhex()</span></code> adlı metotlar baytlarda var, ama
karakter dizilerinde yok. O yüzden biz de bu bölümde yalnızca bu iki metodu
incelemekle yetineceğiz. Çünkü öteki metotları zaten karakter dizilerinden
tanıyorsunuz.</p>
<div class="section" id="decode">
<h3>decode<a class="headerlink" href="#decode" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Hatırlarsanız karakter dizilerinin <code class="docutils literal notranslate"><span class="pre">encode()</span></code> adlı bir metodu vardı. Bu metot
yardımıyla karakter dizilerini belli bir kodlama biçimine göre kodlayabiliyor,
yani bunları baytlara çevirebiliyorduk. Mesela ‘İ’ harfini UTF-8 ile
kodlayalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="s2">"İ"</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span>
<span class="go">b'\xc4\xb0'</span>
</pre></div>
</div>
<p>Aynı harfi cp1254 ile kodlarsak şu çıktıyı elde ederiz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="s2">"İ"</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"cp1254"</span><span class="p">)</span>
<span class="go">b'\xdd'</span>
</pre></div>
</div>
<p>Tahmin edebileceğiniz gibi, bu harfi ASCII ile kodlayamayız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="s2">"İ"</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"ascii"</span><span class="p">)</span>
<span class="gt">Traceback (most recent call last):</span>
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
<span class="gr">UnicodeEncodeError</span>: <span class="n">'ascii' codec can't encode character '\u0130' in position 0:</span>
<span class="go"> ordinal not in range(128)</span>
</pre></div>
</div>
<p>İşte bu kodlama işlemini tersine çevirebilmek, yani baytları belli bir kodlama
biçimine göre karakter dizilerine dönüştürebilmek için <code class="docutils literal notranslate"><span class="pre">decode()</span></code> metodundan
yararlanacağız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="sa">b</span><span class="s2">"</span><span class="se">\xc4\xb0</span><span class="s2">"</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span>
<span class="go">'İ'</span>
</pre></div>
</div>
<p>Bu baytları bir de başka kodlama sistemleri ile kodlamayı deneyelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="sa">b</span><span class="s2">"</span><span class="se">\xc4\xb0</span><span class="s2">"</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"cp1254"</span><span class="p">)</span>
<span class="go">'Ä°'</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, cp1254 adlı kod çözücü bu baytı çözebiliyor, ama yanlış
çözüyor! Çünkü bu baytın gösterdiği sayı cp1254 adlı kod sayfasında ‘İ’ye değil,
başka bir karaktere karşılık geliyor. Aslında başka iki karaktere, yani C4 ve B0
ile gösterilen <cite>Ä</cite> ve <cite>°</cite> karakterlerine karşılık geliyor… Bu durumu
<a class="reference external" href="http://en.wikipedia.org/wiki/Windows-1254">http://en.wikipedia.org/wiki/Windows-1254</a> adresine gidip kendiniz de
görebilirsiniz.</p>
<p>Bu baytları bir de ASCII ile çözmeye çalışalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="sa">b</span><span class="s2">"</span><span class="se">\xc4\xb0</span><span class="s2">"</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"ascii"</span><span class="p">)</span>
<span class="gt">Traceback (most recent call last):</span>
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
<span class="gr">UnicodeDecodeError</span>: <span class="n">'ascii' codec can't decode byte 0xc4 in position 0: ordinal</span>
<span class="go">not in range(128)</span>
</pre></div>
</div>
<p>Elbette, bu karakter 128’den büyük bir sayıya karşılık geldiği için ASCII
tarafından çözülemeyecektir.</p>
</div>
<div class="section" id="fromhex">
<h3>fromhex<a class="headerlink" href="#fromhex" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Bu metot, onaltılı sayma sistemindeki bir sayıdan oluşan bir karakter dizisini
alıp, bayta dönüştürür. Bu metodu şöyle kullanıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">bytes</span><span class="o">.</span><span class="n">fromhex</span><span class="p">(</span><span class="s2">"c4b0"</span><span class="p">)</span>
<span class="go">b'\xc4\xb0'</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, bu metot bir onaltılı sayı olan <cite>c4b0</cite>’ı alıp, bize bir bayt
nesnesi veriyor.</p>
</div>
</div>
<div class="section" id="bayt-dizileri">
<h2>Bayt Dizileri<a class="headerlink" href="#bayt-dizileri" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p><cite>bytes</cite> adlı veri tipi ile elde ettiğimiz veri tıpkı karakter dizileri gibi,
üzerinde değişiklik yapılamayan bir veridir. Dolayısıyla bir <cite>bytes</cite> nesnesi
üzerinde değişiklik yapabilmek için o nesneyi tekrar tanımlamamız gerekir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">b</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">'PDF'</span>
<span class="gp">>>> </span><span class="n">v</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">'-1.7'</span>
<span class="gp">>>> </span><span class="n">b</span> <span class="o">=</span> <span class="n">b</span> <span class="o">+</span> <span class="n">v</span>
<span class="gp">>>> </span><span class="n">b</span>
<span class="go">b'PDF-1.7'</span>
</pre></div>
</div>
<p>Ama Python programlama dilinde <cite>bytes</cite> veri tipi dışında, baytlara ilişkin ikinci
veri tipi daha bulunur. <cite>bytearray</cite> adlı bu veri tipi, <cite>bytes</cite> veri tipinin
aksine, üzerinde değişiklik yapılabilen bir veri tipidir.</p>
<p>Python’da <cite>bytearray</cite> veri tipini şu şekilde tanımlıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">pdf</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">(</span><span class="sa">b</span><span class="s1">'PDF-1.7'</span><span class="p">)</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, bir bayt dizisi tanımlayabilmek için <code class="docutils literal notranslate"><span class="pre">bytearray()</span></code> adlı bir
fonksiyondan faydalanıyoruz.</p>
</div>
<div class="section" id="bayt-dizilerinin-metotlari">
<h2>Bayt Dizilerinin Metotları<a class="headerlink" href="#bayt-dizilerinin-metotlari" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Bayt dizileri bir bakıma listelerle baytların karışımı gibidir. <code class="docutils literal notranslate"><span class="pre">dir(bytearray)</span></code>
gibi bir komutla bu veri tipinin metotlarını inceleyecek olursanız, bu veri
tipinin hem baytlardan hem de listelerden birtakım metotlar aldığını görürsünüz.</p>
<p>Bu veri tipi listelerin şu metotlarına sahiptir:</p>
<blockquote>
<div><ol class="arabic simple">
<li><p>append</p></li>
<li><p>clear</p></li>
<li><p>copy</p></li>
<li><p>count</p></li>
<li><p>extend</p></li>
<li><p>index</p></li>
<li><p>insert</p></li>
<li><p>pop</p></li>
<li><p>remove</p></li>
<li><p>reverse</p></li>
</ol>
</div></blockquote>
<p>Bu veri tipi baytların ise şu metotlarına sahiptir:</p>
<blockquote>
<div><ol class="arabic simple">
<li><p>capitalize</p></li>
<li><p>center</p></li>
<li><p>count</p></li>
<li><p>decode</p></li>
<li><p>endswith</p></li>
<li><p>expandtabs</p></li>
<li><p>find</p></li>
<li><p>fromhex</p></li>
<li><p>index</p></li>
<li><p>isalnum</p></li>
<li><p>isalpha</p></li>
<li><p>isdigit</p></li>
<li><p>islower</p></li>
<li><p>isspace</p></li>
<li><p>istitle</p></li>
<li><p>isupper</p></li>
<li><p>join</p></li>
<li><p>ljust</p></li>
<li><p>lower</p></li>
<li><p>lstrip</p></li>
<li><p>maketrans</p></li>
<li><p>partition</p></li>
<li><p>replace</p></li>
<li><p>rfind</p></li>
<li><p>rindex</p></li>
<li><p>rjust</p></li>
<li><p>rpartition</p></li>
<li><p>rsplit</p></li>
<li><p>rstrip</p></li>
<li><p>split</p></li>
<li><p>splitlines</p></li>
<li><p>startswith</p></li>
<li><p>strip</p></li>
<li><p>swapcase</p></li>
<li><p>title</p></li>
<li><p>translate</p></li>
<li><p>upper</p></li>
<li><p>zfill</p></li>
</ol>
</div></blockquote>
</div>
</div>
<div class='glyph'><a href='https://yazbel.com'>♣</a></div>
<div class='extrarelbar'>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Gezinti</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="sozlukler.html" title="Sözlükler"
>sonraki</a></li>
<li class="right" >
<a href="karakter_kodlama.html" title="Karakter Kodlama (Character Encoding)"
>önceki</a> |</li>
<li class="nav-item nav-item-0"><a href=".">⌂</a></li>
<li class="nav-item nav-item-this"><a href="">Baytlar (Bytes) ve Bayt Dizileri (Bytearrays)</a></li>
</ul>
</div> </div>
<div class='addcomment'>Yorumlar</div>
<div class='how-to-use'>
<h3>Önemli Not</h3>
Eğer yazdığınız yorum içinde kod kullanacaksanız, kodlarınızı
<span class='tag'><pre><code></span> etiketleri içine alın. Örneğin:
<pre>
<span class='tag'><pre><code class="python"></span>
<span class='keyword'>print</span>(<span class='string'>"Merhaba Dünya!"</span>)
<span class='tag'></code></pre></span>
</pre>
</div>
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES * * */
var disqus_shortname = 'istihza';
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
<script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-4eca48eb2d83faf9" async="async"></script>
<div class="clearer"></div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Gezinti</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="sozlukler.html" title="Sözlükler"
>sonraki</a></li>
<li class="right" >
<a href="karakter_kodlama.html" title="Karakter Kodlama (Character Encoding)"
>önceki</a> |</li>
<li class="nav-item nav-item-0"><a href=".">⌂</a></li>
<li class="nav-item nav-item-this"><a href="">Baytlar (Bytes) ve Bayt Dizileri (Bytearrays)</a></li>
</ul>
</div>
<div class="footer">
© Copyright 2007-2020, Fırat Özgül | <a href="https://yazbel.com">yazbel.com</a>.
Son güncelleme: 08.08.2020.
<a href="http://sphinx-doc.org/">Sphinx</a> 3.2.0 kullanılarak oluşturuldu.
<br>
<br>
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img
alt="Creative Commons License" style="border-width:0"
src="https://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" /></a><br />
<br>
</div>
<!-- Start of StatCounter Code for Default Guide -->
<script type="text/javascript">
var sc_project=10396326;
var sc_invisible=1;
var sc_security="fb5cd679";
var scJsHost = (("https:" == document.location.protocol) ?
"https://secure." : "http://www.");
document.write("<sc"+"ript type='text/javascript' src='" +
scJsHost+
"statcounter.com/counter/counter.js'></"+"script>");
</script>
<noscript><div class="statcounter"><a title="hit counter"
href="http://statcounter.com/" target="_blank"><img
class="statcounter"
src="http://c.statcounter.com/10396326/0/fb5cd679/1/"
alt="hit counter"></a></div></noscript>
<!-- End of StatCounter Code for Default Guide -->
</body>
</html>