[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-python-fonksiyonlari-parametreler-varsayilanlar-argskwargs-lambda-ve-bas":3},{"dataItem":4,"heading":36,"metaData":38,"schema":81},["Reactive",5],{"id":6,"title":7,"summary":8,"content":9,"seo_title":10,"seo_description":11,"seo_keywords":12,"slug":13,"createdAt":14,"updatedAt":14,"blog_categories":15,"authors":19,"image":24,"thumb":25,"image_webp":26,"thumb_webp":27,"rating":28,"heading_title":7,"heading_sub_title":17,"readingTime":29,"url":34,"comments":35,"meta_cover":24},21484,"Python Fonksiyonları: Parametreler, Varsayılanlar, *args/**kwargs, Lambda ve Bas","Bu rehber, Python fonksiyonlarında parametre türlerini (pozisyonel, keyword, positional-only, keyword-only, *args, **kwargs), varsayılan argümanların değerlendirilme zamanını ve mutable default tuzağını, lambda kullanımını ve functools.wraps ile basit dekoratör yazımını örneklerle açıklar.","\u003Ch2>Python fonksiyonlarını doğru modellemek neden önemli?\u003C/h2>\n\u003Cp>Python’da fonksiyonlar, kodu okunabilir, tekrar kullanılabilir ve test edilebilir hale getiren temel yapı taşlarından biridir. Günlük pratikte en çok kafa karışıklığı yaratan konular genellikle şunlardır: parametrelerin nasıl geçirildiği (pozisyonel mi, isimle mi?), varsayılan argümanların ne zaman “oluşturulduğu”, \u003Cem>*args\u003C/em>/\u003Cem>**kwargs\u003C/em> ile esnek imza tasarımı, küçük yardımcı fonksiyonlar için \u003Cem>lambda\u003C/em> kullanımı ve dekoratörlerle (dekoratör/decorator) fonksiyon sarmalama.\u003C/p>\n\u003Cp>Bu yazı, resmi Python dokümantasyonundaki kuralları temel alır (özellikle fonksiyon tanımlama ve parametre davranışı) ve pratik örneklerle pekiştirir. Ana referans: Python Tutorial’daki “Defining Functions / More on Defining Functions” bölümleri (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#defining-functions\">S1\u003C/a>) ve dekoratörlerde metadata korumak için \u003Cem>functools.wraps\u003C/em> dokümantasyonu (\u003Ca href=\"https://docs.python.org/3/library/functools.html\">S4\u003C/a>). Stil tarafında PEP rehberleriyle uyumlu öneriler bulacaksınız (\u003Ca href=\"https://peps.python.org/pep-0008/\">S2\u003C/a>).\u003C/p>\n\u003Chr>\n\u003Ch2>1) Fonksiyon tanımı ve temel parametre türleri\u003C/h2>\n\u003Cp>En temel haliyle Python fonksiyonu \u003Cstrong>def\u003C/strong> ile tanımlanır ve parametreler parantez içinde belirtilir. Python, argümanları iki ana yoldan alır: \u003Cstrong>pozisyonel\u003C/strong> (sıraya göre) ve \u003Cstrong>keyword\u003C/strong> (isim vererek). Resmi dokümantasyon, fonksiyonların bu çağrı modelini ve farklı parametre tiplerini sistematik olarak açıklar (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#defining-functions\">S1\u003C/a>).\u003C/p>\n\u003Ch3>Pozisyonel vs keyword argümanlar\u003C/h3>\n\u003Cp>Aşağıdaki örnek, aynı fonksiyonun hem pozisyonel hem de keyword argümanlarla çağrılabileceğini gösterir:\u003C/p>\n\u003Cblockquote>\n\u003Cstrong>Kod:\u003C/strong>\u003Cbr>\u003Cbr>\n\ndef greet(name, greeting):\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;return f\"{greeting}, {name}!\"\u003Cbr>\u003Cbr>\n\ngreet(\"Ada\", \"Merhaba\")\u003Cbr>\ngreet(name=\"Ada\", greeting=\"Merhaba\")\u003Cbr>\ngreet(\"Ada\", greeting=\"Merhaba\")\u003Cbr>\n\u003C/blockquote>\n\u003Cp>Okunabilirlik açısından, özellikle birden çok parametre olduğunda keyword argümanlar çağrının “kendini anlatmasını” sağlar.\u003C/p>\n\u003Ch3>Parametre imzasının genel sırası (model)\u003C/h3>\n\u003Cp>Python, fonksiyon imzasında parametrelerin belli bir düzenini destekler. Dokümantasyonda bu parçaların birlikte nasıl çalıştığı anlatılır (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#defining-functions\">S1\u003C/a>). Pratik bir model olarak şu sırayı düşünün:\u003C/p>\n\u003Cul>\n  \u003Cli>\u003Cstrong>positional-only\u003C/strong> (varsa) \u003Cem>/\u003C/em>\u003C/li>\n  \u003Cli>\u003Cstrong>positional-or-keyword\u003C/strong>\u003C/li>\n  \u003Cli>\u003Cstrong>*args\u003C/strong> (varsa)\u003C/li>\n  \u003Cli>\u003Cstrong>keyword-only\u003C/strong> (varsa) \u003Cem>*\u003C/em> sonrası\u003C/li>\n  \u003Cli>\u003Cstrong>**kwargs\u003C/strong> (varsa)\u003C/li>\n\u003C/ul>\n\u003Cp>Her projede positional-only kullanmanız gerekmez; ama kütüphane API’sı tasarlarken (özellikle geriye dönük uyumluluk için) işe yarayabilir.\u003C/p>\n\u003Ch3>Positional-only (/) örneği (Python 3.8+)\u003C/h3>\n\u003Cp>\u003Cem>/\u003C/em> işareti, kendisinden önce gelen parametrelerin \u003Cstrong>yalnızca pozisyonel\u003C/strong> verilebileceğini ifade eder (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#defining-functions\">S1\u003C/a>):\u003C/p>\n\u003Cblockquote>\n\u003Cstrong>Kod:\u003C/strong>\u003Cbr>\u003Cbr>\n\ndef f(a, b, /, c, *, d):\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;return a, b, c, d\u003Cbr>\u003Cbr>\n\nf(1, 2, 3, d=4)\u003Cbr>\n# f(a=1, b=2, c=3, d=4)  # a ve b positional-only olduğu için geçersiz\u003Cbr>\n# f(1, 2, 3, 4)          # d keyword-only olduğu için geçersiz\u003Cbr>\n\u003C/blockquote>\n\u003Ch3>Keyword-only parametreler: Çağrıyı daha net yapmak\u003C/h3>\n\u003Cp>Fonksiyonun bazı parametrelerinin \u003Cstrong>mutlaka isimle\u003C/strong> verilmesini istiyorsanız, imzada \u003Cstrong>*\u003C/strong> kullanarak onları keyword-only yapabilirsiniz (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#defining-functions\">S1\u003C/a>).\u003C/p>\n\u003Cblockquote>\n\u003Cstrong>Kod:\u003C/strong>\u003Cbr>\u003Cbr>\n\ndef connect(host, port, *, timeout=10):\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;return f\"Connecting to {host}:{port} with timeout={timeout}\"\u003Cbr>\u003Cbr>\n\nconnect(\"example.com\", 443, timeout=5)\u003Cbr>\n# connect(\"example.com\", 443, 5)  # timeout isim verilmeden geçilemez\u003Cbr>\n\u003C/blockquote>\n\u003Cp>Bu yaklaşım, özellikle “üçüncü parametre neydi?” türü karışıklıkları azaltır.\u003C/p>\n\u003Chr>\n\u003Ch2>2) Varsayılan (default) argümanlar ve en yaygın tuzak\u003C/h2>\n\u003Cp>Varsayılan değerler, fonksiyon çağrısında parametre verilmezse kullanılacak değerleri tanımlar. Kritik detay: \u003Cstrong>varsayılan argüman ifadeleri, fonksiyon tanımlandığı anda değerlendirilir\u003C/strong>; her çağrıda tekrar “sıfırdan” oluşturulmaz (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#defining-functions\">S1\u003C/a>). Bu kural, özellikle \u003Cstrong>mutable\u003C/strong> (değiştirilebilir) tiplerde beklenmedik sonuçlara yol açabilir.\u003C/p>\n\u003Ch3>Mutable default tuzağı: Liste/dict’i doğrudan default yapmayın\u003C/h3>\n\u003Cp>Mutable varsayılanların paylaşılan duruma neden olabileceği sık görülen bir durumdur; yaygın çözüm \u003Cstrong>None\u003C/strong> kullanıp içeride yeni nesne üretmektir (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#defining-functions\">S1\u003C/a>, \u003Ca href=\"https://realpython.com/args-and-kwargs/\">S3\u003C/a>).\u003C/p>\n\u003Cblockquote>\n\u003Cstrong>Kod:\u003C/strong>\u003Cbr>\u003Cbr>\n\n# Kaçınılması önerilen kullanım\u003Cbr>\ndef add_item(item, items=[]):\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;items.append(item)\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;return items\u003Cbr>\u003Cbr>\n\n# Önerilen kalıp\u003Cbr>\ndef add_item_safe(item, items=None):\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;if items is None:\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;items = []\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;items.append(item)\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;return items\u003Cbr>\n\u003C/blockquote>\n\u003Cp>\u003Cstrong>Ne zaman sorun olur?\u003C/strong> Fonksiyon, çağrılar arasında default listedeki değişiklikleri “hatırladığı” için. Bu davranış her zaman problem olmayabilir; ancak çoğu iş kodunda istenmeyen sürprizlere yol açtığından “None + içeride oluştur” kalıbı daha öngörülebilirdir.\u003C/p>\n\u003Ch3>Varsayılanların iyi kullanımı: API ergonomisi\u003C/h3>\n\u003Cp>Varsayılanlar, fonksiyonun “kolay kullanım” sürümünü sağlar. İyi bir default seti belirlerken:\u003C/p>\n\u003Cul>\n  \u003Cli>En sık kullanılan senaryoyu kolaylaştırın.\u003C/li>\n  \u003Cli>Yan etkisiz (immutable) değerleri tercih edin: \u003Cem>None, 0, 1, True/False, \"\"\u003C/em> gibi.\u003C/li>\n  \u003Cli>İş mantığına göre keyword-only default’lar (ör. \u003Cem>timeout=\u003C/em>) çağrıyı okunur kılar.\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Ch2>3) *args ve **kwargs: Esnek ama kontrollü imza tasarımı\u003C/h2>\n\u003Cp>\u003Cem>*args\u003C/em> bilinmeyen sayıda pozisyonel argümanı, \u003Cem>**kwargs\u003C/em> ise bilinmeyen sayıda keyword argümanını yakalamanızı sağlar (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#defining-functions\">S1\u003C/a>). Fonksiyonun içinde \u003Cstrong>args bir tuple\u003C/strong>, \u003Cstrong>kwargs ise bir dict\u003C/strong> gibi davranır (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#defining-functions\">S1\u003C/a>). Bu özellik adaptör fonksiyonlar ve sarmalayıcılar (wrapper) için kullanışlıdır; ancak her şeyi \u003Cem>**kwargs\u003C/em> içine toplamak okunabilirliği düşürebilir. Mümkünse önce açık isimli parametreleri tercih etmek iyi bir pratiktir (\u003Ca href=\"https://realpython.com/args-and-kwargs/\">S3\u003C/a>).\u003C/p>\n\u003Ch3>*args örneği: Birden çok değeri toplamak\u003C/h3>\n\u003Cblockquote>\n\u003Cstrong>Kod:\u003C/strong>\u003Cbr>\u003Cbr>\n\ndef total(*numbers):\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;s = 0\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;for n in numbers:\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s += n\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;return s\u003Cbr>\u003Cbr>\n\ntotal(1, 2, 3)\u003Cbr>\ntotal(10)\u003Cbr>\n\u003C/blockquote>\n\u003Ch3>**kwargs örneği: Opsiyonel ayarları yakalamak\u003C/h3>\n\u003Cblockquote>\n\u003Cstrong>Kod:\u003C/strong>\u003Cbr>\u003Cbr>\n\ndef build_url(base, **params):\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;# Basit bir örnek: gerçek hayatta query string için uygun encode işlemi gerekir.\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;if not params:\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return base\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;query = \"&\".join(f\"{k}={v}\" for k, v in params.items())\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;return f\"{base}?{query}\"\u003Cbr>\u003Cbr>\n\nbuild_url(\"https://example.com\", page=2, sort=\"name\")\u003Cbr>\n\u003C/blockquote>\n\u003Cp>\u003Cstrong>Not:\u003C/strong> Yukarıdaki örnek, \u003Cem>**kwargs\u003C/em> fikrini anlatmak içindir. Üretim kodunda query string oluşturma/encode detayı için standart kütüphanedeki ilgili yardımcıları kullanmak daha doğru bir yaklaşımdır.\u003C/p>\n\u003Ch3>İmza okunabilirliği için pratik kurallar\u003C/h3>\n\u003Cul>\n  \u003Cli>\u003Cstrong>Önce açık parametreler\u003C/strong>: Sık kullanılan ayarları isimli parametre yapın, daha az kullanılan “ileri ayarlar” için \u003Cem>**kwargs\u003C/em> düşünebilirsiniz.\u003C/li>\n  \u003Cli>\u003Cstrong>Docstring ile belgeleyin\u003C/strong>: \u003Cem>**kwargs\u003C/em> kabul ediyorsanız hangi anahtarların desteklendiğini yazın.\u003C/li>\n  \u003Cli>\u003Cstrong>Tip/format beklentisini belirtin\u003C/strong>: Özellikle örneklerde “hangi tip bekleniyor” cümlesi çağrıyı netleştirir.\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Ch2>4) Lambda fonksiyonları: Nerede işe yarar, nerede “def” daha iyi?\u003C/h2>\n\u003Cp>Python’daki \u003Cem>lambda\u003C/em> ifadeleri, \u003Cstrong>tek bir ifadeden\u003C/strong> oluşan küçük anonim fonksiyonlar tanımlamak içindir. Birden fazla ifade, atama ya da kapsamlı kontrol akışı gerektiğinde normal \u003Cstrong>def\u003C/strong> daha uygundur (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#lambda-expressions\">S1\u003C/a>).\u003C/p>\n\u003Ch3>Lambda için tipik kullanım: key fonksiyonları\u003C/h3>\n\u003Cp>Sıralama/anahtar seçimi gibi yerlerde kısa bir fonksiyon vermek yaygındır:\u003C/p>\n\u003Cblockquote>\n\u003Cstrong>Kod:\u003C/strong>\u003Cbr>\u003Cbr>\n\nusers = [\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;{\"name\": \"Ada\", \"age\": 36},\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;{\"name\": \"Linus\", \"age\": 54},\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;{\"name\": \"Grace\", \"age\": 40},\u003Cbr>\n]\u003Cbr>\u003Cbr>\n\nsorted_users = sorted(users, key=lambda u: u[\"age\"])\u003Cbr>\n\u003C/blockquote>\n\u003Ch3>Okunabilirlik eşiği: Ne zaman def yazmalı?\u003C/h3>\n\u003Cul>\n  \u003Cli>Lambda ifadesi uzayıp satır kırmaya başladıysa, genellikle \u003Cstrong>def\u003C/strong> daha okunur olur.\u003C/li>\n  \u003Cli>Fonksiyonun bir adı olması, loglama ve hata ayıklama sırasında işleri kolaylaştırır.\u003C/li>\n  \u003Cli>Docstring gerekiyorsa zaten \u003Cstrong>def\u003C/strong> tercih edilir.\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Ch2>5) Basit dekoratör: Fonksiyon sarmalama ve functools.wraps\u003C/h2>\n\u003Cp>Dekoratörler bir fonksiyonu alıp başka bir fonksiyonla sarmalayarak davranış eklemenizi sağlar. Örneğin loglama veya ölçüm gibi çapraz kesen konularda kullanılabilir. Dekoratör yazarken pratik bir “en iyi uygulama”: sarmalanan fonksiyonun \u003Cem>__name__\u003C/em>, \u003Cem>__doc__\u003C/em> gibi metadata’sını korumak için \u003Cstrong>functools.wraps\u003C/strong> kullanmaktır (\u003Ca href=\"https://docs.python.org/3/library/functools.html\">S4\u003C/a>).\u003C/p>\n\u003Ch3>Örnek: Çağrı sayan dekoratör\u003C/h3>\n\u003Cblockquote>\n\u003Cstrong>Kod:\u003C/strong>\u003Cbr>\u003Cbr>\n\nfrom functools import wraps\u003Cbr>\u003Cbr>\n\ndef count_calls(func):\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;@wraps(func)\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;def wrapper(*args, **kwargs):\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wrapper.calls += 1\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return func(*args, **kwargs)\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;wrapper.calls = 0\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;return wrapper\u003Cbr>\u003Cbr>\n\n@count_calls\u003Cbr>\ndef hello(name):\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;\"\"\"İsimle selam verir.\"\"\"\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;return f\"Merhaba, {name}\"\u003Cbr>\n\u003C/blockquote>\n\u003Cp>Bu örnekte iki kritik nokta var:\u003C/p>\n\u003Cul>\n  \u003Cli>\u003Cstrong>*args/**kwargs\u003C/strong> ile “birçok imzayı” sarmalayabilen bir wrapper yazdık (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#defining-functions\">S1\u003C/a>).\u003C/li>\n  \u003Cli>\u003Cstrong>@wraps(func)\u003C/strong> sayesinde \u003Cem>hello.__name__\u003C/em> ve \u003Cem>hello.__doc__\u003C/em> gibi bilgiler daha doğru şekilde korunur (\u003Ca href=\"https://docs.python.org/3/library/functools.html\">S4\u003C/a>).\u003C/li>\n\u003C/ul>\n\u003Ch3>Dekoratörlerde pratik kontrol listesi\u003C/h3>\n\u003Cul>\n  \u003Cli>\u003Cstrong>wraps kullanın\u003C/strong>: Dokümantasyon/metadata için.\u003C/li>\n  \u003Cli>\u003Cstrong>Wrapper imzasını düşünün\u003C/strong>: Genel sarmalayıcı için \u003Cem>*args/**kwargs\u003C/em> pratik; beklentileri docstring’te belirtin.\u003C/li>\n  \u003Cli>\u003Cstrong>Yan etkileri sınırlayın\u003C/strong>: Örneğin global durum yerine wrapper üzerinde sayaç gibi yerel bir alan tutmak daha kontrollüdür.\u003C/li>\n\u003C/ul>\n\u003Chr>\n\u003Ch2>6) Docstring örnekleri: Okunabilirlik ve bakım kolaylığı\u003C/h2>\n\u003Cp>Docstring, fonksiyonun ne yaptığını ve nasıl kullanılacağını anlatan ilk dokümantasyon katmanıdır. PEP rehberleri, kod stilinde tutarlılık konusunda yol gösterir (\u003Ca href=\"https://peps.python.org/pep-0008/\">S2\u003C/a>). Ekip içinde tek bir docstring formatında anlaşmak (ör. kısa açıklama + parametreler + dönüş) bakım maliyetini azaltır.\u003C/p>\n\u003Ch3>Basit ve pratik docstring şablonu\u003C/h3>\n\u003Cblockquote>\n\u003Cstrong>Kod:\u003C/strong>\u003Cbr>\u003Cbr>\n\ndef area(width, height):\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;\"\"\"Dikdörtgen alanını hesaplar.\u003Cbr>\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;Args:\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width: Genişlik (sayı).\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height: Yükseklik (sayı).\u003Cbr>\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;Returns:\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Alan (width * height).\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;\"\"\"\u003Cbr>\n&nbsp;&nbsp;&nbsp;&nbsp;return width * height\u003Cbr>\n\u003C/blockquote>\n\u003Cp>\u003Cstrong>Not:\u003C/strong> Amaç tek bir “zorunlu format” dayatmak değil; tutarlılık ve açıklıktır.\u003C/p>\n\u003Chr>\n\u003Ch2>7) Hızlı uygulama: Fonksiyon imzanızı tasarlarken 10 dakikalık rehber\u003C/h2>\n\u003Col>\n  \u003Cli>\u003Cstrong>Minimum imza\u003C/strong>: Önce en az parametreyle çalışan bir \u003Cem>def\u003C/em> yazın.\u003C/li>\n  \u003Cli>\u003Cstrong>Okunabilir çağrılar\u003C/strong>: 3+ parametrede kritik seçenekleri keyword-only yapmayı değerlendirin (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#defining-functions\">S1\u003C/a>).\u003C/li>\n  \u003Cli>\u003Cstrong>Varsayılanları gözden geçirin\u003C/strong>: Mutable default kullanmayın; gerekiyorsa \u003Cem>None\u003C/em> + içeride oluşturma kalıbını kullanın (\u003Ca href=\"https://docs.python.org/3/tutorial/controlflow.html#defining-functions\">S1\u003C/a>, \u003Ca href=\"https://realpython.com/args-and-kwargs/\">S3\u003C/a>).\u003C/li>\n  \u003Cli>\u003Cstrong>*args/**kwargs gerçekten gerekli mi?\u003C/strong> Sadece “ileride lazım olur” diye eklemek yerine gerçek ihtiyaca göre ekleyin.\u003C/li>\n  \u003Cli>\u003Cstrong>Docstring yazın\u003C/strong>: Parametre ve dönüş değerini en azından bir-iki satırla belirtin (\u003Ca href=\"https://peps.python.org/pep-0008/\">S2\u003C/a>).\u003C/li>\n  \u003Cli>\u003Cstrong>Dekoratör varsa wraps ekleyin\u003C/strong>: Metadata kaybını önlemek için (\u003Ca href=\"https://docs.python.org/3/library/functools.html\">S4\u003C/a>).\u003C/li>\n\u003C/ol>\n\u003Chr>\n\u003Ch2>Sonuç\u003C/h2>\n\u003Cp>Python fonksiyonlarında “küçük” görünen detaylar (varsayılanların değerlendirilme zamanı, keyword-only/positional-only kuralları, dekoratörlerde metadata) proje büyüdükçe bakım maliyetini doğrudan etkiler. Bu rehberdeki örnekleri kendi kod tabanınıza uyarlarken önce okunabilirlik ve öngörülebilirlik hedefleyin; emin olmadığınız noktalarda küçük testlerle davranışı doğrulamak iyi bir pratiktir.\u003C/p>","Python Fonksiyonları: args/kwargs, Lambda ve Dekoratör","Python fonksiyonlarında parametre türleri, varsayılan argüman tuzakları, *args/**kwargs, lambda, docstring ve functools.wraps ile basit dekoratör örnekleri.","python fonksiyonları, python parametreler, pozisyonel argüman, keyword argüman, positional-only, keyword-only, varsayılan argüman, mutable default, args, kwargs, lambda, dekoratör, functools.wraps, docstring","python-fonksiyonlari-parametreler-varsayilanlar-argskwargs-lambda-ve-bas","2026-03-10T19:21:04.000Z",{"id":16,"title":17,"slug":18},208,"Python Fonksiyon Örnekleri","python-fonksiyon-ornekleri",{"id":20,"name":21,"nickname":22,"slug":23},92,"Burak Demirtaş","CodeMentor","burak-demirtas","/media/blog/221a7d136bc956dc7234f1bcc60c99ad.jpg","/media/blog/221a7d136bc956dc7234f1bcc60c99ad_thumb.jpg","/media/blog/221a7d136bc956dc7234f1bcc60c99ad.webp","/media/blog/221a7d136bc956dc7234f1bcc60c99ad_thumb.webp",null,{"minutes":30,"wordCount":31,"imageCount":32,"formatted":33},8,1431,0,"8 dk okuma süresi","/blog/python-fonksiyon-ornekleri/python-fonksiyonlari-parametreler-varsayilanlar-argskwargs-lambda-ve-bas",[],["Reactive",37],{"title":7,"subTitle":17,"image":24},["Reactive",39],{"title":10,"meta":40,"link":75},[41,43,45,48,51,54,57,60,63,66,69,71,73],{"hid":42,"name":42,"content":11},"description",{"hid":44,"name":44,"content":12},"keywords",{"hid":46,"name":46,"content":47},"author","Başlangıç Seviyesi Kod & Snippet Rehberi",{"hid":49,"name":49,"content":50},"robots","index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1",{"hid":52,"property":52,"content":53},"og:type","website",{"hid":55,"property":55,"content":56},"og:title","Başlangıç Kod & Snippet Rehberi | KodÖğreniyorum",{"hid":58,"property":58,"content":59},"og:description","Yeni başlayanlara yönelik kısa kod örnekleri, snippet'ler ve adım adım alıştırmalar. Hızlı uygulamalarla temel programlama mantığını pekiştir.",{"hid":61,"property":61,"content":62},"og:image","https://kodogreniyorum.com/media/blog/221a7d136bc956dc7234f1bcc60c99ad.jpg",{"hid":64,"property":64,"content":65},"og:url","https://kodogreniyorum.com/blog/python-fonksiyon-ornekleri/python-fonksiyonlari-parametreler-varsayilanlar-argskwargs-lambda-ve-bas",{"hid":67,"name":67,"content":68},"twitter:card","summary_large_image",{"hid":70,"name":70,"content":56},"twitter:title",{"hid":72,"name":72,"content":59},"twitter:description",{"hid":74,"name":74,"content":62},"twitter:image",[76,78],{"rel":77,"href":65},"canonical",{"rel":79,"href":80},"amphtml","https://amp.kodogreniyorum.com/blog/python-fonksiyon-ornekleri/python-fonksiyonlari-parametreler-varsayilanlar-argskwargs-lambda-ve-bas",["Reactive",82],{"@context":83,"@graph":84},"https://schema.org",[85,98],{"@type":86,"headline":10,"image":62,"author":87,"publisher":90,"datePublished":14,"dateModified":14,"mainEntityOfPage":96,"description":11},"BlogPosting",{"@type":88,"name":21,"url":89},"Person","https://kodogreniyorum.com/yazarlar/burak-demirtas",{"@type":91,"name":47,"logo":92},"Organization",{"@type":93,"url":94,"width":95,"height":95},"ImageObject","https://kodogreniyorum.com/img/icons/favicon.png",32,{"@type":97,"@id":65},"WebPage",{"@type":99,"itemListElement":100},"BreadcrumbList",[101,106,110,113],{"@type":102,"position":103,"name":104,"item":105},"ListItem",1,"Ana Sayfa","https://kodogreniyorum.com",{"@type":102,"position":107,"name":108,"item":109},2,"Blog","https://kodogreniyorum.com/blog",{"@type":102,"position":111,"name":17,"item":112},3,"https://kodogreniyorum.com/blog/python-fonksiyon-ornekleri",{"@type":102,"position":114,"name":7,"item":65},4]