5. Esnek Parametreler (*args ve **kwargs):
Python’da, fonksiyonlara değişken sayıda argüman geçmek için *args ve **kwargs gibi esnek parametreler kullanılabilir. Bu parametreler, belirsiz sayıda değer alabilen ve fonksiyon içinde kullanılabilen özel parametre türleridir.
a) *args (Yıldızlı Parametreler):
*args, fonksiyonlara değişken sayıda konumsal argüman geçmek için kullanılır. Bu parametre, bir tuple içindeki tüm konumsal argümanları alır.
def toplama(*args):
toplam = 0
for sayi in args:
toplam += sayi
return toplam
print(toplama(1, 2, 3)) # 6
print(toplama(4, 5, 6, 7)) # 22
Burada *args, toplama fonksiyonuna geçilen değişken sayıda argümanı içeren bir tuple oluşturur. args adı sadece geleneksel olarak kullanılan bir isimdir, aslında * operatörü, fonksiyon çağrısı sırasında gelen tüm konumsal argümanları tek bir tuple içinde toplar. Bu şekilde, fonksiyonun ne kadar çok argüman alacağı önceden belirlenmez ve herhangi bir sayıda argümanı işlemek için kullanılabilir.
- Peki Konumsal Argüman Nedir?
Konumsal argümanlar, bir fonksiyona geçirilen ve fonksiyon tanımında belirtilen parametrelerdir. Bir fonksiyon tanımında parametrelerin sıralı olduğu ve fonksiyon çağrısı sırasında bu sıraya göre değerlerin atanması beklenir. Örneğin:
def toplama(x, y):
return x + y
toplama(3, 5)
Burada x ve y, toplama fonksiyonunun konumsal argümanlarıdır. Fonksiyon çağrısı sırasında 3 x‘e, 5 ise y‘ye atanır. Yani sıralama önemlidir.
b) ** kwargs (Çift Yıldızlı Parametreler):
**kwargs, fonksiyonlara değişken sayıda anahtar-değer çifti geçmek için kullanılır. Bu parametre, bir sözlük içindeki tüm anahtar-değer çiftlerini alır.
# kwargs, anahtar-değer çiftleri şeklinde argümanlar alır
def bilgiler(**kwargs):
# Her bir anahtar-değer çiftini ekrana yazdırmak için döngü kullanılır
for key, value in kwargs.items():
# Anahtar ve değer ekrana yazdırılır
print(key, ":", value)
# Fonksiyon çağrısı yapılır, kwargs ile ad, yaş ve şehir bilgileri fonksiyona geçilir
bilgiler(ad="Ali", yaş=30, şehir="Ankara")
# Çıktı:
# ad : Ali
# yaş : 30
# şehir : Ankara
Yukarıdaki örnekte, “bilgiler” fonksiyonuna geçilen tüm anahtar-değer çiftleri **kwargs parametresi içinde bir sözlük olarak toplanır ve bu sözlük üzerinde işlem yapılır.
Notlar:
- *args ve **kwargs parametre isimleri isteğe bağlıdır. Önemli olan, * ve ** operatörlerinin kullanılmasıdır.
- *args ve **kwargs parametreleri, diğer parametrelerden sonra kullanılmalıdır.
- *args ve **kwargs, tek başına veya birlikte kullanılabilir.
- *args ve **kwargs ifadelerinin yerine başka isimler de kullanılabilir, (örneğin; *misal ve **ornek) ancak genellikle bu ifadelerin kullanılması yazılımcılar arasında norm haline gelmiştir.
Esnek parametreler (*args ve **kwargs), fonksiyonların daha esnek ve genel amaçlı olmasını sağlar. Bu özellikler, fonksiyonlara değişken sayıda argüman geçmek veya anahtar-değer çiftleriyle çalışmak istediğinizde işinizi oldukça kolaylaştıracaktır.
6. İç İçe Fonksiyonlar (Nested Functions):
Python’da, bir fonksiyonun içinde başka bir fonksiyon tanımlanabilir. Buna iç içe fonksiyonlar denir. İç içe fonksiyonlar, dışarıdaki fonksiyonun kapsamında yer alır ve dış fonksiyonun içinden çağrılabilir.
Örnek:
# Dış fonksiyon tanımlanır
def dis_fonksiyon():
print("Dış fonksiyon çalıştı.")
# İç fonksiyon tanımlanır
def ic_fonksiyon():
print("İç fonksiyon çalıştı.")
ic_fonksiyon() # İç fonksiyon çağrısı
dis_fonksiyon() # Dış fonksiyon çağrısı
# Çıktı:
# Dış fonksiyon çalıştı.
# İç fonksiyon çalıştı.
Yukarıdaki örnekte, “dis_fonksiyon” adında bir dış fonksiyon tanımlanmıştır. Bu fonksiyonun içinde “ic_fonksiyon” adında bir iç fonksiyon tanımlanmıştır. İç fonksiyon, dış fonksiyonun içinden çağrılmıştır.
Kapsam ve Erişim:
İç içe fonksiyonlar, dış fonksiyonun kapsamında yer alır ve dış fonksiyonun içinde tanımlanır. İç fonksiyonlar, dış fonksiyonun değişkenlerine ve kapsamına erişebilirler.
Örnek:
def dis_fonksiyon():
x = 10
def ic_fonksiyon():
print("x:", x)
ic_fonksiyon()
dis_fonksiyon()
Yukarıdaki örnekte, “ic_fonksiyon” içinde “x” adlı bir değişkene erişilmiştir. Bu değişken, dış fonksiyonun kapsamında tanımlanmıştır ve iç fonksiyon tarafından kullanılabilir.
Kullanım Alanları:
İç içe fonksiyonlar, kodun daha modüler ve düzenli olmasını sağlar. Özellikle, bir fonksiyonun içinde başka bir fonksiyonun kullanılması gerektiği durumlarda iç içe fonksiyonlar tercih edilir.
Örnek:
def hava_durumu(il):
def sicaklik_derecesi(sicaklik):
return f"{il} şehrindeki sıcaklık: {sicaklik}°C"
return sicaklik_derecesi
ankara_hava = hava_durumu("Ankara")
istanbul_hava = hava_durumu("İstanbul")
print(ankara_hava(25))
print(istanbul_hava(28))
# hava_durumu adında bir fonksiyon tanımla
def hava_durumu(il):
# sicaklik_derecesi adında bir iç fonksiyon tanımla
def sicaklik_derecesi(sicaklik):
# İç fonksiyon içinde il ve sıcaklık birleştirilerek bir mesaj oluştur
return f"{il} şehrindeki sıcaklık: {sicaklik}°C"
# sicaklik_derecesi fonksiyonu döndürülür
return sicaklik_derecesi
# Ankara için hava_durumu fonksiyonunu çağır ve ankara_hava değişkenine ata
ankara_hava = hava_durumu("Ankara")
# İstanbul için hava_durumu fonksiyonunu çağır ve istanbul_hava değişkenine ata
istanbul_hava = hava_durumu("İstanbul")
# Ankara'daki sıcaklık değerini ekrana yazdır
print(ankara_hava(25))
# İstanbul'daki sıcaklık değerini ekrana yazdır
print(istanbul_hava(28))
# Çıktı:
# Ankara şehrindeki sıcaklık: 25°C
# İstanbul şehrindeki sıcaklık: 28°C
Bu örnekte, “hava_durumu” adında bir dış fonksiyon tanımlanmıştır. Bu dış fonksiyon, şehir ismini parametre olarak alır ve bu şehir için bir iç fonksiyon döndürür. İç fonksiyon ise sıcaklık değerini parametre olarak alır ve verilen şehirdeki sıcaklığı ekrana yazdırır. Daha sonra, “Ankara” ve “İstanbul” için ayrı iç fonksiyonlar oluşturulur ve bu fonksiyonlar çağrılarak ilgili şehirlerin sıcaklık değerleri elde edilir ve ekrana yazdırılır. Bu şekilde, iç içe fonksiyonlar kullanılarak farklı şehirler için hava durumu bilgisi alınmış olur.
