ProgramlamaBackend Geliştirici

Python'daki bytes yerleşik türünün çalışma şekli ve özelliklerini açıklayın. Nerelerde ve nasıl kullanılır, str'den farkı nedir ve ikili verilerin işlenmesi sırasında hangi incelikler önemlidir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Sorunun Tarihi

Python 3 ile birlikte bytes türü ikili verileri saklamak ve işlemek için temel hale geldi ve str'den ayrıldı. Python 2'de str'ler hem metin hem de baytları içerebiliyordu, bu da farklı kodlamalarda veri işlenmesi sırasında sık hatalara neden oluyordu.

Problem

Günlük programlamada, genellikle metin bilgisi dışında veri iletimi ve saklama görevleriyle karşılaşıyoruz - örneğin dosyalarla, ağ istekleriyle ve iletişim protokolleriyle çalışma. Bunun için bayt dizisini metin verilerinden net bir şekilde ayıran, açık ve güvenli bir türe ihtiyaç vardır.

Çözüm

Python'daki bytes türü, 0 ile 255 arasındaki tam sayıların değişmez bir dizisini saklar ve bayt literali (b ile başlayan) veya açık tür dönüşümü ile oluşturulabilir. Str'ler (str) ve baytlar (bytes) arasındaki güvenli ve öngörülebilir etkileşim için .encode() ve .decode() yöntemleri kullanılır. Dosyalar, ağlar ve çeşitli ikili protokollerle çalışırken bytes ana seçimdir.

Kod örneği:

# bytes nesnesi oluşturma b = b'hello' # Literalle b2 = bytes([104, 101, 108, 108, 111]) # Tam sayılar listesinden # str <=> bytes dönüşümü text = 'metin' bin_text = text.encode('utf-8') # str -> bytes back = bin_text.decode('utf-8') # bytes -> str # Dosyayla örnek with open('file.bin', 'rb') as f: data = f.read() # data: bytes

Ana özellikler:

  • bytes — bayt dizisi için değişmez (immutable) bir konteynerdir.
  • str'den farkı: str (Unicode) metin saklar, bytes — ikili veridir.
  • Tüm dönüştürme işlemleri açık kodlama belirtimi gerektirir.

Kandırmaca Soruları.

bytes ve str'yi bir değişkene birleştirebilir miyiz?

Hayır, + veya f-string ile birleştirme işe yaramaz: b'abc' + 'def' ifadesini çalıştırmaya çalışmak TypeError ile sonuçlanır. Türleri açıkça dönüştürmek gerekir.

bytes ile bytearray arasındaki fark nedir?

bytes — değişmez bir türdür, yani içerik oluşturulduktan sonra değiştirilemez. bytearray — değiştirilebilir bir varyanttır, yerinde baytları değiştirme yöntemlerini destekler.

b = bytes([1, 2, 3]) # immutable ba = bytearray([1, 2, 3]) # mutable ba[0] = 99 # TAMAM b[0] = 99 # TypeError

encode() ile dönüşüm sırasında bir stringin ne kadar bayt kaplayacağını nasıl öğrenebilirim?

Bayt sayısı kodlamaya bağlıdır. Örneğin, utf-8 için 'abc' 3 bayt, 'Merhaba' 12 bayttır. encode() çağrısından sonra tam boyutu len() ile öğrenebilirsiniz:

s = 'Merhaba' # 6 harf b = s.encode('utf-8') # 12 bayt print(len(b)) # 12

Tipik Hatalar ve Anti-Desenler

  • bytes ve str'yi karıştırmak, bir yere baytlar beklerken bir dize göndermek (örneğin HTTP istekleri, ikili dosyalar), ya da tersine.
  • Yazarken veya çıkışta baytları açıkça çözmeyi unutmak.
  • bytes ve str'yi doğrudan karşılaştırmak — her zaman False.

Gerçek Hayat Örneği

Olumsuz Durum

Geliştirici 'rb' (bayt) modunda bir dosyayı okur ve hemen bir dize olarak işlemeye çalışır:

with open('file.txt', 'rb') as f: for line in f: print(line.strip()) # line: bytes

Artılar:

  • ASCII belgeleri için işe yarayabilir.

Eksiler:

  • Unicode dosyaları için decode() ile çözümlemeden işlem yapmak imkansızdır.
  • str ile birleştirilirken hatalar ortaya çıkar.

Olumlu Durum

Geliştirici, bayt akışlarını decode() ile işler, kodlama kontrolünü etkinleştirir:

with open('file.txt', 'rb') as f: for line in f: print(line.decode('utf-8').strip())

Artılar:

  • Kod, uygun kodlama ile herhangi bir metin dosyası için çalışır.
  • İşleme ve çıkışta öngörülebilir davranış.

Eksiler:

  • Açık kodlama seçimi için ilave sorumluluk doğar.
  • Yanlış kod çözme durumunda hata işleme gerektirir.