{"id":42549,"date":"2026-06-14T21:10:20","date_gmt":"2026-06-14T18:10:20","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/"},"modified":"2026-06-14T21:10:20","modified_gmt":"2026-06-14T18:10:20","slug":"pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/","title":{"rendered":"Python&#8217;\u0131n collections Mod\u00fcl\u00fc: defaultdict ve Counter&#8217;\u0131n \u00d6tesindeki D\u00f6rt Gizli Cevher"},"content":{"rendered":"<h2>Python&#8217;\u0131n collections Mod\u00fcl\u00fc: defaultdict ve Counter&#8217;\u0131n \u00d6tesindeki D\u00f6rt Gizli Cevher<\/h2>\n<p>Python&#8217;da veri yap\u0131lar\u0131, programlaman\u0131n temel ta\u015flar\u0131ndan biridir. \u00c7o\u011fu geli\u015ftirici <code>list<\/code>, <code>dict<\/code> ve <code>set<\/code> gibi yerle\u015fik tiplere a\u015fina olsa da, daha karma\u015f\u0131k veya performans odakl\u0131 senaryolarda bu temel yap\u0131lar yetersiz kalabilir. \u0130\u015fte tam bu noktada, Python&#8217;\u0131n zengin standart k\u00fct\u00fcphanesinin bir par\u00e7as\u0131 olan <code>collections<\/code> mod\u00fcl\u00fc devreye girer. Bu mod\u00fcl, veri y\u00f6netimi ve i\u015fleme s\u00fcre\u00e7lerini \u00f6nemli \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131ran \u00f6zel veri yap\u0131lar\u0131 sunar. Genellikle <code>defaultdict<\/code> ve <code>Counter<\/code> gibi pop\u00fcler ara\u00e7lar\u0131yla tan\u0131nsa da, <code>collections<\/code> mod\u00fcl\u00fcn\u00fcn derinliklerinde ger\u00e7ek d\u00fcnya problemlerine zarif \u00e7\u00f6z\u00fcmler sunan d\u00f6rt &#8220;gizli cevher&#8221; daha bulunmaktad\u0131r. Bu makalede, bu g\u00fc\u00e7l\u00fc ancak g\u00f6zden ka\u00e7an ara\u00e7lar\u0131 \u2013 <code>namedtuple<\/code>, <code>deque<\/code>, <code>ChainMap<\/code> ve <code>UserDict<\/code>&#8216;i \u2013 yak\u0131ndan inceleyecek, kullan\u0131mlar\u0131n\u0131 ger\u00e7ek\u00e7i vaka analizleriyle destekleyecek ve projelerinize nas\u0131l entegre edebilece\u011finizi ad\u0131m ad\u0131m g\u00f6sterece\u011fiz.<\/p>\n<h2>Neden collections Mod\u00fcl\u00fc? Temel Kavramlara K\u0131sa Bir Bak\u0131\u015f<\/h2>\n<p>Python&#8217;\u0131n <code>collections<\/code> mod\u00fcl\u00fc, standart veri yap\u0131lar\u0131n\u0131n (listeler, s\u00f6zl\u00fckler, k\u00fcmeler) yeteneklerini geni\u015fletmek ve belirli kullan\u0131m durumlar\u0131 i\u00e7in optimize edilmi\u015f, \u00f6zel kaplar (container) sa\u011flamak amac\u0131yla tasarlanm\u0131\u015ft\u0131r. Temel olarak, bu mod\u00fcl daha verimli, okunabilir ve y\u00f6netilebilir kod yazman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, <code>defaultdict<\/code>, bir s\u00f6zl\u00fc\u011fe eri\u015firken anahtar bulunamad\u0131\u011f\u0131nda varsay\u0131lan bir de\u011fer (veya yeni bir \u00f6\u011fe) olu\u015fturarak <code>KeyError<\/code> hatalar\u0131n\u0131 \u00f6nler ve kodunuzu basitle\u015ftirir. Benzer \u015fekilde, <code>Counter<\/code> ise bir iterable (yinelenebilir) i\u00e7indeki \u00f6\u011felerin frekans\u0131n\u0131 saymak i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r, \u00f6zellikle metin analizi veya en s\u0131k ge\u00e7en \u00f6\u011feleri bulma gibi g\u00f6revlerde hayat kurtar\u0131c\u0131d\u0131r. Ancak, Python d\u00fcnyas\u0131 sadece bu iki pop\u00fcler ara\u00e7tan ibaret de\u011fildir. Veri yap\u0131lar\u0131 genellikle uygulamalar\u0131n performans\u0131n\u0131, okunabilirli\u011fini ve bak\u0131m kolayl\u0131\u011f\u0131n\u0131 do\u011frudan etkiler. \u00d6rne\u011fin, bir veritaban\u0131ndan \u00e7ekilen kay\u0131tlar\u0131 i\u015flerken, basit bir tuple kullanmak verimsiz ve anla\u015f\u0131lmas\u0131 zor olabilirken, bir s\u0131n\u0131f tan\u0131mlamak gereksiz yere a\u011f\u0131r ka\u00e7abilir. Ayn\u0131 \u015fekilde, bir kuyruk (queue) yap\u0131s\u0131nda eleman ekleme ve \u00e7\u0131karmay\u0131 s\u00fcrekli olarak listenin ba\u015f\u0131ndan yapmak, b\u00fcy\u00fck veri setlerinde ciddi performans sorunlar\u0131na yol a\u00e7abilir. \u0130\u015fte bu gibi durumlarda, <code>collections<\/code> mod\u00fcl\u00fcndeki di\u011fer ara\u00e7lar devreye girerek bu t\u00fcr zorluklar\u0131n \u00fcstesinden gelmemize yard\u0131mc\u0131 olur. Bu ara\u00e7lar, geli\u015ftiricilere daha spesifik ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak \u00fczere tasarlanm\u0131\u015f, optimize edilmi\u015f \u00e7\u00f6z\u00fcmler sunar ve b\u00f6ylece kodun hem daha verimli \u00e7al\u0131\u015fmas\u0131n\u0131 hem de daha kolay anla\u015f\u0131lmas\u0131n\u0131 sa\u011flar. Bu sayede, daha karma\u015f\u0131k veri manip\u00fclasyonlar\u0131 ve algoritma uygulamalar\u0131 \u00e7ok daha pratik hale gelir.<\/p>\n<h2>namedtuple: Verilerinizi Daha Anla\u015f\u0131l\u0131r ve Hafif Nesnelere D\u00f6n\u00fc\u015ft\u00fcr\u00fcn<\/h2>\n<h3>namedtuple Nedir ve Ne Zaman Kullan\u0131l\u0131r?<\/h3>\n<p>Python&#8217;daki <code>tuple<\/code> (demet) veri yap\u0131s\u0131, de\u011fi\u015fmez (immutable) ve s\u0131ral\u0131 bir koleksiyon olmas\u0131n\u0131n yan\u0131 s\u0131ra, listelere g\u00f6re daha az bellek t\u00fcketmesiyle bilinir. Ancak, tuple&#8217;lar\u0131n temel dezavantaj\u0131, elemanlara yaln\u0131zca indeks numaralar\u0131yla (\u00f6rne\u011fin, <code>veri[0]<\/code>, <code>veri[1]<\/code>) eri\u015filebilmesidir. Bu durum, \u00f6zellikle birden fazla anlamsal alana sahip verilerle \u00e7al\u0131\u015f\u0131rken kodun okunabilirli\u011fini ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde d\u00fc\u015f\u00fcr\u00fcr. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n ad\u0131n\u0131, soyad\u0131n\u0131 ve ya\u015f\u0131n\u0131 i\u00e7eren bir tuple&#8217;da, <code>kullanici[0]<\/code>&#8216;\u0131n ad m\u0131 yoksa soyad m\u0131 oldu\u011funu anlamak i\u00e7in s\u00fcrekli dok\u00fcmantasyona bakmak veya kodun farkl\u0131 yerlerini incelemek gerekebilir. \u0130\u015fte <code>namedtuple<\/code>, bu soruna zarif bir \u00e7\u00f6z\u00fcm sunar. <code>namedtuple<\/code>, tuple&#8217;lar\u0131n t\u00fcm avantajlar\u0131n\u0131 korurken, her bir elemana bir isim (alan ad\u0131) ataman\u0131za olanak tan\u0131r. Bu sayede, verilere indeks yerine anlaml\u0131 alan adlar\u0131 (\u00f6rne\u011fin, <code>kullanici.ad<\/code>, <code>kullanici.soyad<\/code>) \u00fczerinden eri\u015febilirsiniz. Bu, kodu \u00e7ok daha okunakl\u0131, kendi kendini a\u00e7\u0131klay\u0131c\u0131 ve bak\u0131m\u0131 kolay hale getirir. <code>namedtuple<\/code>&#8216;lar asl\u0131nda basit bir s\u0131n\u0131f (class) tan\u0131mlaman\u0131n hafif bir alternatifi olarak d\u00fc\u015f\u00fcn\u00fclebilir. Tam te\u015fekk\u00fcll\u00fc bir s\u0131n\u0131f olu\u015fturmak yerine, yaln\u0131zca veri depolamak ve bu verilere anlaml\u0131 isimlerle eri\u015fmek istedi\u011finizde <code>namedtuple<\/code> ideal bir se\u00e7imdir. Geleneksel bir s\u0131n\u0131fa g\u00f6re daha az bellek kullan\u0131r ve daha h\u0131zl\u0131d\u0131r, bu da onu \u00f6zellikle b\u00fcy\u00fck veri setleriyle veya performans\u0131n kritik oldu\u011fu uygulamalarda tercih sebebi yapar. Bu ara\u00e7, \u00f6zellikle veritaban\u0131 sorgular\u0131ndan d\u00f6nen sat\u0131rlar\u0131, API yan\u0131tlar\u0131n\u0131 veya sabit veri yap\u0131lar\u0131n\u0131 temsil etmek i\u00e7in olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h3>Vaka Analizi: Sens\u00f6r Verilerini Y\u00f6netmek<\/h3>\n<p>Bir ak\u0131ll\u0131 ev sisteminde, farkl\u0131 odalardan s\u0131cakl\u0131k, nem ve \u0131\u015f\u0131k seviyesi gibi sens\u00f6r verileri toplad\u0131\u011f\u0131n\u0131z\u0131 varsayal\u0131m. Bu verileri her seferinde bir tuple olarak <code>(oda_id, s\u0131cakl\u0131k, nem, \u0131\u015f\u0131k)<\/code> \u015feklinde tutmak, kodun karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131rabilir. Hangi indeksin neyi temsil etti\u011fini s\u00fcrekli hat\u0131rlamak yerine, <code>namedtuple<\/code> kullanarak bu verileri \u00e7ok daha anlaml\u0131 hale getirebiliriz.<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom collections import namedtuple\n\n# Sens\u00f6r verisi i\u00e7in bir namedtuple tan\u0131mlayal\u0131m\nSensorVerisi = namedtuple('SensorVerisi', ['oda_id', 'sicaklik', 'nem', 'isik'])\n\n# \u00d6rnek sens\u00f6r okumalar\u0131\nokuma1 = SensorVerisi(oda_id='salon', sicaklik=22.5, nem=60.2, isik='orta')\nokuma2 = SensorVerisi(oda_id='mutfak', sicaklik=24.1, nem=55.8, isik='yuksek')\nokuma3 = SensorVerisi(oda_id='yatak_odasi', sicaklik=21.0, nem=63.5, isik='dusuk')\n\n# Verilere isimleriyle eri\u015fim\nprint(f\"Salon s\u0131cakl\u0131\u011f\u0131: {okuma1.sicaklik}\u00b0C\")\nprint(f\"Mutfak nem oran\u0131: {okuma2.nem}%\")\nprint(f\"Yatak odas\u0131 \u0131\u015f\u0131k seviyesi: {okuma3.isik}\")\n\n# namedtuple'lar de\u011fi\u015fmezdir\n# okuma1.sicaklik = 23.0 # Bu bir hata verir!\n\n# namedtuple'\u0131 bir s\u00f6zl\u00fc\u011fe d\u00f6n\u00fc\u015ft\u00fcrme\nprint(okuma1._asdict())\n\n# Varolan bir namedtuple'\u0131 de\u011fi\u015ftirerek yeni bir tane olu\u015fturma\nokuma1_yeni = okuma1._replace(sicaklik=23.0, isik='yuksek')\nprint(f\"G\u00fcncellenmi\u015f salon s\u0131cakl\u0131\u011f\u0131: {okuma1_yeni.sicaklik}\u00b0C, I\u015f\u0131k: {okuma1_yeni.isik}\")\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Bu \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, <code>SensorVerisi<\/code> adl\u0131 bir <code>namedtuple<\/code> olu\u015fturarak, her bir sens\u00f6r okumas\u0131n\u0131 daha anla\u015f\u0131l\u0131r bir nesne gibi ele alabiliyoruz. <code>okuma1.sicaklik<\/code> gibi ifadeler, <code>okuma1[1]<\/code>&#8216;den \u00e7ok daha a\u00e7\u0131klay\u0131c\u0131d\u0131r. Bu, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k projelerde kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 inan\u0131lmaz derecede kolayla\u015ft\u0131r\u0131r. Ayr\u0131ca, <code>namedtuple<\/code>&#8216;lar de\u011fi\u015fmez (immutable) oldu\u011fu i\u00e7in, bir kez olu\u015fturulduktan sonra de\u011ferleri de\u011fi\u015ftirilemez. Bu \u00f6zellik, \u00f6zellikle \u00e7oklu i\u015f par\u00e7ac\u0131kl\u0131 (multithreaded) ortamlarda veri tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck bir avantaj sunar. De\u011fi\u015fmezlik, verilerin beklenmedik \u015fekilde de\u011fi\u015fmesini engelleyerek hatalar\u0131 azalt\u0131r ve kodun davran\u0131\u015f\u0131n\u0131 daha \u00f6ng\u00f6r\u00fclebilir hale getirir. <code>_asdict()<\/code> metodu ile namedtuple&#8217;\u0131 kolayca bir s\u00f6zl\u00fc\u011fe d\u00f6n\u00fc\u015ft\u00fcrebilir, bu da onu JSON veya di\u011fer veri formatlar\u0131yla \u00e7al\u0131\u015f\u0131rken olduk\u00e7a esnek k\u0131lar. <code>_replace()<\/code> metodu ise mevcut bir namedtuple&#8217;\u0131n baz\u0131 alanlar\u0131n\u0131 de\u011fi\u015ftirerek yeni bir namedtuple olu\u015fturman\u0131za olanak tan\u0131r, bu da de\u011fi\u015fmezlik ilkesine sad\u0131k kalarak veri g\u00fcncellemelerini y\u00f6netmenin zarif bir yoludur. Sonu\u00e7 olarak, <code>namedtuple<\/code>, veri yap\u0131lar\u0131n\u0131z\u0131n hem hafif, hem performansl\u0131 hem de son derece okunakl\u0131 olmas\u0131n\u0131 istedi\u011finizde ba\u015fvurman\u0131z gereken ilk ara\u00e7lardan biridir.<\/p>\n<h3>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131: namedtuple<\/h3>\n<p><code>namedtuple<\/code>&#8216;lar sadece basit veri kapsay\u0131c\u0131lar\u0131 olman\u0131n \u00f6tesinde, baz\u0131 kullan\u0131\u015fl\u0131 metotlar ve \u00f6zellikler sunar. \u00d6rne\u011fin, <code>_fields<\/code> \u00f6zniteli\u011fi, bir <code>namedtuple<\/code>&#8216;\u0131n t\u00fcm alan adlar\u0131n\u0131 i\u00e7eren bir tuple d\u00f6nd\u00fcr\u00fcr. Bu, dinamik olarak alan adlar\u0131na eri\u015fmek veya bir veri yap\u0131s\u0131n\u0131n \u015femas\u0131n\u0131 incelemek istedi\u011finizde faydal\u0131 olabilir. Ayr\u0131ca, <code>namedtuple<\/code> olu\u015ftururken varsay\u0131lan de\u011ferler atamak da m\u00fcmk\u00fcnd\u00fcr. Bu, t\u00fcm alanlar\u0131n her zaman belirtilmesini gerektirmeyen durumlarda olduk\u00e7a pratiktir. Python 3.7 ve sonraki s\u00fcr\u00fcmlerinde, <code>namedtuple<\/code>&#8216;a varsay\u0131lan de\u011ferler atamak i\u00e7in <code>defaults<\/code> parametresi kullan\u0131labilir. Bu sayede, belirli alanlar i\u00e7in veri sa\u011flanmad\u0131\u011f\u0131nda otomatik olarak bir varsay\u0131lan de\u011fer atan\u0131r. \u00d6rne\u011fin, <code>SensorVerisi = namedtuple('SensorVerisi', ['oda_id', 'sicaklik', 'nem', 'isik'], defaults=[None, None, 'orta'])<\/code> gibi bir tan\u0131mlama, nem ve \u0131\u015f\u0131k i\u00e7in varsay\u0131lan de\u011ferler belirlemenize olanak tan\u0131r. Bu esneklik, veri giri\u015fini kolayla\u015ft\u0131r\u0131rken ayn\u0131 zamanda veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc koruman\u0131za yard\u0131mc\u0131 olur. <code>namedtuple<\/code>&#8216;lar ayr\u0131ca serile\u015ftirme (serialization) i\u00e7in de olduk\u00e7a uygundur, \u00e7\u00fcnk\u00fc standart tuple&#8217;lar gibi davran\u0131rlar ve JSON veya CSV gibi formatlara kolayca d\u00f6n\u00fc\u015ft\u00fcr\u00fclebilirler. Bu \u00f6zellikler, <code>namedtuple<\/code>&#8216;\u0131 sadece basit veri yap\u0131lar\u0131 i\u00e7in de\u011fil, ayn\u0131 zamanda daha karma\u015f\u0131k veri i\u015fleme boru hatlar\u0131nda (pipelines) da g\u00fc\u00e7l\u00fc bir ara\u00e7 haline getirir.<\/p>\n<h2>deque: Y\u00fcksek Performansl\u0131 Kuyruk ve Y\u0131\u011f\u0131n \u0130\u015flemleri \u0130\u00e7in \u00c7ift U\u00e7lu Liste<\/h2>\n<h3>deque Nedir ve Neden Normal Listeden Daha \u0130yidir?<\/h3>\n<p>Python&#8217;\u0131n yerle\u015fik <code>list<\/code> veri yap\u0131s\u0131, \u00e7ok y\u00f6nl\u00fc ve g\u00fc\u00e7l\u00fcd\u00fcr; ancak, listenin ba\u015f\u0131ndan eleman ekleme (<code>insert(0, ...)<\/code>) veya \u00e7\u0131karma (<code>pop(0)<\/code>) i\u015flemleri s\u00f6z konusu oldu\u011funda performans\u0131 d\u00fc\u015fer. Bunun nedeni, bir listenin ba\u015f\u0131ndan bir eleman eklendi\u011finde veya \u00e7\u0131kar\u0131ld\u0131\u011f\u0131nda, Python&#8217;\u0131n listedeki t\u00fcm di\u011fer elemanlar\u0131 bellekte kayd\u0131rmas\u0131 gerekmesidir. Bu i\u015flem, listenin boyutu b\u00fcy\u00fcd\u00fck\u00e7e daha fazla zaman al\u0131r ve O(n) zaman karma\u015f\u0131kl\u0131\u011f\u0131na sahiptir; yani, listenin uzunlu\u011fu (n) artt\u0131k\u00e7a i\u015flem s\u00fcresi de do\u011frusal olarak artar. Bu durum, \u00f6zellikle kuyruk (queue) veya y\u0131\u011f\u0131n (stack) gibi veri yap\u0131lar\u0131n\u0131n s\u00fcrekli olarak her iki ucundan eleman ekleyip \u00e7\u0131kard\u0131\u011f\u0131 senaryolarda ciddi performans darbo\u011fazlar\u0131na yol a\u00e7abilir. \u0130\u015fte <code>collections<\/code> mod\u00fcl\u00fcndeki <code>deque<\/code> (double-ended queue &#8211; \u00e7ift u\u00e7lu kuyruk) veri yap\u0131s\u0131 tam da bu sorunu \u00e7\u00f6zmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. <code>deque<\/code>, bir \u00e7ift ba\u011fl\u0131 liste (doubly linked list) gibi \u00e7al\u0131\u015f\u0131r ve bu sayede elemanlar\u0131 hem sa\u011fdan (sonundan) hem de soldan (ba\u015f\u0131ndan) ekleme ve \u00e7\u0131karma i\u015flemlerini O(1) zaman karma\u015f\u0131kl\u0131\u011f\u0131nda, yani sabit zamanda ger\u00e7ekle\u015ftirebilir. Bu, listenin boyutundan ba\u011f\u0131ms\u0131z olarak i\u015flemin her zaman ayn\u0131 s\u00fcrede tamamlanaca\u011f\u0131 anlam\u0131na gelir. Bu \u00f6zelli\u011fi sayesinde <code>deque<\/code>, \u00f6zellikle son girilen N eleman\u0131 tutma, kuyruk tabanl\u0131 algoritmalar (BFS gibi) veya bir i\u015flem ge\u00e7mi\u015fini kaydetme gibi senaryolarda standart Python listelerine g\u00f6re \u00e7ok daha verimli ve h\u0131zl\u0131d\u0131r. <code>deque<\/code>&#8216;nin bu \u00fcst\u00fcn performans\u0131, b\u00fcy\u00fck veri ak\u0131\u015flar\u0131n\u0131 i\u015fleyen veya ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftiren geli\u015ftiriciler i\u00e7in kritik bir avantaj sa\u011flar. Ayr\u0131ca, <code>deque<\/code>&#8216;ler iste\u011fe ba\u011fl\u0131 olarak maksimum boyuta sahip olabilir (<code>maxlen<\/code> parametresi). Bu \u00f6zellik, belirli bir say\u0131da eleman\u0131 tutmak istedi\u011finizde ve eski elemanlar\u0131n otomatik olarak at\u0131lmas\u0131n\u0131 istedi\u011finizde otomatik bir eleman y\u00f6netim mekanizmas\u0131 sunar. Bu, bellek y\u00f6netimini basitle\u015ftirir ve \u00f6zellikle s\u0131n\u0131rl\u0131 kaynaklara sahip sistemlerde veya s\u00fcrekli akan veri setlerinde b\u00fcy\u00fck fayda sa\u011flar.<\/p>\n<h3>Vaka Analizi: Ger\u00e7ek Zamanl\u0131 Log Y\u00f6netimi veya Son \u0130\u015flemler Ge\u00e7mi\u015fi<\/h3>\n<p>Bir web uygulamas\u0131nda, kullan\u0131c\u0131lar\u0131n ger\u00e7ekle\u015ftirdi\u011fi son 10 i\u015flemi veya sistem taraf\u0131ndan \u00fcretilen son 20 log mesaj\u0131n\u0131 tutmak istedi\u011finizi d\u00fc\u015f\u00fcn\u00fcn. Normal bir liste kullan\u0131rsan\u0131z, her yeni i\u015flemde listenin ba\u015f\u0131na eleman ekleyip, liste boyutu a\u015ft\u0131\u011f\u0131nda sondan eleman \u00e7\u0131karmak performans sorunlar\u0131na yol a\u00e7abilir. <code>deque<\/code>, bu t\u00fcr senaryolar i\u00e7in bi\u00e7ilmi\u015f kaftand\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom collections import deque\nimport time\n\n# Son 5 i\u015flemi tutacak bir deque olu\u015ftural\u0131m\n# maxlen parametresi, deque'nin maksimum boyutunu belirler.\n# Boyut a\u015f\u0131ld\u0131\u011f\u0131nda, en eski eleman otomatik olarak at\u0131l\u0131r.\nson_islemler = deque(maxlen=5)\n\ndef islem_kaydet(islem_adi):\n    \"\"\"Yeni bir i\u015flemi deque'ye ekler.\"\"\"\n    son_islemler.append(f\"{time.strftime('%H:%M:%S')} - {islem_adi}\")\n    print(f\"'{islem_adi}' kaydedildi. Mevcut i\u015flemler: {list(son_islemler)}\")\n\n# \u00d6rnek i\u015flemler\nislem_kaydet(\"Kullan\u0131c\u0131 Giri\u015fi\")\nislem_kaydet(\"\u00dcr\u00fcn Sepete Eklendi\")\nislem_kaydet(\"\u00d6deme Ba\u015flat\u0131ld\u0131\")\nislem_kaydet(\"Sipari\u015f Onayland\u0131\")\nislem_kaydet(\"Kullan\u0131c\u0131 \u00c7\u0131k\u0131\u015f\u0131\")\n\nprint(\"\\n--- Yeni \u0130\u015flemler ---\")\nislem_kaydet(\"Profil G\u00fcncellendi\") # \u0130lk i\u015flem (Kullan\u0131c\u0131 Giri\u015fi) otomatik olarak at\u0131l\u0131r\nislem_kaydet(\"\u015eifre De\u011fi\u015ftirildi\") # \u0130kinci i\u015flem (\u00dcr\u00fcn Sepete Eklendi) otomatik olarak at\u0131l\u0131r\n\nprint(\"\\nSon 5 i\u015flem:\")\nfor islem in son_islemler:\n    print(f\"- {islem}\")\n\n# Deque'nin solundan eleman ekleme (kuyru\u011fun ba\u015f\u0131na)\nson_islemler.appendleft(\"Acil Durum Mesaj\u0131\")\nprint(f\"\\nAcil durum eklendi: {list(son_islemler)}\")\n\n# Deque'nin sa\u011f\u0131ndan eleman \u00e7\u0131karma (kuyru\u011fun sonundan)\ncikan_islem = son_islemler.pop()\nprint(f\"Sa\u011fdan \u00e7\u0131kar\u0131lan i\u015flem: '{cikan_islem}'. Kalanlar: {list(son_islemler)}\")\n\n# Deque'nin solundan eleman \u00e7\u0131karma (kuyru\u011fun ba\u015f\u0131ndan)\ncikan_islem_sol = son_islemler.popleft()\nprint(f\"Soldan \u00e7\u0131kar\u0131lan i\u015flem: '{cikan_islem_sol}'. Kalanlar: {list(son_islemler)}\")\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Bu \u00f6rnekte, <code>deque<\/code>&#8216;nin <code>maxlen<\/code> \u00f6zelli\u011fi sayesinde, <code>son_islemler<\/code> kuyru\u011fu her zaman en fazla 5 eleman i\u00e7erir. Yeni bir eleman eklendi\u011finde ve boyut a\u015f\u0131ld\u0131\u011f\u0131nda, en eski eleman otomatik olarak kuyruktan \u00e7\u0131kar\u0131l\u0131r. Bu, manuel olarak eleman kontrol\u00fc yapma ve listenin ba\u015f\u0131nda veya sonunda maliyetli ekleme\/\u00e7\u0131karma i\u015flemleri yapma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r. Bu \u00f6zellik, \u00f6zellikle s\u0131n\u0131rl\u0131 bellek kaynaklar\u0131na sahip sistemlerde veya s\u00fcrekli akan veri setlerini y\u00f6netirken olduk\u00e7a faydal\u0131d\u0131r. <code>appendleft()<\/code> ve <code>popleft()<\/code> metotlar\u0131 ise, bir kuyru\u011fun veya y\u0131\u011f\u0131n\u0131n her iki ucundan da sabit zamanda i\u015flem yapma yetene\u011fini g\u00f6sterir. Bu, <code>deque<\/code>&#8216;yi hem FIFO (First-In, First-Out) kuyruklar\u0131 hem de LIFO (Last-In, First-Out) y\u0131\u011f\u0131nlar\u0131 i\u00e7in ideal bir se\u00e7im haline getirir. \u00d6rne\u011fin, bir web sunucusunun istek kuyru\u011funu veya bir oyunun geri alma (undo) ge\u00e7mi\u015fini y\u00f6netmek i\u00e7in <code>deque<\/code> harika bir \u00e7\u00f6z\u00fcm sunar. <code>deque<\/code>&#8216;nin bu esnekli\u011fi ve performans\u0131, onu Python&#8217;da veri yap\u0131lar\u0131 ile \u00e7al\u0131\u015fan her geli\u015ftiricinin ara\u00e7 kutusunda bulunmas\u0131 gereken \u00f6nemli bir ara\u00e7 yapar.<\/p>\n<h3>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131: deque<\/h3>\n<p><code>deque<\/code>&#8216;ler, sadece eleman ekleme ve \u00e7\u0131karma i\u015flemlerinde de\u011fil, ayn\u0131 zamanda elemanlar\u0131 d\u00f6nd\u00fcrme (rotate) gibi \u00f6zel operasyonlarda da olduk\u00e7a etkilidir. <code>rotate(n)<\/code> metodu, <code>deque<\/code>&#8216;deki elemanlar\u0131 <code>n<\/code> ad\u0131m sa\u011fa (pozitif <code>n<\/code>) veya sola (negatif <code>n<\/code>) d\u00f6nd\u00fcr\u00fcr. Bu \u00f6zellik, dairesel arabellek (circular buffer) veya oyunlarda elemanlar\u0131 s\u0131rayla i\u015fleme gibi senaryolarda kullan\u0131\u015fl\u0131d\u0131r. \u00d6rne\u011fin, bir oyunun s\u0131radaki oyuncusunu belirlemek i\u00e7in oyuncu listesini d\u00f6nd\u00fcrebilirsiniz. Ayr\u0131ca, <code>extend()<\/code> ve <code>extendleft()<\/code> metotlar\u0131, bir iterable&#8217;daki t\u00fcm elemanlar\u0131 <code>deque<\/code>&#8216;nin sa\u011f\u0131na veya soluna topluca eklemenizi sa\u011flar, bu da birden fazla eleman\u0131 tek seferde eklerken performans\u0131 art\u0131r\u0131r. <code>deque<\/code>&#8216;ler, Python&#8217;\u0131n <code>asyncio<\/code> mod\u00fcl\u00fc ile birlikte asenkron kuyruklar olu\u015fturmak i\u00e7in de temel bir yap\u0131 ta\u015f\u0131 olarak kullan\u0131l\u0131r. Bu, e\u015fzamanl\u0131 programlamada g\u00f6revler aras\u0131nda veri al\u0131\u015fveri\u015fini y\u00f6netmek i\u00e7in y\u00fcksek performansl\u0131 ve g\u00fcvenilir bir yol sunar. Bu ileri d\u00fczey kullan\u0131mlar, <code>deque<\/code>&#8216;nin sadece basit kuyruk ve y\u0131\u011f\u0131n i\u015flemlerinden \u00e7ok daha fazlas\u0131n\u0131 yapabilece\u011fini g\u00f6sterir.<\/p>\n<h2>ChainMap: Birden Fazla S\u00f6zl\u00fc\u011f\u00fc Tek Bir Mant\u0131ksal Yap\u0131da Birle\u015ftirme<\/h2>\n<h3>ChainMap Nedir ve S\u00f6zl\u00fck Birle\u015ftirmede \u00c7\u00f6zd\u00fc\u011f\u00fc Sorunlar Nelerdir?<\/h3>\n<p>Python&#8217;da birden fazla s\u00f6zl\u00fc\u011f\u00fc birle\u015ftirmek veya farkl\u0131 kapsamdaki (scope) ayarlar\u0131 y\u00f6netmek, s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan bir problemdir. Geli\u015ftiriciler genellikle bir uygulaman\u0131n yap\u0131land\u0131rma ayarlar\u0131n\u0131 birden fazla kaynaktan (\u00f6rne\u011fin, varsay\u0131lan ayarlar, kullan\u0131c\u0131 taraf\u0131ndan belirlenen ayarlar, ortam de\u011fi\u015fkenleri) almak isterler. Bu senaryolarda, belirli bir ayar\u0131 ararken, \u00f6nce en \u00f6ncelikli kaynaktan ba\u015flamak ve bulunamazsa bir sonraki kayna\u011fa ge\u00e7mek gerekir. Geleneksel yakla\u015f\u0131mlar genellikle s\u00f6zl\u00fckleri manuel olarak birle\u015ftirmeyi veya i\u00e7 i\u00e7e <code>if\/else<\/code> bloklar\u0131 kullanarak her bir s\u00f6zl\u00fc\u011f\u00fc s\u0131rayla kontrol etmeyi i\u00e7erir. Ancak, bu yakla\u015f\u0131mlar kodu karma\u015f\u0131kla\u015ft\u0131r\u0131r, okunabilirli\u011fi azalt\u0131r ve \u00f6zellikle s\u00f6zl\u00fcklerin say\u0131s\u0131 artt\u0131k\u00e7a veya dinamik olarak de\u011fi\u015fti\u011finde y\u00f6netilmesi zor hale gelir. Ayr\u0131ca, bir s\u00f6zl\u00fckte yap\u0131lan bir de\u011fi\u015fikli\u011fin di\u011ferlerini nas\u0131l etkileyece\u011fini takip etmek de g\u00fc\u00e7le\u015fir. \u0130\u015fte <code>collections<\/code> mod\u00fcl\u00fcndeki <code>ChainMap<\/code>, bu t\u00fcr \u00e7ok katmanl\u0131 s\u00f6zl\u00fck y\u00f6netimini basitle\u015ftirmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. <code>ChainMap<\/code>, birden fazla s\u00f6zl\u00fc\u011f\u00fc veya e\u015fleme (mapping) nesnesini tek bir birle\u015fik g\u00f6r\u00fcn\u00fcmde birle\u015ftirir. Bu birle\u015fik g\u00f6r\u00fcn\u00fcm, anahtarlar\u0131 ararken s\u00f6zl\u00fckleri belirtilen s\u0131raya g\u00f6re zincirleme (chaining) bir \u015fekilde kontrol eder. Yani, bir anahtar arand\u0131\u011f\u0131nda, <code>ChainMap<\/code> \u00f6nce ilk s\u00f6zl\u00fc\u011fe bakar, bulunamazsa ikinciye ge\u00e7er ve bu b\u00f6yle devam eder. Bu sayede, farkl\u0131 \u00f6ncelik seviyelerine sahip ayarlar\u0131 veya veri katmanlar\u0131n\u0131 kolayca y\u00f6netebilirsiniz. <code>ChainMap<\/code>&#8216;in en b\u00fcy\u00fck avantajlar\u0131ndan biri, birle\u015ftirilen s\u00f6zl\u00fcklerin kopyalar\u0131n\u0131 olu\u015fturmamas\u0131, bunun yerine orijinal s\u00f6zl\u00fcklere referans vermesidir. Bu, hem bellek a\u00e7\u0131s\u0131ndan verimlidir hem de orijinal s\u00f6zl\u00fcklerde yap\u0131lan de\u011fi\u015fikliklerin <code>ChainMap<\/code> g\u00f6r\u00fcn\u00fcm\u00fcne an\u0131nda yans\u0131mas\u0131n\u0131 sa\u011flar. Ancak, <code>ChainMap<\/code> \u00fczerinden yap\u0131lan yazma i\u015flemleri (<code>__setitem__<\/code>), her zaman zincirdeki ilk s\u00f6zl\u00fc\u011f\u00fc etkiler. Bu davran\u0131\u015f, genellikle yerel kapsamdaki de\u011fi\u015fikliklerin ana yap\u0131land\u0131rmay\u0131 etkilemesini engellemek i\u00e7in istenir ve \u00f6zellikle yap\u0131land\u0131rma y\u00f6netimi gibi durumlarda olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. Bu \u00f6zellikleriyle <code>ChainMap<\/code>, \u00f6zellikle \u00e7oklu yap\u0131land\u0131rma katmanlar\u0131na sahip uygulamalar, ortam de\u011fi\u015fkenlerini y\u00f6netme veya farkl\u0131 kapsamdaki sembol tablolar\u0131n\u0131 (symbol tables) i\u015fleme gibi senaryolarda geli\u015ftiricilere b\u00fcy\u00fck kolayl\u0131k sa\u011flar.<\/p>\n<h3>Vaka Analizi: Uygulama Ayarlar\u0131n\u0131 Y\u00f6netme<\/h3>\n<p>Bir web uygulamas\u0131n\u0131n yap\u0131land\u0131rmas\u0131n\u0131 y\u00f6netti\u011finizi d\u00fc\u015f\u00fcnelim. Bu yap\u0131land\u0131rma, varsay\u0131lan de\u011ferler, kullan\u0131c\u0131n\u0131n ki\u015fisel ayarlar\u0131 ve ortam de\u011fi\u015fkenleri gibi farkl\u0131 katmanlardan gelebilir. Bizim istedi\u011fimiz, bir ayara eri\u015fti\u011fimizde \u00f6nce kullan\u0131c\u0131n\u0131n ayarlar\u0131n\u0131, sonra ortam de\u011fi\u015fkenlerini, en son da varsay\u0131lan ayarlar\u0131 kontrol etmektir. <code>ChainMap<\/code> bu \u00f6nceliklendirme sorununu zarif\u00e7e \u00e7\u00f6zer.<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom collections import ChainMap\nimport os\n\n# 1. Varsay\u0131lan (default) uygulama ayarlar\u0131\nvarsayilan_ayarlar = {\n    'VERITABANI_HOST': 'localhost',\n    'VERITABANI_PORT': 5432,\n    'DEBUG_MODU': False,\n    'API_KEY': 'varsayilan_anahtar'\n}\n\n# 2. Ortam de\u011fi\u015fkenleri (\u00f6rne\u011fin, \u00fcretim ortam\u0131nda farkl\u0131 olabilir)\n# Normalde os.environ kullan\u0131l\u0131r, burada \u00f6rnek i\u00e7in manuel olu\u015fturuldu.\nortam_ayarlari = {\n    'VERITABANI_HOST': 'prod_db_server',\n    'DEBUG_MODU': True # Ortam de\u011fi\u015fkeni varsay\u0131lan\u0131 ge\u00e7ersiz k\u0131lar\n}\n\n# 3. Kullan\u0131c\u0131ya \u00f6zel ayarlar (\u00f6rne\u011fin, kullan\u0131c\u0131n\u0131n tercihlerinden)\nkullanici_ayarlari = {\n    'API_KEY': 'kullanici_anahtari_123' # Kullan\u0131c\u0131 ayar\u0131 ortam ve varsay\u0131lan\u0131 ge\u00e7ersiz k\u0131lar\n}\n\n# ChainMap olu\u015ftururken \u00f6ncelik s\u0131ras\u0131n\u0131 belirleriz:\n# \u0130lk s\u00f6zl\u00fck en y\u00fcksek \u00f6nceli\u011fe sahiptir.\nuygulama_ayarlari = ChainMap(kullanici_ayarlari, ortam_ayarlari, varsayilan_ayarlar)\n\nprint(\"Uygulama Ayarlar\u0131:\")\nprint(f\"Veritaban\u0131 Host: {uygulama_ayarlari['VERITABANI_HOST']}\") # ortam_ayarlari'ndan gelir\nprint(f\"Veritaban\u0131 Port: {uygulama_ayarlari['VERITABANI_PORT']}\") # varsayilan_ayarlar'dan gelir\nprint(f\"Debug Modu: {uygulama_ayarlari['DEBUG_MODU']}\")       # ortam_ayarlari'ndan gelir\nprint(f\"API Anahtar\u0131: {uygulama_ayarlari['API_KEY']}\")         # kullanici_ayarlari'ndan gelir\n\n# ChainMap'in i\u00e7erdi\u011fi s\u00f6zl\u00fckler listesi\nprint(f\"\\nChainMap'in i\u00e7erdi\u011fi s\u00f6zl\u00fckler: {uygulama_ayarlari.maps}\")\n\n# Yeni bir \u00e7ocuk (child) ChainMap olu\u015fturma (yeni, daha y\u00fcksek \u00f6ncelikli bir katman ekleme)\ngecici_ayarlar = {'TEMPORARY_SETTING': 'true', 'DEBUG_MODU': False}\nyeni_ayarlar_katmani = uygulama_ayarlari.new_child(gecici_ayarlar)\n\nprint(\"\\nYeni Ayarlar Katman\u0131 ile:\")\nprint(f\"Debug Modu (ge\u00e7ici): {yeni_ayarlar_katmani['DEBUG_MODU']}\") # gecici_ayarlar'dan gelir\nprint(f\"Ge\u00e7ici Ayar: {yeni_ayarlar_katmani['TEMPORARY_SETTING']}\")\n\n# ChainMap'e yazma i\u015flemi her zaman ilk (en \u00f6ncelikli) s\u00f6zl\u00fc\u011f\u00fc etkiler\nyeni_ayarlar_katmani['YENI_AYAR'] = 'deger'\nprint(f\"\\n\u0130lk s\u00f6zl\u00fckteki g\u00fcncellemeler: {yeni_ayarlar_katmani.maps[0]}\")\n# Bu, gecici_ayarlar s\u00f6zl\u00fc\u011f\u00fcn\u00fc etkiler, di\u011ferlerini de\u011fil.\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Bu \u00f6rnekte, <code>ChainMap<\/code> kullanarak \u00fc\u00e7 farkl\u0131 yap\u0131land\u0131rma katman\u0131n\u0131 (<code>kullanici_ayarlari<\/code>, <code>ortam_ayarlari<\/code>, <code>varsayilan_ayarlar<\/code>) tek bir mant\u0131ksal yap\u0131 alt\u0131nda birle\u015ftirdik. <code>uygulama_ayarlari['DEBUG_MODU']<\/code> gibi bir anahtara eri\u015fildi\u011finde, <code>ChainMap<\/code> \u00f6nce <code>kullanici_ayarlari<\/code>&#8216;na bakar, orada bulamazsa <code>ortam_ayarlari<\/code>&#8216;na ge\u00e7er ve bu \u015fekilde devam eder. Bu sayede, en \u00f6ncelikli ayar otomatik olarak se\u00e7ilir. <code>new_child()<\/code> metodu, mevcut bir <code>ChainMap<\/code>&#8216;in \u00fczerine yeni, daha y\u00fcksek \u00f6ncelikli bir katman eklemek i\u00e7in kullan\u0131l\u0131r. Bu, \u00f6zellikle fonksiyon \u00e7a\u011fr\u0131lar\u0131 s\u0131ras\u0131nda yerel de\u011fi\u015fkenlerin veya ge\u00e7ici ayarlar\u0131n ana yap\u0131land\u0131rmay\u0131 ge\u00e7ersiz k\u0131lmas\u0131 gereken durumlarda \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. <code>ChainMap<\/code>&#8216;e yap\u0131lan yazma i\u015flemleri (\u00f6rne\u011fin, <code>yeni_ayarlar_katmani['YENI_AYAR'] = 'deger'<\/code>), her zaman zincirdeki ilk (en \u00f6ncelikli) s\u00f6zl\u00fc\u011f\u00fc etkiler. Bu davran\u0131\u015f, genellikle istenen bir \u00f6zelliktir \u00e7\u00fcnk\u00fc daha d\u00fc\u015f\u00fck \u00f6ncelikli yap\u0131land\u0131rma katmanlar\u0131n\u0131n istemeden de\u011fi\u015ftirilmesini engeller. Bu \u00f6zellikleriyle <code>ChainMap<\/code>, \u00f6zellikle karma\u015f\u0131k yap\u0131land\u0131rma hiyerar\u015fileri, de\u011fi\u015fken kapsamlar\u0131 veya \u00e7ok katmanl\u0131 veri kaynaklar\u0131n\u0131 y\u00f6netirken kodunuzu sadele\u015ftiren ve hataya yatk\u0131nl\u0131\u011f\u0131 azaltan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/p>\n<h3>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131: ChainMap<\/h3>\n<p><code>ChainMap<\/code>&#8216;in <code>parents<\/code> \u00f6zniteli\u011fi, mevcut <code>ChainMap<\/code>&#8216;in kendisi hari\u00e7, zincirdeki di\u011fer t\u00fcm e\u015flemeleri i\u00e7eren yeni bir <code>ChainMap<\/code> d\u00f6nd\u00fcr\u00fcr. Bu, zincirdeki bir katman\u0131 kald\u0131rmak veya bir alt yap\u0131land\u0131rma g\u00f6r\u00fcn\u00fcm\u00fcne eri\u015fmek istedi\u011finizde faydal\u0131 olabilir. \u00d6rne\u011fin, <code>uygulama_ayarlari.parents<\/code> \u00e7a\u011fr\u0131s\u0131, <code>kullanici_ayarlari<\/code> d\u0131\u015f\u0131ndaki t\u00fcm ayarlar\u0131 i\u00e7eren yeni bir <code>ChainMap<\/code> d\u00f6nd\u00fcrecektir. Bu, belirli bir kapsamdan \u00e7\u0131karken veya bir ayar katman\u0131n\u0131 ge\u00e7ici olarak devre d\u0131\u015f\u0131 b\u0131rak\u0131rken olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. <code>ChainMap<\/code>&#8216;ler, Python&#8217;\u0131n i\u00e7 mekanizmalar\u0131nda, \u00f6zellikle fonksiyonlar\u0131n yerel ve genel kapsamlar\u0131n\u0131 y\u00f6netmek i\u00e7in de kullan\u0131l\u0131r. Bu, asl\u0131nda Python&#8217;\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131na dair bir pencere sunar ve kendi uygulamalar\u0131n\u0131zda benzer kapsam y\u00f6netimi problemlerini \u00e7\u00f6zerken size ilham verebilir. Dinamik olarak de\u011fi\u015fen yap\u0131land\u0131rma ihtiya\u00e7lar\u0131n\u0131z oldu\u011funda veya farkl\u0131 veri kaynaklar\u0131n\u0131 \u00f6ncelik s\u0131ras\u0131na g\u00f6re birle\u015ftirmeniz gerekti\u011finde, <code>ChainMap<\/code>, karma\u015f\u0131kl\u0131\u011f\u0131 azaltan ve kodunuzu daha mod\u00fcler hale getiren vazge\u00e7ilmez bir ara\u00e7t\u0131r.<\/p>\n<h2>UserDict: Kendi S\u00f6zl\u00fck Benzeri Veri Yap\u0131lar\u0131n\u0131z\u0131 Kolayca Olu\u015fturun<\/h2>\n<h3>UserDict Neden \u00d6nemlidir ve Do\u011frudan dict&#8217;ten Kal\u0131t\u0131m Almaktan Neden Daha \u0130yidir?<\/h3>\n<p>Python&#8217;da \u00f6zel bir s\u00f6zl\u00fck (dictionary) benzeri s\u0131n\u0131f olu\u015fturmak istedi\u011finizde, ilk akla gelen y\u00f6ntem genellikle do\u011frudan <code>dict<\/code> s\u0131n\u0131f\u0131ndan kal\u0131t\u0131m (inheritance) almakt\u0131r. Ancak, <code>dict<\/code> s\u0131n\u0131f\u0131ndan do\u011frudan kal\u0131t\u0131m almak, beklenmedik ve y\u00f6netilmesi zor davran\u0131\u015flara yol a\u00e7abilir. Bunun temel nedeni, <code>dict<\/code>&#8216;in baz\u0131 dahili metotlar\u0131n\u0131n (\u00f6rne\u011fin, <code>__init__<\/code>, <code>__setitem__<\/code>, <code>__getitem__<\/code>) birbirini \u00e7a\u011f\u0131rmas\u0131 ve bu metotlar\u0131 override (ge\u00e7ersiz k\u0131lma) etmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131zda sonsuz d\u00f6ng\u00fcler veya tutars\u0131z davran\u0131\u015flar gibi sorunlarla kar\u015f\u0131la\u015fabilmenizdir. \u00d6rne\u011fin, <code>__setitem__<\/code> metodunu ge\u00e7ersiz k\u0131ld\u0131\u011f\u0131n\u0131zda, <code>__init__<\/code> metodu da genellikle <code>__setitem__<\/code>&#8216;i \u00e7a\u011f\u0131rd\u0131\u011f\u0131 i\u00e7in, kendi \u00f6zel mant\u0131\u011f\u0131n\u0131z\u0131n hem ba\u015flatma s\u0131ras\u0131nda hem de normal atama s\u0131ras\u0131nda do\u011fru \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak zorla\u015f\u0131r. \u0130\u015fte <code>collections<\/code> mod\u00fcl\u00fcndeki <code>UserDict<\/code> s\u0131n\u0131f\u0131, bu t\u00fcr zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in tasarlanm\u0131\u015f g\u00fcvenli ve esnek bir alternatiftir. <code>UserDict<\/code>, asl\u0131nda dahili olarak ger\u00e7ek bir <code>dict<\/code> nesnesini (<code>data<\/code> \u00f6zniteli\u011fi alt\u0131nda) bar\u0131nd\u0131ran bir &#8220;sarmalay\u0131c\u0131&#8221; (wrapper) s\u0131n\u0131ft\u0131r. Bu tasar\u0131m sayesinde, <code>UserDict<\/code>&#8216;ten t\u00fcretti\u011finiz s\u0131n\u0131flarda <code>__setitem__<\/code> veya <code>__getitem__<\/code> gibi metotlar\u0131 g\u00fcvenli bir \u015fekilde ge\u00e7ersiz k\u0131labilir ve kendi \u00f6zel mant\u0131\u011f\u0131n\u0131z\u0131 uygulayabilirsiniz. Kendi mant\u0131\u011f\u0131n\u0131z\u0131 uygulad\u0131\u011f\u0131n\u0131zda, dahili <code>data<\/code> s\u00f6zl\u00fc\u011f\u00fcne do\u011frudan eri\u015ferek (<code>self.data[...]<\/code>) i\u015flemlerinizi ger\u00e7ekle\u015ftirebilirsiniz. Bu, <code>dict<\/code>&#8216;in karma\u015f\u0131k dahili yap\u0131s\u0131yla u\u011fra\u015fmak zorunda kalmadan, s\u00f6zl\u00fck benzeri bir davran\u0131\u015fa sahip, ancak kendi \u00f6zel \u00f6zelliklerinizi ve k\u0131s\u0131tlamalar\u0131n\u0131z\u0131 i\u00e7eren veri yap\u0131lar\u0131 olu\u015fturman\u0131z\u0131 sa\u011flar. \u00d6rne\u011fin, bir s\u00f6zl\u00fc\u011fe eklenen de\u011ferlerin belirli bir t\u00fcrde olmas\u0131n\u0131 zorunlu k\u0131lmak, belirli anahtarlar\u0131n her zaman var olmas\u0131n\u0131 sa\u011flamak veya bir \u00f6\u011fe her g\u00fcncellendi\u011finde ek bir i\u015flem (\u00f6rne\u011fin, loglama) yapmak istedi\u011finizde <code>UserDict<\/code> m\u00fckemmel bir \u00e7\u00f6z\u00fcmd\u00fcr. Bu yakla\u015f\u0131m, kodunuzu daha mod\u00fcler, hataya daha az yatk\u0131n ve bak\u0131m\u0131 daha kolay hale getirir. <code>UserDict<\/code>, <code>UserList<\/code> ve <code>UserString<\/code> ile birlikte, Python&#8217;\u0131n yerle\u015fik tiplerini g\u00fcvenli ve \u00f6ng\u00f6r\u00fclebilir bir \u015fekilde geni\u015fletmek i\u00e7in tasarlanm\u0131\u015f &#8220;kullan\u0131c\u0131 tan\u0131ml\u0131&#8221; sarmalay\u0131c\u0131 s\u0131n\u0131flar ailesinin bir par\u00e7as\u0131d\u0131r. Bu sayede, Python&#8217;\u0131n g\u00fc\u00e7l\u00fc yerle\u015fik veri yap\u0131lar\u0131n\u0131 temel alarak kendi \u00f6zel ihtiya\u00e7lar\u0131n\u0131za uygun, \u00f6zelle\u015ftirilmi\u015f veri yap\u0131lar\u0131 olu\u015fturabilirsiniz.<\/p>\n<h3>Vaka Analizi: Validasyonlu Bir Ayar S\u00f6zl\u00fc\u011f\u00fc<\/h3>\n<p>Bir uygulaman\u0131n ayarlar\u0131n\u0131 tutan bir s\u00f6zl\u00fck olu\u015fturdu\u011funuzu ve bu s\u00f6zl\u00fc\u011fe eklenen baz\u0131 anahtarlar\u0131n belirli veri tiplerinde olmas\u0131n\u0131 veya belirli ko\u015fullar\u0131 kar\u015f\u0131lamas\u0131n\u0131 zorunlu k\u0131lmak istedi\u011finizi d\u00fc\u015f\u00fcnelim. \u00d6rne\u011fin, <code>port<\/code> ayar\u0131n\u0131n bir tam say\u0131 (integer) olmas\u0131 ve 1 ile 65535 aras\u0131nda olmas\u0131 gerekti\u011fini varsayal\u0131m. <code>UserDict<\/code> kullanarak bu t\u00fcr bir validasyon (do\u011frulama) mekanizmas\u0131n\u0131 kolayca uygulayabiliriz.<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom collections import UserDict\n\nclass AyarS\u00f6zl\u00fc\u011f\u00fc(UserDict):\n    \"\"\"\n    Belirli anahtarlar i\u00e7in de\u011fer tiplerini ve aral\u0131klar\u0131n\u0131 do\u011frulayan\n    \u00f6zel bir s\u00f6zl\u00fck s\u0131n\u0131f\u0131.\n    \"\"\"\n    def __setitem__(self, key, value):\n        # 'port' anahtar\u0131 i\u00e7in validasyon\n        if key == 'port':\n            if not isinstance(value, int):\n                raise TypeError(\"Port de\u011feri bir tam say\u0131 olmal\u0131d\u0131r.\")\n            if not (1 <= value <= 65535):\n                raise ValueError(\"Port de\u011feri 1 ile 65535 aras\u0131nda olmal\u0131d\u0131r.\")\n        \n        # 'debug_mode' anahtar\u0131 i\u00e7in validasyon\n        if key == 'debug_mode':\n            if not isinstance(value, bool):\n                raise TypeError(\"Debug modu de\u011feri boolean olmal\u0131d\u0131r.\")\n\n        # Di\u011fer t\u00fcm anahtarlar i\u00e7in varsay\u0131lan dict davran\u0131\u015f\u0131n\u0131 kullan\n        # UserDict'in dahili data s\u00f6zl\u00fc\u011f\u00fcne do\u011frudan atama yapar\u0131z.\n        self.data[key] = value\n\n    def __getitem__(self, key):\n        # \u00d6zel bir getirme mant\u0131\u011f\u0131 eklemek isterseniz burada yapabilirsiniz.\n        # \u00d6rne\u011fin, belirli bir anahtar yoksa varsay\u0131lan bir de\u011fer d\u00f6nd\u00fcrmek.\n        # \u015eimdilik varsay\u0131lan davran\u0131\u015f\u0131 kullan\u0131yoruz.\n        return self.data[key]\n\n# Ayar s\u00f6zl\u00fc\u011f\u00fcm\u00fcz\u00fc olu\u015ftural\u0131m\nayarlar = AyarS\u00f6zl\u00fc\u011f\u00fc()\n\nprint(\"Ayarlar\u0131 atama:\")\ntry:\n    ayarlar['app_name'] = 'MyWebApp'\n    ayarlar['port'] = 8080\n    ayarlar['debug_mode'] = True\n    print(f\"Ba\u015far\u0131l\u0131 ayarlar: {ayarlar}\")\n\n    print(\"\\n--- Hatal\u0131 Atamalar ---\")\n    # Hatal\u0131 port tipi\n    ayarlar['port'] = \"sekseksen\" \nexcept (TypeError, ValueError) as e:\n    print(f\"Hata yakaland\u0131: {e}\")\n\ntry:\n    # Hatal\u0131 port aral\u0131\u011f\u0131\n    ayarlar['port'] = 70000\nexcept (TypeError, ValueError) as e:\n    print(f\"Hata yakaland\u0131: {e}\")\n\ntry:\n    # Hatal\u0131 debug_mode tipi\n    ayarlar['debug_mode'] = \"True\"\nexcept (TypeError, ValueError) as e:\n    print(f\"Hata yakaland\u0131: {e}\")\n\nprint(f\"\\nSon ge\u00e7erli ayarlar: {ayarlar}\")\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Bu \u00f6rnekte, <code>AyarS\u00f6zl\u00fc\u011f\u00fc<\/code> s\u0131n\u0131f\u0131n\u0131 <code>UserDict<\/code>'ten t\u00fcrettik ve <code>__setitem__<\/code> metodunu ge\u00e7ersiz k\u0131ld\u0131k. Bu sayede, bir anahtara de\u011fer atanmadan \u00f6nce \u00f6zel do\u011frulama mant\u0131\u011f\u0131m\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rabiliyoruz. E\u011fer atanan de\u011fer belirlenen ko\u015fullar\u0131 sa\u011flamazsa (\u00f6rne\u011fin, <code>port<\/code> bir tam say\u0131 de\u011filse veya ge\u00e7erli bir aral\u0131kta de\u011filse), bir <code>TypeError<\/code> veya <code>ValueError<\/code> hatas\u0131 y\u00fckseltilir. Bu yakla\u015f\u0131m, uygulaman\u0131z\u0131n yap\u0131land\u0131rma verilerinin her zaman do\u011fru formatta ve ge\u00e7erli aral\u0131klarda olmas\u0131n\u0131 garanti eder, bu da hatalar\u0131 \u00f6nler ve uygulaman\u0131n kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. <code>UserDict<\/code>'in dahili <code>data<\/code> \u00f6zniteli\u011fi arac\u0131l\u0131\u011f\u0131yla ger\u00e7ek s\u00f6zl\u00fc\u011fe eri\u015fim, kendi mant\u0131\u011f\u0131n\u0131z\u0131 uygularken <code>dict<\/code>'in temel davran\u0131\u015flar\u0131n\u0131 bozmadan \u00e7al\u0131\u015fman\u0131z\u0131 sa\u011flar. Bu, do\u011frudan <code>dict<\/code>'ten kal\u0131t\u0131m al\u0131rken ortaya \u00e7\u0131kabilecek karma\u015f\u0131k sorunlardan ka\u00e7\u0131nman\u0131z\u0131 sa\u011flar. Benzer \u015fekilde, <code>__getitem__<\/code> metodunu da ge\u00e7ersiz k\u0131larak, bir anahtara eri\u015fildi\u011finde \u00f6zel bir i\u015flem yapabilir veya anahtar bulunamad\u0131\u011f\u0131nda \u00f6zel bir varsay\u0131lan de\u011fer d\u00f6nd\u00fcrebilirsiniz. <code>UserDict<\/code>, bu t\u00fcr \u00f6zelle\u015ftirilmi\u015f s\u00f6zl\u00fck benzeri veri yap\u0131lar\u0131 olu\u015fturmak i\u00e7in g\u00fcvenli, esnek ve Pythonik bir yol sunar.<\/p>\n<h3>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131: UserDict<\/h3>\n<p><code>UserDict<\/code>'in sundu\u011fu esneklik, sadece validasyonla s\u0131n\u0131rl\u0131 de\u011fildir. \u00d6rne\u011fin, bir anahtar silindi\u011finde (<code>__delitem__<\/code>) veya bir \u00f6\u011feye eri\u015fildi\u011finde (<code>__getitem__<\/code>) loglama yapmak, bir \u00f6nbellek mekanizmas\u0131 uygulamak veya belirli anahtarlara eri\u015fimi k\u0131s\u0131tlamak gibi \u00e7e\u015fitli senaryolarda kullan\u0131labilir. Benzer \u015fekilde, <code>collections<\/code> mod\u00fcl\u00fcnde bulunan <code>UserList<\/code> ve <code>UserString<\/code> s\u0131n\u0131flar\u0131 da, s\u0131ras\u0131yla Python'\u0131n yerle\u015fik <code>list<\/code> ve <code>str<\/code> tiplerini g\u00fcvenli bir \u015fekilde geni\u015fletmek i\u00e7in kullan\u0131labilir. Bu s\u0131n\u0131flar, kendi \u00f6zel liste veya string davran\u0131\u015flar\u0131n\u0131z\u0131 uygularken, temel veri yap\u0131s\u0131n\u0131n karma\u015f\u0131k dahili mekanizmalar\u0131yla do\u011frudan u\u011fra\u015fmaktan sizi kurtar\u0131r. \u00d6rne\u011fin, <code>UserList<\/code>'ten t\u00fcreterek, bir listeye her eleman eklendi\u011finde veya \u00e7\u0131kar\u0131ld\u0131\u011f\u0131nda ek bir i\u015flem yapan bir \"izlenen liste\" (monitored list) olu\u015fturabilirsiniz. Bu \"kullan\u0131c\u0131 tan\u0131ml\u0131\" sarmalay\u0131c\u0131 s\u0131n\u0131flar, Python'\u0131n nesne y\u00f6nelimli programlama (OOP) yeteneklerini kullanarak, mevcut veri yap\u0131lar\u0131n\u0131n \u00f6tesine ge\u00e7menizi ve uygulaman\u0131z\u0131n \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re tasarlanm\u0131\u015f, g\u00fc\u00e7l\u00fc ve hataya dayan\u0131kl\u0131 veri yap\u0131lar\u0131 olu\u015fturman\u0131z\u0131 sa\u011flar.<\/p>\n<h2>Sonu\u00e7: collections Mod\u00fcl\u00fcn\u00fcn G\u00fcc\u00fcn\u00fc Ke\u015ffetmek<\/h2>\n<p>Bu makalede, Python'\u0131n <code>collections<\/code> mod\u00fcl\u00fcn\u00fcn genellikle g\u00f6z ard\u0131 edilen ancak son derece g\u00fc\u00e7l\u00fc d\u00f6rt arac\u0131n\u0131 derinlemesine inceledik: <code>namedtuple<\/code>, <code>deque<\/code>, <code>ChainMap<\/code> ve <code>UserDict<\/code>. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, bu ara\u00e7lar, basit <code>list<\/code> ve <code>dict<\/code> yap\u0131lar\u0131n\u0131n yetersiz kald\u0131\u011f\u0131 veya performans darbo\u011fazlar\u0131na yol a\u00e7t\u0131\u011f\u0131 ger\u00e7ek d\u00fcnya senaryolar\u0131nda geli\u015ftiricilere somut avantajlar sunar. <code>namedtuple<\/code> ile verilerinizi daha anlaml\u0131 ve hafif nesneler halinde temsil ederek kodunuzun okunabilirli\u011fini art\u0131rabilir, <code>deque<\/code> ile y\u00fcksek performansl\u0131 kuyruk ve y\u0131\u011f\u0131n i\u015flemleri ger\u00e7ekle\u015ftirerek zaman karma\u015f\u0131kl\u0131\u011f\u0131 sorunlar\u0131n\u0131n \u00fcstesinden gelebilirsiniz. <code>ChainMap<\/code>, \u00e7ok katmanl\u0131 yap\u0131land\u0131rma ve kapsam y\u00f6netimini basitle\u015ftirirken, <code>UserDict<\/code> ise kendi \u00f6zel s\u00f6zl\u00fck benzeri veri yap\u0131lar\u0131n\u0131z\u0131 g\u00fcvenli ve esnek bir \u015fekilde olu\u015fturman\u0131za olanak tan\u0131r. Her bir arac\u0131n kendine \u00f6zg\u00fc kullan\u0131m durumlar\u0131 ve faydalar\u0131 bulunmaktad\u0131r ve do\u011fru yerde kullan\u0131ld\u0131\u011f\u0131nda, kodunuzu daha verimli, daha anla\u015f\u0131l\u0131r ve bak\u0131m\u0131 daha kolay hale getirebilirler. Python'\u0131n standart k\u00fct\u00fcphanesi, geli\u015ftiricilere inan\u0131lmaz bir ara\u00e7 yelpazesi sunar ve <code>collections<\/code> mod\u00fcl\u00fc de bu zenginli\u011fin \u00f6nemli bir par\u00e7as\u0131d\u0131r. Bu mod\u00fcl\u00fcn sundu\u011fu di\u011fer ara\u00e7lar\u0131 ke\u015ffetmek ve projelerinizde denemek, \u015f\u00fcphesiz Python becerilerinizi bir \u00fcst seviyeye ta\u015f\u0131yacakt\u0131r. Unutmay\u0131n, do\u011fru veri yap\u0131s\u0131n\u0131 se\u00e7mek, uygulaman\u0131z\u0131n performans\u0131 ve genel kalitesi \u00fczerinde do\u011frudan bir etkiye sahiptir. Bu \"gizli cevherleri\" ke\u015ffetmek, kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131z bir\u00e7ok programlama problemine daha zarif ve etkili \u00e7\u00f6z\u00fcmler bulman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<p><strong>1. collections mod\u00fcl\u00fc neden Python'\u0131n standart k\u00fct\u00fcphanesinde yer al\u0131yor?<\/strong><\/p>\n<p><code>collections<\/code> mod\u00fcl\u00fc, Python'\u0131n standart k\u00fct\u00fcphanesinde yer al\u0131r \u00e7\u00fcnk\u00fc yayg\u0131n programlama g\u00f6revleri i\u00e7in \u00f6zel, optimize edilmi\u015f veri yap\u0131lar\u0131 sunar. Bu yap\u0131lar, yerle\u015fik <code>list<\/code>, <code>dict<\/code> ve <code>tuple<\/code> gibi tiplerin yeteneklerini geni\u015fleterek, geli\u015ftiricilerin daha verimli, okunabilir ve y\u00f6netilebilir kod yazmalar\u0131na olanak tan\u0131r. Mod\u00fcl\u00fcn standart k\u00fct\u00fcphanede olmas\u0131, ek kurulum gerektirmeden bu g\u00fc\u00e7l\u00fc ara\u00e7lara eri\u015fim sa\u011flar ve Python ekosisteminde tutarl\u0131l\u0131\u011f\u0131 te\u015fvik eder.<\/p>\n<p><strong>2. Bu ara\u00e7lar ne zaman kullan\u0131lmal\u0131, ne zaman kullan\u0131lmamal\u0131?<\/strong><\/p>\n<ul>\n<li><code>namedtuple<\/code>: Verileri hafif, de\u011fi\u015fmez ve anlaml\u0131 alan adlar\u0131na sahip nesneler olarak temsil etmek istedi\u011finizde kullan\u0131n (\u00f6rn. veritaban\u0131 kay\u0131tlar\u0131, API yan\u0131tlar\u0131). Karma\u015f\u0131k davran\u0131\u015flar veya metotlar gerektiren durumlarda tam te\u015fekk\u00fcll\u00fc bir s\u0131n\u0131f (class) kullanmak daha uygun olabilir.<\/li>\n<li><code>deque<\/code>: Kuyruk (queue) veya y\u0131\u011f\u0131n (stack) benzeri veri yap\u0131lar\u0131na ihtiyac\u0131n\u0131z oldu\u011funda ve listenin her iki ucundan da h\u0131zl\u0131 ekleme\/\u00e7\u0131karma i\u015flemleri (O(1)) kritik oldu\u011funda kullan\u0131n. Sadece listenin sonundan i\u015flem yap\u0131yorsan\u0131z standart <code>list<\/code> yeterli olabilir.<\/li>\n<li><code>ChainMap<\/code>: Birden fazla s\u00f6zl\u00fc\u011f\u00fc belirli bir \u00f6ncelik s\u0131ras\u0131na g\u00f6re tek bir mant\u0131ksal g\u00f6r\u00fcn\u00fcmde birle\u015ftirmek istedi\u011finizde (\u00f6rn. uygulama ayarlar\u0131, kapsam y\u00f6netimi) kullan\u0131n. Sadece iki s\u00f6zl\u00fc\u011f\u00fc bir kez birle\u015ftirip daha sonra de\u011fi\u015ftirmeyecekseniz, basit bir <code>{<strong>dict1, <\/strong>dict2}<\/code> birle\u015fimi yeterli olabilir.<\/li>\n<li><code>UserDict<\/code>: Python'\u0131n yerle\u015fik <code>dict<\/code> s\u0131n\u0131f\u0131n\u0131 geni\u015fleterek \u00f6zel davran\u0131\u015flar (\u00f6rn. validasyon, loglama) eklemek istedi\u011finizde, ancak <code>dict<\/code>'ten do\u011frudan kal\u0131t\u0131m alman\u0131n getirdi\u011fi karma\u015f\u0131k sorunlardan ka\u00e7\u0131nmak istedi\u011finizde kullan\u0131n. Sadece birka\u00e7 k\u00fc\u00e7\u00fck de\u011fi\u015fiklik yapacaksan\u0131z, basit bir fonksiyon veya s\u0131n\u0131f i\u00e7inde <code>dict<\/code> kullanmak yeterli olabilir.<\/li>\n<\/ul>\n<p><strong>3. Performans a\u00e7\u0131s\u0131ndan ne gibi avantajlar sunarlar?<\/strong><\/p>\n<p><code>collections<\/code> mod\u00fcl\u00fcndeki ara\u00e7lar, belirli kullan\u0131m durumlar\u0131 i\u00e7in optimize edilmi\u015f veri yap\u0131lar\u0131 sunarak \u00f6nemli performans avantajlar\u0131 sa\u011flayabilir:<\/p>\n<ul>\n<li><code>namedtuple<\/code>: Tam te\u015fekk\u00fcll\u00fc bir s\u0131n\u0131fa g\u00f6re daha az bellek kullan\u0131r ve daha h\u0131zl\u0131 eri\u015fim sa\u011flar.<\/li>\n<li><code>deque<\/code>: Listenin ba\u015f\u0131ndan eleman ekleme ve \u00e7\u0131karma i\u015flemlerini O(1) zaman karma\u015f\u0131kl\u0131\u011f\u0131nda ger\u00e7ekle\u015ftirir, oysa standart <code>list<\/code> i\u00e7in bu O(n)'dir. Bu, b\u00fcy\u00fck veri setleriyle veya y\u00fcksek frekansl\u0131 i\u015flemlerle \u00e7al\u0131\u015f\u0131rken kritik bir performans fark\u0131 yarat\u0131r.<\/li>\n<li><code>ChainMap<\/code>: S\u00f6zl\u00fckleri birle\u015ftirirken kopyalar\u0131n\u0131 olu\u015fturmaz, orijinal s\u00f6zl\u00fcklere referans verir. Bu, bellek t\u00fcketimini azalt\u0131r ve b\u00fcy\u00fck s\u00f6zl\u00fcklerle \u00e7al\u0131\u015f\u0131rken performans\u0131 art\u0131r\u0131r.<\/li>\n<li><code>UserDict<\/code>: Performans avantaj\u0131ndan ziyade, g\u00fcvenli ve \u00f6ng\u00f6r\u00fclebilir bir \u015fekilde <code>dict<\/code> davran\u0131\u015flar\u0131n\u0131 geni\u015fletme esnekli\u011fi sunarak geli\u015ftirme s\u00fcrecindeki hatalar\u0131 ve karma\u015f\u0131kl\u0131\u011f\u0131 azalt\u0131r.<\/li>\n<\/ul>\n<p><strong>4. Bu ara\u00e7lar Python'\u0131n hangi s\u00fcr\u00fcmlerinde bulunur?<\/strong><\/p>\n<p>Bu makalede bahsedilen t\u00fcm ara\u00e7lar (<code>namedtuple<\/code>, <code>deque<\/code>, <code>ChainMap<\/code>, <code>UserDict<\/code>) Python 2.6'dan itibaren <code>collections<\/code> mod\u00fcl\u00fcnde mevcuttur. <code>ChainMap<\/code> ise Python 3.3 ile eklenmi\u015ftir. Bu nedenle, modern Python s\u00fcr\u00fcmlerinin (Python 3.x) herhangi birinde bu ara\u00e7lar\u0131 g\u00fcvenle kullanabilirsiniz.<\/p>\n<p><strong>5. collections mod\u00fcl\u00fcnde ba\u015fka hangi ara\u00e7lar var?<\/strong><\/p>\n<p><code>collections<\/code> mod\u00fcl\u00fc, burada bahsedilenler d\u0131\u015f\u0131nda da bir\u00e7ok faydal\u0131 ara\u00e7 i\u00e7erir. Bunlardan baz\u0131lar\u0131:<\/p>\n<ul>\n<li><code>defaultdict<\/code>: Anahtar bulunmad\u0131\u011f\u0131nda varsay\u0131lan bir de\u011fer d\u00f6nd\u00fcren s\u00f6zl\u00fck.<\/li>\n<li><code>Counter<\/code>: Bir iterable'daki \u00f6\u011felerin frekans\u0131n\u0131 sayan \u00f6zel bir s\u00f6zl\u00fck.<\/li>\n<li><code>OrderedDict<\/code>: Elemanlar\u0131n eklenme s\u0131ras\u0131n\u0131 koruyan bir s\u00f6zl\u00fck (Python 3.7+ s\u00fcr\u00fcmlerinde standart <code>dict<\/code> de bunu yapar, ancak <code>OrderedDict<\/code>'in kendine \u00f6zg\u00fc baz\u0131 metotlar\u0131 hala vard\u0131r).<\/li>\n<li><code>UserList<\/code> ve <code>UserString<\/code>: S\u0131ras\u0131yla <code>list<\/code> ve <code>str<\/code> tiplerini g\u00fcvenli bir \u015fekilde geni\u015fletmek i\u00e7in <code>UserDict<\/code>'e benzer sarmalay\u0131c\u0131 s\u0131n\u0131flar.<\/li>\n<\/ul>\n<p>#Python #collectionsMod\u00fcl\u00fc #VeriYap\u0131lar\u0131 #Programlama #Geli\u015ftirme<\/p>\n","protected":false},"excerpt":{"rendered":"Python&#8217;da veri yap\u0131lar\u0131, programlaman\u0131n temel ta\u015flar\u0131ndan biridir.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1403],"tags":[],"class_list":{"0":"post-42549","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Python&#039;\u0131n collections Mod\u00fcl\u00fc: defaultdict ve Counter&#039;\u0131n \u00d6tesindeki D\u00f6rt Gizli Cevher - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python&#039;\u0131n collections Mod\u00fcl\u00fc: defaultdict ve Counter&#039;\u0131n \u00d6tesindeki D\u00f6rt Gizli Cevher\" \/>\n<meta property=\"og:description\" content=\"Python&#039;da veri yap\u0131lar\u0131, programlaman\u0131n temel ta\u015flar\u0131ndan biridir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-14T18:10:20+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python&#8217;\u0131n collections Mod\u00fcl\u00fc: defaultdict ve Counter&#8217;\u0131n \u00d6tesindeki D\u00f6rt Gizli Cevher\",\"datePublished\":\"2026-06-14T18:10:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/\"},\"wordCount\":4802,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/\",\"name\":\"Python'\u0131n collections Mod\u00fcl\u00fc: defaultdict ve Counter'\u0131n \u00d6tesindeki D\u00f6rt Gizli Cevher - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-06-14T18:10:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python&#8217;\u0131n collections Mod\u00fcl\u00fc: defaultdict ve Counter&#8217;\u0131n \u00d6tesindeki D\u00f6rt Gizli Cevher\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Python'\u0131n collections Mod\u00fcl\u00fc: defaultdict ve Counter'\u0131n \u00d6tesindeki D\u00f6rt Gizli Cevher - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/","og_locale":"tr_TR","og_type":"article","og_title":"Python'\u0131n collections Mod\u00fcl\u00fc: defaultdict ve Counter'\u0131n \u00d6tesindeki D\u00f6rt Gizli Cevher","og_description":"Python'da veri yap\u0131lar\u0131, programlaman\u0131n temel ta\u015flar\u0131ndan biridir.","og_url":"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-06-14T18:10:20+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python&#8217;\u0131n collections Mod\u00fcl\u00fc: defaultdict ve Counter&#8217;\u0131n \u00d6tesindeki D\u00f6rt Gizli Cevher","datePublished":"2026-06-14T18:10:20+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/"},"wordCount":4802,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/","url":"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/","name":"Python'\u0131n collections Mod\u00fcl\u00fc: defaultdict ve Counter'\u0131n \u00d6tesindeki D\u00f6rt Gizli Cevher - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-06-14T18:10:20+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/pythonin-collections-modulu-defaultdict-ve-counterin-otesindeki-dort-gizli-cevher\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python&#8217;\u0131n collections Mod\u00fcl\u00fc: defaultdict ve Counter&#8217;\u0131n \u00d6tesindeki D\u00f6rt Gizli Cevher"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42549","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=42549"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42549\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=42549"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=42549"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=42549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}