Kurs

Fonksiyonlar, Python programlama dilinin vazgeçilmez bir parçasıdır: Python diline yerleşik olarak gelen veya zengin kütüphane ekosistemiyle sunulan pek çok harika fonksiyonu muhtemelen şimdiden gördünüz ve kullandınız. Ancak bir veri bilimci olarak, verinizin ortaya çıkardığı sorunları çözmek için kendi fonksiyonlarınızı sürekli yazmanız gerekir.
Bu eğitim Python 3 söz dizimini kullanır. Tüm örnekler Python 3.10+ üzerinde çalışır ve modern kuralları yansıtacak şekilde güncellenmiştir (f-string’ler, tür ipuçları, yalnızca konumsal ve yalnızca anahtar sözcük parametreleri). Mevcut kararlı sürüm Python 3.14’tür.
Bu eğitimdeki tüm örnek kodları kendiniz kolayca çalıştırmak için, Python’un önceden kurulu olduğu ve tüm kod örneklerini içeren ücretsiz bir DataLab çalışma kitabı oluşturabilirsiniz. Python fonksiyonları yazma pratiği için bu uygulamalı DataCamp alıştırmasına göz atın veya Python Data Science Toolbox kursumuzu deneyin!
Python’da fonksiyonlar
Programlamada fonksiyonları, tekrar tekrar kullanmak istediğiniz ya da karmaşıklıkları nedeniyle kendi içinde mantıksal olarak ayrılıp ihtiyaç duyulduğunda çağrılması daha uygun olan komutları bir araya toplamak için kullanırsınız. Yani fonksiyon, belirli bir görevi yerine getirmek üzere yazılmış bir kod parçasıdır. Bu belirli görevi yapmak için fonksiyonun birden fazla girdiye ihtiyacı olabilir de olmayabilir de. Görev tamamlandığında fonksiyon bir veya daha fazla değer döndürebilir ya da hiçbir şey döndürmeyebilir.
Python’da üç tür fonksiyon vardır:
-
help()ile yardım isteme,min()ile en küçük değeri bulma,print()ile bir nesneyi terminale yazdırma gibi yerleşik fonksiyonlar… Bu fonksiyonların daha fazlasına buradan ulaşabilirsiniz. -
Kullanıcı Tanımlı Fonksiyonlar (UDF), yani kullanıcıların kendilerine yardımcı olması için oluşturdukları fonksiyonlar; ve
-
Anonim fonksiyonlar: Standart
defanahtar sözcüğüyle tanımlanmadıkları için lambda fonksiyonları olarak da adlandırılır.
Fonksiyonlar ve metodlar
Metod, bir sınıfın parçası olan fonksiyona denir. Ona sınıfın bir örneği ya da nesnesi üzerinden erişirsiniz. Fonksiyonlarda böyle bir kısıtlama yoktur: bağımsız bir fonksiyona işaret eder. Bu da tüm metodların fonksiyon olduğu, ancak tüm fonksiyonların metod olmadığı anlamına gelir.
Önce bir plus() fonksiyonunu, ardından sum() metoduna sahip bir Summation sınıfını tanımladığınız şu örneği düşünün:
Artık Summation sınıfının parçası olan sum() metodunu çağırmak isterseniz, önce o sınıfın bir örneğini ya da nesnesini tanımlamanız gerekir. O hâlde, böyle bir nesne tanımlayalım:
Bu örnekleme, plus() fonksiyonunu çağırmak istediğinizde gerekli değildir, bunu unutmayın! DataCamp Light kod bloğunda plus(1,2) ifadesini sorunsuz çalıştırabilirsiniz!
Parametreler ve argümanlar
Parametreler, bir fonksiyon veya metod tanımlarken kullanılan ve argümanların eşleneceği isimlerdir. Başka bir deyişle, argümanlar herhangi bir fonksiyon ya da metod çağrısına verdiğiniz değerlerdir; fonksiyon ya da metod kodu bu argümanlara parametre adlarıyla atıfta bulunur.
Aşağıdaki örneği inceleyin ve yukarıdaki DataCamp Light bloğuna geri dönün: Summation sınıfının sum() metoduna iki argüman geçirirsiniz; oysa daha önce üç parametre tanımlamıştınız: self, a ve b.
self’e ne oldu?
Her sınıf metodunun ilk argümanı, o sınıfın mevcut örneğine referanstır; bu durumda bu sınıf Summation’dır. Geleneksel olarak bu argümanın adı self’tir.
Bu da, bu durumda self referansını kendiniz geçmediğiniz anlamına gelir; çünkü self, bir metodun çağrıldığı örneğe atıfta bulunan, örtük olarak geçirilen argümanın parametre adıdır. Argüman listesine otomatik olarak eklenir.
Bir Fonksiyon Nasıl Tanımlanır: Kullanıcı Tanımlı Fonksiyonlar (UDF)
Python’da bir fonksiyonu tanımlamanın dört adımı şunlardır:
-
Fonksiyonu bildirmek için
defanahtar sözcüğünü kullanın ve bunun hemen ardından fonksiyon adını yazın. -
Fonksiyona parametreler ekleyin: Parametreler, fonksiyonun parantezleri içinde yer almalıdır. Satırı iki nokta üst üste ile bitirin.
-
Fonksiyonun çalıştırması gereken deyimleri ekleyin.
-
Fonksiyon bir çıktı üretmeliyse
returndeyimiyle sonlandırın. Return deyimi olmazsa fonksiyonunuzNonenesnesini döndürür.
Elbette ilerledikçe fonksiyonlarınız daha karmaşık hâle gelecektir: döngüler, akış kontrolü vb. ekleyerek daha ince ayar yapabilirsiniz:
def hello():
name = input("Enter your name: ")
if name:
print(f"Hello {name}")
else:
print("Hello World")
hello()
Yukarıdaki fonksiyonda kullanıcıdan bir ad girmesi istenir. Ad girilmezse fonksiyon “Hello World” yazdırır. Aksi hâlde kullanıcı kişiselleştirilmiş bir “Hello” yanıtı alır.
Unutmayın, UDF’iniz için bir veya daha fazla fonksiyon parametresi tanımlayabilirsiniz. Bunu Fonksiyon Argümanları bölümünde daha ayrıntılı göreceksiniz. Ayrıca fonksiyonunuzun sonucu olarak bir veya birden fazla değer döndürebilirsiniz ya da hiç döndürmeyebilirsiniz.
return deyimi
hello() UDF’inizde bir şey yazdırdığınız için, bunu döndürmeniz gerekmediğini unutmayın. Yukarıdaki fonksiyonla bunun arasında fark olmaz:
Ancak fonksiyonunuzun sonucuyla çalışmaya devam etmek ve üzerinde işlemler denemek istiyorsanız, gerçekten bir değer döndürmek için return deyimini kullanmanız gerekir; bu bir String, bir tamsayı vb. olabilir. hello() fonksiyonunun "hello" String’ini döndürdüğü, hello_noreturn() fonksiyonunun ise None döndürdüğü aşağıdaki senaryoyu düşünün:
İkinci fonksiyon hata verir; çünkü None ile herhangi bir işlem yapamazsınız. NoneType (hello_noreturn() sonucundaki None) ile int (2) arasında çarpma işlemi yapılamayacağını belirten bir TypeError alırsınız.
İpucu fonksiyonlar bir return deyimiyle karşılaştıklarında, bir değer döndürmeseler bile, anında sonlanırlar:
return deyimiyle çalışırken bahsetmeye değer bir başka nokta da, birden fazla değer döndürmek için bunu kullanabileceğinizdir. Bunu yapmak için tuple’lardan yararlanırsınız.
Unutmayın, bu veri yapısı bir listeye çok benzer: Birden fazla değer tutabilir. Ancak tuple’lar değiştirilemezdir; yani içinde saklanan değerleri değiştiremezsiniz! Çift parantez () ile oluşturulur. Virgül ve atama operatörü yardımıyla tuple’ları birden fazla değişkene açabilirsiniz.
Fonksiyonunuzun birden fazla değeri nasıl döndürebileceğini anlamak için aşağıdaki örneğe bakın:
Not return sum, a deyimi, return (sum, a) ile aynı sonucu verir: İlki aslında sum ve a değerlerini kaputun altında bir tuple içine paketler!
Bir fonksiyon nasıl çağrılır
Önceki bölümlerde bir fonksiyonu nasıl çağıracağınıza dair pek çok örnek gördünüz. Bir fonksiyonu çağırmak, tanımladığınız fonksiyonu çalıştırmak demektir — doğrudan Python isteminden ya da başka bir fonksiyon içinden ("İç İçe Fonksiyonlar" bölümünde göreceğiniz gibi).
Yeni tanımladığınız hello() fonksiyonunu, aşağıdaki DataCamp Light bloğunda olduğu gibi, yalnızca hello() yazarak çağırın:
Bir Python fonksiyonuna docstring nasıl eklenir
Python’da fonksiyon yazmanın bir diğer önemli yönü: docstring’ler. Docstring’ler fonksiyonunuzun ne yaptığını, örneğin hangi hesaplamaları gerçekleştirdiğini veya ne döndürdüğünü açıklar. Bu açıklamalar, fonksiyon tanımındaki tüm kodu izlemek zorunda kalmadan, fonksiyonunuzu okuyan herkesin ne yaptığını anlamasını sağlayan belgelendirme işlevi görür.
Fonksiyon docstring’leri, fonksiyon başlığının hemen sonraki satırına ve üçlü tırnak işaretleri arasına yerleştirilir. hello() fonksiyonunuz için uygun bir Docstring ‘“Hello World” yazdırır’ olabilir.
def hello() -> None:
"""Prints "Hello World"."""
print("Hello World")
Not docstring’ler burada örnek olarak verilenden daha uzun olabilir. Docstring’leri daha ayrıntılı incelemek isterseniz, scikit-learn veya pandas gibi Python kütüphanelerinin Github depolarına göz atmanız en iyisidir; pek çok örnek bulacaksınız!
Tür ipuçları
Docstring’lerle yakından ilişkili — ve modern Python kodunda neredeyse onlar kadar yaygın — tür ipuçlarıdır. Python 3.5’ten beri, fonksiyonunuzun parametrelerini ve dönüş değerini beklenen türlerle açıklayabilirsiniz. İşte mümkün olan en basit örnek:
def plus(a: int, b: int) -> int:
return a + b
Her parametrenin ardından gelen : int “bu bir tamsayı olmalı” der ve parantezlerden sonra gelen -> int “bu fonksiyon bir tamsayı döndürür” anlamına gelir. Python bu açıklamaları çalışma zamanında kendisi zorunlu kılmaz — yine de plus()’a bir string geçebilirsiniz ve bir şeyler bozulana kadar Python şikâyet etmez. Ancak mypy, pyright ve VS Code ile PyCharm gibi editörlere yerleşik tip denetleyicileri bu ipuçlarını kullanarak kodunuzu çalıştırmadan önce hataları yakalar.
Daha karmaşık türler için, yerleşik jenerikleri doğrudan kullanabilir (Python 3.9+) veya typing modülünden içe aktarabilirsiniz:
def greet(names: list[str]) -> None:
for name in names:
print(f"Hello {name}")
def find_user(user_id: int) -> dict | None:
# returns the user dict, or None if not found
...
Python’da fonksiyon argümanları
Daha önce, parametreler ve argümanlar arasındaki farkı öğrendiniz. Kısaca, argümanlar herhangi bir fonksiyon ya da metod çağrısına verilen şeylerdir; fonksiyon ya da metod kodu bu argümanlara parametre adlarıyla atıfta bulunur. Python UDF’lerinin alabileceği dört tür argüman vardır:
- Varsayılan argümanlar
- Zorunlu argümanlar
- Anahtar sözcük argümanları
- Değişken sayıda argüman
Varsayılan Argümanlar
Varsayılan argümanlar, fonksiyon çağrısı sırasında bir argüman değeri verilmezse varsayılan bir değer alanlardır. Bu varsayılan değeri, aşağıdaki örnekte olduğu gibi = atama operatörüyle belirleyebilirsiniz:
Zorunlu Argümanlar
İsminin de çağrıştırdığı gibi, bir UDF’in zorunlu argümanları mutlaka bulunması gerekenlerdir. Bu argümanlar, fonksiyon çağrısı sırasında ve tam olarak doğru sırayla geçirilmelidir; aşağıdaki örnekte olduğu gibi:
Hata almadan fonksiyonu çağırmak için hem a hem de b parametrelerine karşılık gelen argümanlara ihtiyacınız vardır. a ile b’nin yerini değiştirirseniz sonuç farklı olmayacaktır; ancak plus()’u şu şekilde değiştirirseniz farklı olabilir:
Anahtar Sözcük Argümanları
Tüm parametreleri doğru sırayla çağırdığınızdan emin olmak isterseniz, fonksiyon çağrınızda anahtar sözcük argümanlarını kullanabilirsiniz. Bunları, argümanları parametre adlarıyla belirtmek için kullanırsınız. Bunu biraz daha netleştirmek için yukarıdaki örneği ele alalım:
Anahtar sözcük argümanlarını kullanarak, parametrelerin sırasını da değiştirebilir ve fonksiyonunuzu çalıştırdığınızda yine aynı sonucu elde edebilirsiniz:
Değişken Sayıda Argüman
Bir fonksiyona kaç argüman geçeceğinizi tam olarak bilmediğiniz durumlarda, *args ile şu söz dizimini kullanabilirsiniz:
Yıldız işareti (*), anahtar sözcük olmayan tüm değişken argümanların değerlerini tutan değişken adının önüne konur. Burada *varint, *var_int_args veya başka herhangi bir adı da plus() fonksiyonuna verebileceğinizi unutmayın.
İpucu: *args’ı yıldız içeren başka bir adla değiştirmeyi deneyin. Yukarıdaki kodun çalışmaya devam ettiğini göreceksiniz!
Yukarıdaki fonksiyonun, plus()’a geçirilen tüm argümanları toplamak için Python’un yerleşik sum() fonksiyonunu kullandığını görüyorsunuz.
Global ve yerel değişkenler
Genel olarak, bir fonksiyon gövdesi içinde tanımlanan değişkenler yerel kapsamda, dışında tanımlananlar ise global kapsamda olur. Bu, yerel değişkenlerin bir fonksiyon bloğu içinde tanımlandığı ve yalnızca o fonksiyon içinde erişilebilir olduğu; global değişkenlerin ise betiğinizdeki tüm fonksiyonlar tarafından erişilebilir olduğu anlamına gelir:
Fonksiyon gövdesi içinde tanımlanan yerel değişken total’ı yazdırmayı denediğinizde, name 'total' is not defined diyen bir NameError alırsınız. Öte yandan init değişkeni sorunsuz biçimde yazdırılabilir.
Yalnızca konumsal ve yalnızca anahtar sözcüklü parametreler
Python 3.8’den beri, fonksiyon imzanızda iki özel işaret kullanarak argümanların nasıl geçirilmesi gerektiği üzerinde daha fazla denetim sağlayabilirsiniz: / ve *. / işaretinden önce kalan her şey yalnızca konumsal olarak; * işaretinden sonra kalan her şey yalnızca anahtar sözcük ile geçirilebilir.
def greet(name, /, greeting="Hello", *, punctuation="!"):
print(f"{greeting} {name}{punctuation}")
Çağrı tarafında bunun nasıl göründüğü şöyle:
greet("Alice") # works
greet("Alice", greeting="Hi") # works
greet("Alice", "Hi", punctuation="?") # works
greet(name="Alice") # TypeError: name is positional-only
greet("Alice", "Hi", "?") # TypeError: punctuation is keyword-only
Bunu neden isteyesiniz? İki temel neden.
Birincisi, yalnızca konumsal parametreler, bunların adlarını daha sonra kimsenin kodunu bozmadan değiştirmenize olanak tanır — çünkü kimsenin parametre adını anahtar sözcük olarak kullanmasına izin verilmediğinden, onu değiştirmekte özgürsünüz.
İkincisi, yalnızca anahtar sözcüklü parametreler, çağıranların ne geçtikleri konusunda açık olmaya zorlar; bu da birden çok isteğe bağlı bayrak ya da ayara sahip olduğunuzda çağrıları daha okunur kılar.
Kısacası, amacı net şekilde dayatmanın temiz bir yoludur.
Python’da Anonim Fonksiyonlar
Anonim fonksiyonlar, Python’da standart def anahtar sözcüğü yerine lambda anahtar sözcüğü kullanılarak tanımlandıkları için lambda fonksiyonları olarak da adlandırılır.
Yukarıdaki DataCamp Light bloğunda, lambda x: x*2 anonim ya da lambda fonksiyonudur. x argümandır ve x*2 değerlendirilen ve döndürülen ifade ya da yönergedir. Bu fonksiyonu özel kılan, ilk bölümde gördüğünüz örneklerin aksine bir adına sahip olmamasıdır. Yukarıdaki fonksiyonu bir UDF olarak yazmanız gerekseydi, sonuç şu olurdu:
def double(x):
return x*2
İki argümanla çalıştığınız bir lambda fonksiyonu örneğini daha ele alalım:
Anonim fonksiyonları, kısa bir süreliğine adsız bir fonksiyona ihtiyaç duyduğunuz ve çalışma zamanında oluşturulduğu durumlarda kullanırsınız. Bunun özellikle anlamlı olduğu belli bağlamlar, filter(), map() ve reduce() ile çalıştığınız durumlardır:
filter() fonksiyonu, adının da önerdiği gibi, ilk girdi listeniz my_list’i >10 ölçütüne göre filtreler. Öte yandan map() ile bir fonksiyonu my_list listesinin tüm öğelerine uygularsınız. Bu örnekte tüm öğeleri 2 ile çarparsınız.
reduce() fonksiyonunun functools kütüphanesinin bir parçası olduğunu unutmayın. Bu fonksiyonu my_list listesinin öğelerine soldan sağa kümülatif olarak uygular ve diziyi tek bir değere indirgersiniz; bu örnekte bu değer 55’tir.
Python’da main() Fonksiyonunu Kullanma
Java gibi başka programlama dillerinde deneyiminiz varsa, fonksiyonları çalıştırmak için main fonksiyonunun gerekli olduğunu bilirsiniz. Yukarıdaki örneklerde gördüğünüz gibi Python’da bu zorunlu değildir. Ancak Python programınıza bir main() fonksiyonu eklemek, kodunuzu mantıksal olarak yapılandırmak için faydalı olabilir — en önemli bileşenlerin tümü bu main() fonksiyonu içinde toplanır.
Bir main() fonksiyonunu kolayca tanımlayabilir ve yukarıdaki diğer fonksiyonlarda yaptığınız gibi çağırabilirsiniz:
Ancak şu hâliyle, main() fonksiyonunuzun kodu, modül olarak içe aktardığınızda da çağrılacaktır. Bunun olmasını engellemek için, __name__ == '__main__' olduğunda main() fonksiyonunu çağırırsınız.
Bu, yukarıdaki kod bloğunun şu koda dönüşmesi anlamına gelir:
Not __main__ fonksiyonunun yanı sıra, bir sınıfın veya nesnenin örneğini başlatan __init__ fonksiyonuna da sahip olduğunuzu unutmayın. Basitçe ifade etmek gerekirse, yapıcı ya da başlatıcı gibi davranır ve bir sınıfın yeni bir örneğini oluşturduğunuzda otomatik olarak çağrılır. Bu fonksiyonla, yeni oluşturulan nesne, bu eğitimde daha önce gördüğünüz self parametresine atanır. Aşağıdaki örneğe bakın:
class Dog:
"""A simple Dog class.
Args:
legs: Number of legs so that the dog can walk.
color: The color of the fur.
"""
def __init__(self, legs: int, color: str) -> None:
self.legs = legs
self.color = color
def bark(self) -> str:
return "bark" * 2
if __name__ == "__main__":
dog = Dog(4, "brown")
print(dog.bark())
Python Fonksiyonlarını Pratik Etmeye Devam Edin
Tebrikler! Python’da fonksiyonlar üzerine bu kısa eğitimi tamamladınız. Diğer temel Python programlama konularını gözden geçirmek isterseniz, Data Types for Data Science kursunu kaçırmayın; burada listeler, sözlükler, tuple’lar, kümeler ve tarih-saat bilgisi üzerine bilginizi pekiştirip pratik yapacaksınız.
Python Fonksiyonları Hakkında Sık Sorulan Sorular
Python’da fonksiyon nedir?
Fonksiyon, belirli bir görevi yerine getiren, tekrar kullanılabilir bir kod bloğudur. Girdi alabilir, bunları işleyebilir ve çıktı döndürebilir.
Bir fonksiyon nasıl tanımlanır?
Python’da bir fonksiyon tanımlamak için def anahtar sözcüğünü kullanın, fonksiyonunuza bir ad verin, isteğe bağlı parametreleri parantez içinde belirtin, kodunuzu yazın ve isteğe bağlı olarak bir değer return edin.
Python’da fonksiyonlarla metodlar arasındaki fark nedir?
Fonksiyonlar bağımsızdır, metodlar ise sınıflara aittir. Tüm metodlar fonksiyondur; ancak tüm fonksiyonlar metod değildir.
Python’daki fonksiyon türleri nelerdir?
Python’da yerleşik fonksiyonlar (print() gibi), kullanıcı tanımlı fonksiyonlar (kendi oluşturduklarınız) ve anonim fonksiyonlar (kısa ömürlü lambda fonksiyonları) vardır.
Parametrelerle argümanlar arasındaki fark nedir?
Parametreler, fonksiyon tanımındaki yer tutuculardır; argümanlar ise fonksiyonu çağırırken verdiğiniz gerçek değerlerdir.
Lambda fonksiyonu nedir?
Lambda fonksiyonu, hızlı işler için tek satırlık, isimsiz bir fonksiyondur.
__main__ fonksiyonu neden kullanılır?
__main__ fonksiyonu, kodunuzu düzenli tutar ve belirli bölümlerin doğrudan çalıştırıldığında, içe aktarıldığında ise çalıştırılmadığından emin olur.
Global ve yerel değişkenler arasındaki fark nedir?
Global değişkenler her yerde çalışır, yerel değişkenler ise yalnızca tanımlandıkları fonksiyon içinde yaşar.
