Python'da Fonksiyon Yazma: def, Parametreler ve return
def ile fonksiyon yazmayı, konumsal, anahtar kelimeli ve varsayılan parametreleri, return ile değer döndürmeyi ve *args ile **kwargs kullanımını kısa örneklerle öğrenirsiniz.
Bir bakışta
- Fonksiyon, def anahtar sözcüğü ve girintili bir gövdeyle tanımlanır. Adı, parantez içinde parametreleri ve iki nokta üst üste ile başlayan bir bloğu vardır.
- return değer döndürür, return olmayan fonksiyon None döndürür. Ekrana yazdırmak ile değer döndürmek farklı şeylerdir.
- Parametre türleri çağrıyı okunaklı ve esnek yapar. Konumsal, anahtar kelimeli ve varsayılan değerli parametreler birlikte kullanılabilir.
- *args konumsal, **kwargs anahtar kelimeli fazla argümanları toplar. Argüman sayısı baştan belli olmayan fonksiyonlar için kullanılır.
- Varsayılan değer olarak boş liste vermeyin. Değiştirilebilir varsayılan, çağrılar arasında paylaşılır; None kullanıp içeride oluşturun.
def ile ilk fonksiyon
Python'da fonksiyon def anahtar sözcüğüyle tanımlanır. Ardından fonksiyonun adı, parantez içinde parametreleri ve iki nokta üst üste gelir; gövde bir sonraki satırlardan başlayarak girintiyle yazılır. Girinti, hangi satırların fonksiyona ait olduğunu belirler.
def selamla(ad): """Verilen kişiye selam metni döndürür.""" return 'Merhaba, ' + ad
mesaj = selamla('Ayşe') print(mesaj)
Bu örnekte selamla adlı fonksiyon bir ad alır ve bir metin döndürür. Son satırlar fonksiyonu çağırır ve sonucu yazdırır. Fonksiyon yalnızca tanımlandığında çalışmaz; çalışması için çağrılması gerekir.
Gövdenin ilk satırındaki metin docstring olarak adlandırılır. Python belgelerine göre bu ilk ifade bir metin ise fonksiyonun belgeleme metnidir. Kısa bir özet cümlesiyle başlayıp gerekirse boş satırdan sonra ayrıntıyı yazmak yaygın bir alışkanlıktır. Docstring'i yazmak, birkaç ay sonra kendi kodunuzu okurken size zaman kazandırır.
return, None ve değer döndürme
return, fonksiyonun çağıran tarafa bir değer göndermesini sağlar ve fonksiyonu o noktada bitirir. Python belgelerine göre ifadesiz bir return ya da fonksiyonun sonuna ulaşmak None döndürür.
def kare_al(sayi): return sayi * sayi
def yazdir(sayi): print(sayi)
sonuc_bir = kare_al(deger) sonuc_iki = yazdir(deger)
Birinci çağrıda sonuc_bir hesaplanan değeri taşır. İkinci çağrıda yazdir ekrana bir şey yazdırır ama değer döndürmez; sonuc_iki bu yüzden None olur. Yeni başlayanların sık yaptığı hata, hesaplanan sonucu print ile ekrana basıp bir sonraki adımda kullanmaya çalışmaktır. Başka bir yerde kullanılacak değer return ile döndürülür, yalnızca görmek istenen değer print ile yazdırılır.
Birden çok değer döndürmek için virgülle ayırmanız yeterlidir; Python bunları bir demet olarak döndürür ve çağıran taraf bunları ayrı değişkenlere açabilir:
def kucuk_buyuk(a, b): return min(a, b), max(a, b)
kucuk, buyuk = kucuk_buyuk(x, y)
Parametre türleri ve ne zaman hangisi
Bir fonksiyona değer verirken kullanılabilecek birkaç yol vardır.
Konumsal parametreler sırayla eşleşir. Anahtar kelimeli çağrıda parametre adı yazılır ve sıra önemsizleşir; ancak Python belgelerine göre anahtar kelimeli argümanlar konumsal argümanlardan sonra gelmelidir ve bir parametreye iki kez değer verilemez. Varsayılan değerli parametre, çağrıda verilmezse önceden belirlenen değeri alır:
def selamla(ad, unvan='Sayın'): return unvan + ' ' + ad
selamla('Ayşe') selamla('Ayşe', unvan='Doktor')
Argüman sayısı baştan belli değilse *args ve **kwargs kullanılır. Belgelerin ifadesiyle *args fazla konumsal argümanları bir demete, **kwargs fazla anahtar kelimeli argümanları bir sözlüğe toplar. Yıldızlı konumsal parametreden sonra gelen parametreler yalnızca anahtar kelimeyle verilebilir:
def birlestir(*parcalar, ayrac='/'): return ayrac.join(parcalar)
def profil(**bilgiler): for anahtar, deger in bilgiler.items(): print(anahtar, deger)
profil(ad='Ayşe', sehir='Ankara')
*args her zaman **kwargs'tan önce yazılır. Gerçek kodda bunları yalnızca bir fonksiyon başka bir fonksiyona argümanları olduğu gibi aktaracaksa kullanın; genel durumda açık parametre adları kodu daha okunaklı yapar.
Her parametre türü farklı bir ihtiyaca cevap verir
| Yazım | Ne yapar | Ne zaman | |
|---|---|---|---|
| Konumsal | f(a, b) | Değerleri sırayla eşler | Az ve belirgin parametre varken |
| Anahtar kelimeli | f(b=x, a=y) | Adla eşler, sıra önemsiz | Çok parametre ya da anlam belirsizken |
| Varsayılan değerli | def f(a, b=x) | Verilmezse hazır değeri alır | Çoğu çağrıda aynı değer kullanılacaksa |
| *args | def f(*args) | Fazla konumsal argümanları demete toplar | Argüman sayısı değişkense |
| **kwargs | def f(**kwargs) | Fazla anahtar kelimeleri sözlüğe toplar | Seçenekler değişkense ya da aktarılıyorsa |
Kapsam: fonksiyon içindeki değişkenler
Fonksiyon içinde oluşturulan değişkenler yereldir ve fonksiyon bitince kaybolur. Belgelere göre fonksiyonun dışındaki bir değişkene fonksiyon içinden doğrudan değer atanamaz; bunun için global ya da iç içe fonksiyonlarda nonlocal bildirimi gerekir. Dış değişkeni okumak ise mümkündür.
Bu davranış bir güvenlik ağıdır: fonksiyon kendi işini yapar, dışarıdaki değişkenleri sessizce değiştirmez. Bir fonksiyonun sonucunu dışarıya vermek istiyorsanız global değişkeni değiştirmek yerine return kullanın. Böylece fonksiyonun girdisi parametreler, çıktısı return olur; test etmesi ve başka yerde kullanması kolaylaşır.
İç içe fonksiyonda dış fonksiyonun değişkenine değer atamak gerekiyorsa nonlocal kullanılır, ancak gerek kalmadan döndürülen değerle çözmek çoğu zaman daha temizdir.
Varsayılan değerde yapılan klasik hata
Varsayılan değer fonksiyon tanımlandığı anda bir kez hesaplanır. Python belgelerinin uyardığı gibi varsayılan değer liste ya da sözlük gibi değiştirilebilir bir nesneyse, bu nesne çağrılar arasında paylaşılır ve önceki çağrılardan kalan değerleri biriktirir.
def ekle(oge, liste=[]): liste.append(oge) return liste
Bu fonksiyon liste vermeden her çağrıldığında aynı listeye ekleme yapar. İlk çağrıda tek öğeli bir liste beklerken ikinci çağrıda eski öğeyi de görürsünüz.
Doğru kalıp varsayılan olarak None vermek ve listeyi fonksiyonun içinde oluşturmaktır:
def ekle(oge, liste=None): if liste is None: liste = [] liste.append(oge) return liste
Aynı kural sözlük ve küme için de geçerlidir. Sayı, metin ve None gibi değiştirilemeyen nesneler varsayılan değer olarak sorunsuzdur.
Değiştirilebilir varsayılanın yerine None kullanın
İyi fonksiyon yazmanın pratikleri
Bir fonksiyon tek bir işi yapmalıdır; adı o işi anlatmalıdır. Hesapla, doğrula, yaz gibi fiillerle başlayan adlar okunurluğu artırır. Fonksiyon uzadıkça iki ayrı işi yapıyor olma ihtimali yükselir; bu durumda onu daha küçük fonksiyonlara bölün.
Girdiler parametreyle gelsin, çıktı return ile gitsin. Fonksiyonun içinde global değişkeni okumak ya da değiştirmek, aynı fonksiyonun farklı bağlamlarda farklı sonuç vermesine yol açar ve testi zorlaştırır.
Docstring yazın, parametrelerin ne beklediğini ve ne döndürdüğünü belirtin. Python'da tip ipuçlarıyla parametre ve dönüş türlerini işaretleyebilirsiniz; belgelere göre bu notlar fonksiyonun çalışmasını etkilemez, yalnızca okuyana ve araçlara bilgi verir.
Sık görülen diğer hatalar: tanımlamada iki nokta üst üste unutmak, gövdeyi girintisiz yazmak, fonksiyonu tanımlayıp çağırmamak ve return yerine print kullanıp sonucu başka yerde kullanmaya çalışmaktır.
Tip ipuçlu bir fonksiyon şöyle görünür:
def alan_hesapla(en: float, boy: float) -> float: """Dikdörtgenin alanını döndürür.""" return en * boy
Bir ayrıntıyı da unutmayın: alan_hesapla yazmak fonksiyonun kendisini, alan_hesapla(en, boy) yazmak ise çağrının sonucunu ifade eder. Bu ayrım, bir fonksiyonu başka bir fonksiyona argüman olarak geçirdiğinizde önem kazanır.
Bu beceriyi Mindset programlarında nerede çalışırsınız
Python ile Programlama Eğitimi, Fonksiyonlar ve Operatörler ile Fonksiyonlar başlıklı modülleri içerir; bu sayfadaki def, parametre ve return konuları o akışın temelidir. Programlamaya yeni başlayanlar ya da iş süreçlerini küçük betiklerle otomatikleştirmek isteyen analistler için, fonksiyonlar kodu tekrar kullanılabilir parçalara bölmenin ilk adımıdır.
İlgili Mindset programı
Python ile Programlama Eğitimi
Sık sorulan sorular
Parametre ile argüman arasındaki fark nedir?
Parametre, fonksiyonu tanımlarken yazdığınız değişken adıdır. Argüman ise fonksiyonu çağırırken verdiğiniz gerçek değerdir. Günlük konuşmada ikisi karıştırılır; Python'da kod çalışması açısından fark yaratmaz ama hata mesajlarını anlamak için bilmek yararlıdır.
return olmayan fonksiyon hata verir mi?
Hayır, çalışır. Python belgelerine göre return olmayan bir fonksiyon None döndürür. Hata ancak bu None değerini bir sayı gibi kullanmaya çalıştığınızda ortaya çıkar. Fonksiyonun sonucuna sonra ihtiyaç duyuyorsanız açıkça return ekleyin ve print ile yalnız ekrana yazdırmayın.
*args ve **kwargs ne zaman gerekir?
Argüman sayısı ya da isimleri önceden bilinmediğinde, örneğin değişken sayıda değeri toplayan bir fonksiyonda ya da gelen seçenekleri başka bir fonksiyona aktaran sarmalayıcıda. Normal durumda açık parametre adları tercih edilir; çağrıyı okuyan kişi neyin beklendiğini görür.
Fonksiyon içinden dış değişkeni değiştirebilir miyim?
Doğrudan değer atayamazsınız; bunun için global bildirimi gerekir. Ancak bu çoğu zaman gerekli değildir. Değeri return ile döndürüp dışarıda bir değişkene atamak daha temiz ve test edilebilir bir yoldur, çünkü fonksiyon dış duruma bağımlı kalmaz.
Anahtar kelimeli argümanı konumsal argümandan önce verebilir miyim?
Hayır. Python belgelerine göre anahtar kelimeli argümanlar konumsal argümanlardan sonra gelmelidir. Önce konumsal, sonra anahtar kelimeli yazın; aksi halde sözdizimi hatası alırsınız. Bir parametreye aynı çağrıda iki kez değer vermek de mümkün değildir.
İlgili rehberler
Kategori: Yazılım Geliştirme