Koleksiyonlar, değiştirilebilirlik ve referans sezgisi
Nesne tabanlı programlamaya geçmeden önce Python’da birden fazla değeri nasıl tuttuğumuzu ve değişken adlarının bu değerlerle nasıl ilişkilendiğini anlamamız gerekir. Bu hafta liste, demet, sözlük ve kümeleri hızlıca kullanacağız; ancak asıl öncelik değiştirilebilirlik (mutability), aynı nesneyi paylaşma (aliasing) ve kopyalama olacaktır. Dört koleksiyonun bütün ayrıntılarını tek haftada ezberlemek beklenmez.
Bu bölümün kapsamı
list,tuple,dictvesetarasından uygun koleksiyonu seçme- demetin değişmezliğinin içindeki nesneyi kapsamaması
b = asonrası iki adın aynı nesneyi göstermesiisile==sorularının ayrımıcopy()ile bağımsız kopya ve sığ kopyanın sınırı- sözlükte
.keys(),.values()ve.items()görünümleri sorted()ile.sort()farkı
copy.deepcopy()ayrıntılarıcollectionsmodülündeki yardımcı yapılar- küme işlemleri (birleşim, kesişim) ayrıntısı
Bu başlıklar konunun devamıdır; ileride karşınıza çıkar ama bu derste ezberlemeniz beklenmiyor.
İki değişken aynı listeyi ne zaman gösterir?
Bu bölümün asıl kazanımı koleksiyon listesi ezberlemek değildir. İki adın aynı değiştirilebilir nesneyi gösterebildiğini ve bir yerdeki değişikliğin diğer yerden görüldüğünü anlamaktır. Nesne tabanlı programlamanın merkezine giden yol buradan geçer.
Ders süresi sınırlıysa set ayrıntıları ve iç içe sığ kopya örnekleri ikinci plandadır. OOP’ye hazırlık açısından en kritik kazanım, iki adın aynı mutable nesneyi gösterebildiğini ve bir yerdeki değişikliğin diğer yerden görülebildiğini gerçekten anlamaktır.
Dört temel koleksiyon
| Yapı | Temel fikir | Değiştirilebilir? | Tipik kullanım |
|---|---|---|---|
list |
sıralı değerler | evet | notlar, ürünler, adımlar |
tuple |
sabit sıralı grup | hayır | koordinat, değişmez kayıt parçası |
dict |
anahtar → değer | evet | öğrenci no → öğrenci bilgisi |
set |
benzersiz değerler | evet | üyelik, tekrarları kaldırma |
Kümede "python" iki kez yazılsa bile yalnızca bir kez tutulur.
Liste değişir, demet değişmez
Aynı işlemi tuple üzerinde yapmaya çalışmak TypeError üretir:
point = (10, 20)
point[0] = 99 # hataBuradaki değiştirilemezlik, tuple’ın eleman bağlarının sonradan yeniden atanamaması anlamına gelir. Ancak bir tuple’ın içinde değiştirilebilir bir nesne bulunabilir:
Tuple’ın kendisine yeni bir eleman atamadık; tuple içindeki liste nesnesinin durumunu değiştirdik. Bu ayrım, “immutable” sözcüğünü bütün iç yapının derinlemesine değişmez olduğu şeklinde yorumlamamayı sağlar.
Kritik deney: iki ad, bir liste
Aşağıdaki kodu çalıştırmadan önce çıktıyı tahmin edin.
second = first yeni bir liste oluşturmaz. İki değişken adı aynı liste nesnesini gösterir.
Bunu id() ve is ile gözlemleyebiliriz:
is, iki ifadenin aynı nesneye gönderme yapıp yapmadığını; == ise değerlerin eşit kabul edilip edilmediğini sorgular.
Gelecek haftalarda account, customer, order gibi değişkenlerin birer nesneyi göstereceğini göreceğiz. Bir nesneyi metotla değiştirdiğimizde, aynı nesneye referansı olan diğer yerler de yeni durumu görür. Bugünkü liste deneyi bunun küçük bir ön gösterimidir.
Eşit ama aynı olmayan iki liste
İçerikleri eşit olabilir ama iki ayrı liste nesnesidir.
Kopya oluşturmak
Yeni ve ayrı bir liste istediğimizde en açık seçeneklerden biri .copy() ile sığ kopyadır:
Aynı dış listeyi list(original) veya original[:] ile de kopyalayabilirsiniz; bu derste okunabilirlik için .copy() kullanacağız.
Ancak sığ kopya (shallow copy) ifadesindeki “sığ” sözcüğü önemlidir. İç içe listelerde içteki nesneler hâlâ paylaşılabilir:
Bu hafta deepcopy ayrıntısına girmiyoruz. Ama bir kopyanın neyi gerçekten ayırdığını sorgulama alışkanlığı önemlidir.
Sözlükle kayıt tutmak ve dolaşmak
Sözlük üzerinde doğrudan dolaşırsanız anahtarları alırsınız. Anahtar ve değeri birlikte kullanmak için .items() çoğu zaman en doğal araçtır:
.keys()anahtar görünümü,.values()değer görünümü,.items()(anahtar, değer)çiftleri verir.
Sözlük anahtarı neden her şey olamaz?
Sözlük ve küme, hash tabanlı yapılardır. Bir sözlük anahtarının hashlenebilir olması gerekir; pratik başlangıç kuralı olarak değiştirilebilir list, dict ve set nesnelerini anahtar yapmayın:
lookup = {}
lookup[[1, 2]] = "değer" # TypeError: unhashable type: 'list'str, int ve uygun immutable tuple’lar sık kullanılan anahtarlardır. 12. haftada kendi sınıflarımızda __eq__ ve hash sözleşmesinin ilişkisini yeniden göreceğiz.
sorted() ve .sort()
İki isim benzer, etkileri farklıdır:
sorted(iterable)yeni bir liste döndürür; asıl koleksiyonu değiştirmez.list.sort()mevcut listeyi yerinde değiştirir veNonedöndürür.
Nesne koleksiyonlarını sıralarken de aynı ayrım geçerli olacaktır.
Alıştırma — Doğru koleksiyonu seç
Aşağıdaki ihtiyaçlar için list, tuple, dict veya set seçeneklerinden en uygun olanı seçin ve bir cümleyle gerekçelendirin:
- Bir dersin haftalık konu sırası.
- Öğrenci numarasından öğrenci adına hızlı erişim.
- Sisteme giriş yapan benzersiz kullanıcı adları.
- Değişmemesi gereken
(enlem, boylam)çifti.
Tek bir “mutlak doğru” yerine kullanım amacına bakın.
Alıştırma — Aliasing hatasını düzelt
Aşağıdaki kodda backup değişmeden kalması bekleniyor:
backup için ayrı liste oluşacak biçimde tek satırı .copy() kullanarak değiştirin.
Alıştırma — Frekans sözlüğü
counts.get(word, 0) ifadesi anahtar yoksa 0 döndürür.
counts[word] = counts.get(word, 0) + 1Küçük üretim görevi — Basit envanter
Ürün kodlarını anahtar, stok miktarlarını değer olarak tutan bir sözlük oluşturun. Ardından:
- Bir ürünün stokunu azaltın,
- Olmayan ürün için güvenli kontrol yapın,
.items()ile dolaşıp stoku sıfır olan ürünleri listeleyin,sorted()kullanarak ürün kodlarını sıralı raporlayın,- Tüm ürün kodlarının benzersiz olduğunu açıklayın.
Son olarak şu soruyu cevaplayın: “Stok sıfırın altına düşmesin” kuralını bu sözlük yaklaşımında nerede koruyoruz? Bu sorunun cevabı, ileride neden sınıf metotlarına ihtiyaç duyacağımızı gösterecek.
Çalışır kod teslimi: Envanter programını en az bir mevcut, bir olmayan ve bir stoku sıfır ürün senaryosuyla çalıştırın. Çıktıda bu üç durum görünür olmalıdır.
Tek sayfa özet
- Python koleksiyonları farklı kullanım amaçları olan nesnelerdir; bu hafta hepsini aynı derinlikte ezberlemek yerine doğru kullanım kalıplarını öğreniyoruz.
- Değiştirilebilir nesnelerde iki değişken aynı nesneyi gösterebilir.
iskimlik,==eşitlik sorusudur..copy()dış koleksiyonu ayırır; içteki nesneler paylaşılabilir.- Sözlükte
.items()anahtar ve değerle birlikte dolaşmanın temel yoludur. - Sözlük anahtarları hashlenebilir olmalıdır.
sorted()yeni liste üretir;.sort()listeyi yerinde değiştirir.- Dağınık sözlük güncellemeleri, ileride sınıf ve metot tasarımının neden gerekli olduğunu gösterecektir.
Bu bölümün kazanımları
Bu bölümü bitiren öğrenci:
list,tuple,dictvesetarasından probleme uygun koleksiyonu seçer.- Demetin değişmezliğinin eleman bağlarına ait olduğunu, içindeki nesnenin durumunu kapsamadığını açıklar.
b = aile iki adın aynı nesneyi gösterdiğini tanır ve bir yerdeki değişikliği diğerinden okur.isile==sorularını birbirinden ayırır.copy()ile bağımsız kopya üretir ve sığ kopyanın sınırını belirler.- Sözlükte
.keys(),.values()ve.items()görünümlerini yerinde kullanır. sorted()ile.sort()arasındaki dönüş değeri ve yerinde değiştirme farkını gösterir.