ProgramlamaBackend Geliştirici

Python'da liste (list) nedir, altında nasıl uygulanmıştır ve temel özellikleri nelerdir?

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

Cevap.

Tarihçe

Listeler (list), Python'un ilk sürümlerinden itibaren temel yerleşik veri türlerinden biridir. Zamanla, iç yapısı, performansı ve programlama kolaylığını artırmak için geliştirilmiştir.

Sorun

Python'daki listelerin bağlı listeler değil, dinamik diziler olarak uygulandığını anlamak önemlidir. Yanlış bir anlayış, verimsiz koda veya işlemlerin karmaşıklığının hatalı hesaplanmasına yol açabilir.

Çözüm

Listeler, gerektiğinde tahsis edilen bellek boyutunu "sıçrayarak" (genişleyerek) artıran dinamik diziler olarak gerçekleştirilmiştir, böylece eleman ekleme işlemi sırasında sürekli masraflardan kaçınılır. Bu, listenin sonuna eleman ekleyip çıkarmayı amortize edilmiş O(1) süre ile mümkün kılar. Ortada veya başta ekleme veya silme işlemi, elemanların taşınmasını gerektirir ve bu O(n) zaman alır.

Örnek kod:

my_list = [1, 2, 3] my_list.append(4) # Sonuna ekleme my_list.insert(1, 'a') # İndekse göre ekleme print(my_list)

Temel özellikler:

  • Kullanıcı tarafından açık bellek tahsisi/serbest bırakılması olmadan dinamik boyut değişikliği.
  • Sondan ekleme ve silme hızlıdır, baştan/oradan ekleme/silme yavaştır.
  • Liste, her türlü tipte öğe içerebilir (heterojenlik).

Kandırmaca Sorular.

Python'daki list'i C'deki dizi ile analojik olarak değerlendirebilir miyiz? Farkı nedir?

Hayır, C'deki dizi sabit tipte elemanlar içerir ve bellekte yan yana yerleştirilir. Python list'i ise, her biri yığındaki bağımsız bir nesneye işaret eden nesne işaretçileri dizisidir.

Bir döngüde listenin başına eleman eklemeye çalışırsak ne olur? Bu hızlı mı?

Hayır, bu yavaştır: başa ekleme (position 0) sırasında her seferinde mevcut tüm elemanlar sağa kaydırılır. Amortize karmaşıklık — O(n) işlemdir ve büyük listelerde performans düşüşüne neden olur.

Listeler için + ile append/extend operatörleri arasındaki fark nedir?

  • yeni bir liste oluşturur, eski listeyi değiştirmeden. append, bir öğeyi mevcut listenin sonuna ekler. extend, başka bir diziden tüm elemanları listeye ekler ve nesneyi değiştirir.
lst1 = [1, 2] lst2 = [3, 4] lst3 = lst1 + lst2 # lst3 — yeni liste lst1.append(lst2) # lst1 [1, 2, [3, 4]] olur lst1.extend(lst2) # lst1 [1, 2, 3, 4] olur, eğer lst1 önceki append'den sonra sıfırlanmadıysa

Tipik hatalar ve anti-patentler

  • Listelerin başından sık sık ekleme/silme için kullanılması (collections.deque kullanmak daha iyidir)
  • Liste'nin az bellek kapladığını ve C/Java dizileri gibi "yoğun" veriler içerdiğini beklemek
  • Listeyi kendine bir şekilde eklemek (listeyi kendisine eklemek)

Gerçek hayattan bir örnek

Negatif vaka

Bir projede ilk elemanları saklamak ve sürekli silmek için liste kullanıldı. Büyük veri miktarlarında gözle görülür bir yavaşlama fark edildi.

Artılar:

  • Başlangıç kolay, birçok yerleşik metod var.

Eksiler:

  • Performans düştü, büyük hacimlerde bellek hataları.

Pozitif vaka

Sorunun fark edilmesinden sonra liste, bu tür işlemler için optimize edilen collections.deque ile değiştirildi.

Artılar:

  • Önemli bir performans artışı, kod çok daha hızlı çalışmaya başladı.

Eksiler:

  • Bazı arayüzlerin değiştirilmesi gerekti, deque'de olmayan yöntemler için kısıtlamalar ortaya çıktı.