Python Fonksiyon Örnekleri: Parametreler, Default ve Lambda
Python fonksiyonları, tekrar kullanılabilir kod blokları oluşturmak için kullanılır. Bu rehberde fonksiyon tanımı, konumsal ve anahtar kelime parametreleri, varsayılan (default) parametreler, *args/**kwargs, lambda ifadeleri ile kapsama (scope) ve dönüş değerlerine ilişkin pratik örnekler sunulacaktır. Temel tanımlar için Python'un resmi belgelerine göz atabilirsiniz: Python Tutorial — Control Flow ve Python Reference — Compound statements.
1. Fonksiyon tanımlama: temel sözdizimi
Basit bir fonksiyon 'def' anahtar sözcüğüyle tanımlanır. Fonksiyon gövdesi girintili blok şeklindedir ve isteğe bağlı olarak return ile değer döndürür.
def add(a, b):
"""İki sayıyı toplar."""
return a + b
Çağırma örnekleri:
print(add(2, 3)) # 5
print(add(a=4, b=1)) # 5 (anahtar kelime argümanları)
2. Parametre türleri
Python fonksiyon parametreleri farklı şekillerde kullanılabilir:
- Konumsal (positional) argümanlar: sıraya bağlı olarak atanır.
- Anahtar kelime (keyword) argümanlar: parametre adıyla belirtilir.
- *args: fonksiyona değişken sayıda konumsal argüman geçmek için kullanılır.
- **kwargs: fonksiyona değişken sayıda anahtar kelime argüman geçirmek için kullanılır.
Örnek:
def collect(*args, **kwargs):
print('positional:', args)
print('keywords:', kwargs)
collect(1, 2, x=3, y=4)
3. Default (varsayılan) parametreler
Fonksiyon tanımında parametreye bir değer atanırsa, o parametre çağrılmadığında varsayılan değer kullanılır. Bu kullanım sıkça tercih edilir, ancak dikkat edilmesi gereken bir durum vardır: mutable (ör. list, dict) nesneler varsayılan olarak paylaşılan tek bir nesne olarak kullanılabilir ve beklenmeyen birikimlere yol açabilir.
Doğru ve yanlış kullanım ayrımını görmek için örnek:
def greet(name, greeting='Merhaba'):
return f"{greeting}, {name}!"
print(greet('Ali')) # Merhaba, Ali!
print(greet('Ayşe', greeting='Selam')) # Selam, Ayşe!
Mutable default tuzağı:
def append_to(item, target=[]):
target.append(item)
return target
print(append_to(1)) # [1]
print(append_to(2)) # [1, 2] (aynı liste paylaşıldı)
Bu sorunu önlemek için genellikle None sentinel kullanılır:
def append_to(item, target=None):
if target is None:
target = []
target.append(item)
return target
4. Lambda ifadeleri: küçük anonim fonksiyonlar
Lambda ifadeleri tek bir ifadeyle tanımlanan anonim (isimsiz) fonksiyonlardır. Kısa, tek kullanımlık fonksiyonlar için uygundur. Resmi belgelerde lambda ifadelerinin tek bir ifadeyle sınırlı olduğu belirtilir ve fonksiyon nesnelerinin gerekli olduğu her yerde kullanılabilir.
# Sıralama için örnek
pairs = [('a', 3), ('b', 1), ('c', 2)]
sorted_pairs = sorted(pairs, key=lambda x: x[1])
print(sorted_pairs) # [('b', 1), ('c', 2), ('a', 3)]
Map/filter ile kullanımı:
squares = list(map(lambda x: x * x, range(5)))
evens = list(filter(lambda x: x % 2 == 0, range(10)))
Not: Daha okunaklı olan durumlarda list comprehension veya ayrı isimli fonksiyon tercih edilebilir.
5. Kapsam (scope) ve dönüş değerleri
Fonksiyon içinde tanımlanan değişkenler yerel (local) kapsamda olur. return ifadesi bir değer döndürür; eğer yoksa Python varsayılan olarak None döndürür. Bir fonksiyondan birden çok değer döndürmek için tuple döndürmek sıkça kullanılan yöntemdir.
def divmod_like(a, b):
quotient = a // b
remainder = a % b
return quotient, remainder
q, r = divmod_like(7, 3) # q=2, r=1
Nested (iç içe) fonksiyon örneği ve nonlocal kullanımı:
def counter():
count = 0
def inc():
nonlocal count
count += 1
return count
return inc
c = counter()
print(c()) # 1
print(c()) # 2
Nonlocal ve global değişken yönetimi hakkında daha fazla bilgi için Python referansına bakabilirsiniz: Compound statements.
6. Pratik ipuçları ve iyi uygulamalar
- Her fonksiyon için kısa ve açıklayıcı docstring yazın; bu, bakım ve test açısından faydalıdır.
- Mutable varsayılanlardan kaçının; None sentinel kullanın.
- Fonksiyonları tek bir sorumluluk (single responsibility) ilkesiyle küçük tutun.
- Karmaşık mantık için isimlendirilmiş fonksiyonları tercih edin; lambda'lar kısa ve basit kullanım için uygundur.
- Type hint (ör. def f(x: int) -> int) kullanımı kodu daha öngörülebilir kılar, ancak zorunlu değildir.
7. Adım adım: kendi fonksiyonunuzu yazma checklist
- Ne yapacağını ve hangi parametrelere ihtiyaç duyduğunu belirleyin.
- Gerekliyse varsayılan değerleri ve *args/**kwargs kullanımını planlayın.
- Docstring ekleyin ve basit örnek kullanım gösterin.
- Edge case'leri düşünün (ör. sıfıra bölme, boş liste, None).
- Basit testlerle davranışı doğrulayın.
8. Hızlı örnek: küçük bir modül
def make_multiplier(n):
"""Verilen n ile çarpan oluşturur."""
return lambda x: x * n
doubler = make_multiplier(2)
print(doubler(5)) # 10
9. Sonuç ve kaynaklar
Bu yazıda Python fonksiyonlarının temel kullanımı, parametre çeşitleri, varsayılan değerler, lambda ifadeleri ve kapsam ile dönüş örnekleri gösterildi. Daha ayrıntılı ve sürüm odaklı açıklamalar için resmi belgelendirmeyi inceleyin: Python Tutorial ve Python Reference. Bu sayfalar, söz dizimi ve davranış hakkında resmi ve güncel bilgiyi sağlar.
İpuçları: örnekleri küçük parçalar halinde çalıştırarak davranışı gözlemleyin ve testler yazarak beklentilerinizi doğrulayın.