ÜNİTE:
1.3. PROGRAMLAMA
KAZANIMLAR:
1.3.1.4. Değişkenleri ve sabitleri uygun şekilde kullanarak programlar geliştirir.
1.3.1.5. Girdilerin belirlendiği ve çıktıların gözlemlendiği programlar geliştirir.
PYTHON - FONKSİYONLAR - İLERİ DÜZEY
Temel Düzeyi Hatırlayalım
1. Fonksiyon Tanımı
Python’da bir fonksiyon, def anahtar kelimesi ile tanımlanır. Örnek bir fonksiyon:
Bu fonksiyon tanımlandıktan sonra çağrılarak çalıştırılabilir:
Parametresiz Fonksiyon
Parametresiz fonksiyonlar, dışarıdan herhangi bir bilgi almaz. Sadece tanımlandığı işi yapar.
3. Parametreli Fonksiyon
Parametreli fonksiyonlar, çağrılırken dışarıdan bilgi alır ve bu bilgiye göre işlem yapar.
4. Birden Fazla Parametre
Bir fonksiyon birden fazla parametre alabilir. Parametreler virgül ile ayrılır.
5. Varsayılan Parametreler
Bir parametreye varsayılan bir değer atanabilir. Eğer fonksiyon çağrılırken o parametreye bir değer verilmezse, varsayılan değer kullanılır.
Fonksiyonlar - İleri Seviye
KISIM
Fonksiyon Geri Dönüş İfadesi - return
Python'da bir fonksiyonda return ifadesi, bir fonksiyonun çağrıldığı yere değer döndürmesini sağlar. Yani, bir fonksiyon çalışmasını bitirdiğinde, elde ettiği sonucu return ile dışarıya gönderebilir.
1. return Nasıl Çalışır?
Bir fonksiyon tanımlayıp, işlemlerinin sonucunu return ile döndürebiliriz.
Örnek:
return a + b ifadesi, toplama(3, 5) çağrıldığında 8 değerini dışarıya döndürür.
Dönen bu değer, sonuc değişkenine atanır ve ekrana yazdırılır.
2. return Olmadan Ne Olur?
Eğer bir fonksiyon içinde return ifadesi kullanılmazsa, Python fonksiyonun varsayılan olarak None döndürdüğünü kabul eder.
Örnek:
3. Basit Dille return
Ne yapar?: Fonksiyonun dışarıya bir sonuç göndermesini sağlar.
Nasıl çalışır?: Fonksiyonun içinde yazılır ve sonucu return ile döndürür.
Döndürmezsek ne olur?: Fonksiyon varsayılan olarak None döner.
En Temel Örnek:
KISIM ÖZET VİDEO:
KISIM ALIŞTIRMALARI
1. Karesini Al ve Döndür
Bir sayıyı al, karesini hesapla ve sonucu döndür.
Açıklama:
def karesini_al(sayi) ile bir fonksiyon tanımladık. Bu fonksiyon, bir sayi parametresi alır.
sayi ** 2 ifadesi ile sayının karesini hesapladık.
Sonuç return ifadesiyle döndürüldü.
print(karesini_al(5)) çağrıldığında, fonksiyon 5'in karesini (25) döndürür ve ekrana yazdırır.
2. Toplama ve Çarpma
İki sayı al. Bu sayıların hem toplamını hem de çarpımını döndür.
Açıklama:
a ve b olmak üzere iki sayı parametresi alan bir fonksiyon oluşturduk.
return a + b, a * b ifadesiyle iki değeri birden döndürdük.
Dönen bu değerler bir tuple olarak gelir. toplam ve carpim değişkenlerine ayrı ayrı atadık.
islem(3, 4) çağrıldığında, (7, 12) döner ve ekrana yazdırılır.
3. Pozitif mi, Negatif mi?
Bir sayı al, pozitifse "Pozitif", negatifse "Negatif", sıfırsa "Sıfır" döndür.
Açıklama:
sayi parametresi alır ve sayının pozitif mi, negatif mi, yoksa sıfır mı olduğunu kontrol eder.
if bloğuyla pozitifse "Pozitif", elif ile negatifse "Negatif", else ile sıfırsa "Sıfır" döndürülür.
Örneğin, kontrol(5) çağrıldığında sayı pozitif olduğu için "Pozitif" döndürülür.
4. En Büyük Sayıyı Bul
Üç sayı al ve en büyüğünü döndür.
Açıklama:
sayi1, sayi2 ve sayi3 parametreleri alır.
max() fonksiyonu, verilen sayıların en büyüğünü bulur.
return ile en büyük sayı döndürülür.
Örneğin, en_buyuk(3, 7, 5) çağrıldığında en büyük sayı 7 olduğu için 7 döner.
5. Sayı Çift mi?
Bir sayı al ve çiftse True, tekse False döndür.
Açıklama:
sayi parametresi alır ve sayının 2 ile bölümünden kalanını kontrol eder (% operatörü).
sayi % 2 == 0 ifadesi, sayı çiftse True, tekse False döner.
Örneğin, cift_mi(4) çağrıldığında 4 çift olduğu için True döner.
KISIM ALIŞTIRMALARI ÖZET VİDEO:
KISIM
args (pozisyonel argümanlar- tuple'ye dönüştürür) ve *kwargs (keyword arguments - anahtar değer çiftleri - sözlüğe dönüştürür )
Fonksiyon ile Toplama İşlemini Hatırlayalım
1. *args (Pozisyonel Argümanlar)
*args, bir fonksiyona istediğin kadar pozisyonel argüman (sıralı veri) göndermek istediğinde kullanılır.
Fonksiyona gelen bu argümanlar, bir tuple (demet) içinde saklanır.
Örnek:
args kullanarak, fonksiyonu sabit bir sayıdaki parametre yerine esnek bir şekilde birden fazla parametreyi kabul edecek şekilde yazabilirsiniz.
Bir fonksiyonun kaç tane sayıyı toplaması gerektiğini bilmiyorsak: İşte args ile aynı işlemi yapan bir örnek:
Açıklama:
*args: Fonksiyon, birden fazla argüman kabul eder ve bu argümanları bir tuple olarak alır.
sum(args): args içinde verilen tüm sayıları toplar.
Daha fazla veya daha az parametre vererek aynı kodu kullanabilirsiniz.
Not:
args ismi bir kural değildir; istediğin ismi kullanabilirsin. Ancak, genelde *args yazılır.
2. **kwargs (Anahtar-Değer Argümanları)
Anahtar Değer Girişi Yapılabilen Fonksiyon Yazalım
Eğer kullanıcı belirtilen parametrelerin dışında bir şey gönderirse?
Eğer fonksiyonda **kwargs belirtilmezse, sadece fonksiyon tanımındaki belirli parametreler geçilebilir. Yani sadece fonksiyonda tanımlanan parametreler beklenir. Aksi takdirde, eksik veya fazla argüman gönderildiğinde hata alınır.
Örneğin, aşağıdaki fonksiyon hatalıdır, çünkü kwargs tanımlı değildir:
**kwargs, bir fonksiyona istediğin kadar anahtar-değer çifti göndermek istediğinde kullanılır.
Gelen tüm anahtar-değer çiftleri bir sözlük (dictionary) içinde saklanır.
Örnek:
Aşağıdaki kod, Python'da **kwargs kullanarak anahtar-değer çiftlerini nasıl işleyebileceğinizi göstermektedir. Bu örnekte kisi_bilgileri fonksiyonu, verilen argümanları bir sözlük (dictionary) gibi alır ve her bir anahtar-değer çiftini yazdırır.
Açıklama:
**kwargs:
Fonksiyon, anahtar-değer çiftlerini alır ve bunları bir sözlük (dictionary) olarak işler.
Örneğin, isim="Ahmet" çağrısı kwargs sözlüğüne {"isim": "Ahmet"} olarak eklenir.
for anahtar, deger in kwargs.items():
kwargs.items() ile sözlüğün anahtar ve değerlerini döngüyle alırız.
print(f"{anahtar}: {deger}"):
Her bir anahtar ve değer çiftini yazdırırız.
Bu kodun esnekliği:
**kwargs sayesinde fonksiyon, herhangi bir sayıda ve isimde argüman alabilir. Örneğin:
3. args ve *kwargs Birlikte Kullanımı
Bir fonksiyon hem pozisyonel hem de anahtar-değer argümanları aynı anda alabilir.
Örnek:
Nasıl çalışır?
*args, sıralı olarak verilen argümanları tuple içinde toplar: (1, 2, 3)
**kwargs, anahtar-değer çiftlerini bir sözlük içinde toplar: {'isim': 'Ali', 'yas': 25}
4. args ve *kwargs Kullanımının Avantajı
Bu yapıların en büyük avantajı, esnek olmalarıdır. Fonksiyona kaç tane argüman geçileceğini önceden bilmenize gerek yoktur.
Örnek:
Bir matematiksel işlemi (örneğin, toplama) esnek şekilde yapalım:
Ya da birden fazla bilgi yazdırmak için:
Özet:
*args: Sınırsız sayıda pozisyonel argüman alır ve bunları bir demet (tuple) olarak saklar.
**kwargs: Sınırsız sayıda anahtar-değer çifti alır ve bunları bir sözlük (dictionary) olarak saklar.
İkisini bir arada kullanarak, bir fonksiyona istediğin kadar esnek veri gönderebilirsin.
KISIM ÖZET VİDEO
KISIM ALIŞTIRMALARI
1. *args ile Toplama Fonksiyonu
Birden fazla sayı alan bir fonksiyon yazın ve bu sayıları toplayarak sonucu döndürün.
Açıklama:
*args, pozisyonel argümanları bir tuple (demet) içinde toplar. Örneğin: toplama(1, 2, 3) çağrıldığında args şu hale gelir: (1, 2, 3).
Python'daki sum() fonksiyonu, bu tuple'ın elemanlarını toplar ve sonucu döndürür.
2. **kwargs ile Kişi Bilgileri
Kişi bilgilerini (isim, yaş, şehir gibi) anahtar-değer çifti olarak alan bir fonksiyon yazın ve bu bilgileri ekrana yazdırın.
Açıklama:
**kwargs, anahtar-değer çiftlerini bir sözlük (dictionary) içinde toplar. Örneğin: {'isim': 'Ali', 'yas': 25, 'sehir': 'Ankara'}.
kwargs.items() ile sözlüğün anahtar ve değerlerini alıyoruz.
Döngüde, print(f"{anahtar}: {deger}") ile her bir anahtar ve değer ayrı ayrı yazdırılıyor.
3. Hem args Hem *kwargs Kullanımı
Bir fonksiyon yazın, pozisyonel argümanları (args) ve anahtar-değer argümanlarını (kwargs) ayrı ayrı ekrana yazdırsın.
Açıklama:
*args ile verilen pozisyonel argümanlar (1, 2, 3) olarak tuple içinde saklanır.
**kwargs ile verilen anahtar-değer çiftleri {'isim': 'Zeynep', 'yas': 30, 'meslek': 'Mühendis'} olarak bir sözlükte saklanır.
Fonksiyon bunları ayrı ayrı ekrana yazdırır.
4. En Büyük Sayıyı Bulma (*args)
Birden fazla sayı alan ve bu sayılar arasındaki en büyüğünü döndüren bir fonksiyon yazın.
Açıklama:
*args, pozisyonel argümanları bir tuple içinde saklar. Örneğin: en_buyuk(1, 5, 3, 9, 2) çağrıldığında args şu hale gelir: (1, 5, 3, 9, 2).
max() fonksiyonu, bu tuple'daki en büyük elemanı bulur ve sonucu döndürür.
5. Anahtar Kelimeye Göre Yazdırma (**kwargs)
Bir fonksiyon yazın, yalnızca belirli bir anahtar kelimenin (örneğin "isim") değerini yazdırsın.
Açıklama:
**kwargs, fonksiyona gönderilen anahtar-değer çiftlerini bir sözlükte saklar.
if "isim" in kwargs kontrolü, sözlükte "isim" anahtarının olup olmadığını kontrol eder.
Eğer varsa, kwargs['isim'] ile bu anahtarın değerini yazdırır.
Yoksa "İsim bulunamadı." mesajını ekrana yazdırır.
KISIM ALIŞTIRMALARI ÖZET VİDEO:
3.KISIM
a) Lambda (Anonim Fonksiyonlar) Nedir?
Lambda fonksiyonları, tek satırlık ve hızlıca tanımlanabilen anonim (isimsiz) fonksiyonlardır.
Normal bir def ile fonksiyon tanımlamaya benzer, ancak adı yoktur.
Kısa ve basit işlemler için kullanılır.
Tek bir ifade (expression) içerir ve sonucu otomatik olarak döndürür.
Genel Yapısı:
Basit Bir Örnek:
Görev: Verilen bir sayıyı ikiyle çarpan bir lambda fonksiyonu yazın.
Kod:
Açıklama:
lambda x: x * 2: x giriş değişkenidir ve bu değer ikiyle çarpılarak döndürülür.
ikiyle_carp(5): Fonksiyon 5 girdisiyle çağrılır ve sonucu döndürür.
Lambda fonksiyonları genellikle kısa ve tekrarlayan işlemleri sadeleştirmek için kullanılır. Örneğin, bir liste üzerindeki işlemlerde veya diğer fonksiyonlara parametre olarak verilir.
a) LAMBDA FONKSİYONLARI ÖZET VİDEO
b) Fonksiyonlar İçinde Fonksiyon Nedir?
Bir fonksiyonun içinde başka bir fonksiyon tanımlamak mümkündür. Buna iç içe fonksiyonlar veya nested functions denir.
İç fonksiyonlar, sadece dış fonksiyonun içinde kullanılabilir.
Kodun düzenlenmesine ve dış fonksiyonun işlevini destekleyen yardımcı işlevlerin gizlenmesine yardımcı olur.
Basit Örnek:
Görev: Bir sayının karesini hesaplayıp, sonucu ikiyle çarpan bir fonksiyon yazın.
Kod:
Açıklama:
Dış Fonksiyon: dis_fonksiyon bir sayıyı alır (x).
İç Fonksiyon: kare_al yalnızca dış fonksiyonun içinde tanımlıdır ve bir sayının karesini hesaplar.
İşlem: dis_fonksiyon, kare_al fonksiyonunu çağırarak karesi alınan sonucu ikiyle çarpar.
B) FONKSİYON İÇİNDE FONKSİYON ÖZET VİDEO
c) Rekursif (Özyinelemeli) Fonksiyon Nedir?
Bir rekursif (özyinelemeli) fonksiyon, kendisini tekrar tekrar çağırarak bir sorunu çözen bir fonksiyondur. Bu tür fonksiyonlar genellikle bir durdurma koşulu içerir. Durdurma koşulu, fonksiyonun sonsuz döngüye girmesini engeller.
Önemli Noktalar:
Fonksiyon kendisini çağırır.
Her çağrıda problem daha basit bir hale gelir.
Durdurma koşulu ile sonlanır.
Basit Örnek: Faktöriyel Hesaplama
Faktöriyel, pozitif bir tam sayının, kendisi ve kendisinden küçük olan tüm pozitif tam sayıların çarpımıdır. Rekursif olarak şöyle tanımlanabilir:
Kod:
Açıklama:
Bu kodda:
Eğer n 0 veya 1 ise, doğrudan 1 döndürülür.
Eğer n 1'den büyükse, n ile (n-1) faktöriyeli çarpılarak rekursif çağrı yapılır.
Basit Kullanım Alanları:
Matematiksel işlemler (faktöriyel, Fibonacci dizisi).
Dosya/dizin yapısı gibi iç içe geçmiş veri yapılarının işlenmesi.
Problemleri alt problemlere bölerek çözmek.
c) REKURSİF FONKSİYONLARI ÖZET VİDEO
d) Dekoratör Nedir?
Dekoratörler, Python'da fonksiyonların işlevselliğini değiştirmek veya genişletmek için kullanılan, bir fonksiyonu bir başka fonksiyona "saran" yapılardır.
Bir dekoratör, bir fonksiyonu argüman olarak alır ve genelde yeni bir fonksiyon döndürür.
Dekoratörler, özellikle kod tekrarını azaltmak ve fonksiyonlara dinamik olarak davranış eklemek için kullanılır.
Genel Yapısı:
Basit Örnek: Fonksiyon Çalışmasını İzleme
Görev: Bir dekoratör ile bir fonksiyonun çalıştığını konsola yazdırın.
Kod:
Çıktı:
Açıklama:
Dekoratör Fonksiyonu: bilgi_ekle adında bir dekoratör tanımlandı. Bu dekoratör, hedef fonksiyonu saran ve öncesine/sonrasına ek işlem yapan bir saran_fonksiyon içeriyor.
@bilgi_ekle Kullanımı: @bilgi_ekle ile merhaba_de fonksiyonunun üstüne yazılarak, merhaba_de artık dekoratörün içinde çalışır.
Fonksiyonun Sarılması:
Önce "Fonksiyon çalışmaya başladı." yazılır.
Ardından orijinal fonksiyon (merhaba_de) çağrılır.
Son olarak "Fonksiyon çalışmayı bitirdi." yazılır.
Dekoratörler daha karmaşık işlevler için de kullanılabilir:
Yetkilendirme kontrolleri
Hata yönetimi
Zaman ölçümü gibi işlemler.
d) DEKORATÖR FONKSİYONLARI ÖZET VİDEO
e) Yerel ve Global Değişkenler Nedir?
Python'da bir değişkenin erişim alanı (scope), nerede tanımlandığına bağlıdır:
Global Değişkenler:
Fonksiyonların dışında tanımlanır.
Tüm kod boyunca erişilebilir.
Fonksiyon içinde kullanılabilir, ancak değeri değiştirilmek istenirse global anahtar kelimesi kullanılmalıdır.
Yerel Değişkenler:
Bir fonksiyonun içinde tanımlanır.
Sadece o fonksiyon içinde geçerlidir.
Fonksiyonun dışından erişilemez.
Basit Örnek
Görev: Yerel ve global değişkenlerin nasıl çalıştığını göstermek.
Çıktı:
Açıklama:
Global Değişken: x, fonksiyon dışında tanımlandığı için her yerden erişilebilir.
Yerel Değişken: y, sadece ornek_fonksiyon içinde tanımlandığı için sadece bu fonksiyon içinde kullanılabilir.
Fonksiyon Dışında Yerel Değişkene Erişim: print(y) gibi bir işlem hata verir, çünkü y fonksiyon dışında tanınmaz.
Global Değişkeni Fonksiyon İçinde Değiştirmek
Çıktı:
e) Yerel ve Global Değişkenler ÖZET VİDEO
f) Fonksiyona gönderilen parametrenin tipini kontrol etme
Python'da bir fonksiyona belirli bir veri tipini engellemek için, parametrelerin türlerini kontrol ederek bir hata mesajı oluşturabilirsiniz. Bunun için Python'un type() fonksiyonunu ve raise anahtarını kullanabilirsiniz.
Python'da raise, bir hata fırlatmak (exception raise) için kullanılan bir anahtar kelimedir. Hata durumlarında, programın çalışmasını durdurmak ve belirli bir hata mesajı ile uyarıda bulunmak için kullanılır.
raise Nasıl Kullanılır?
raise genellikle bir hata türü (örneğin ValueError, TypeError) ile birlikte kullanılır. Böylece programda istenmeyen bir durum tespit edildiğinde, kullanıcıya anlamlı bir hata mesajı fırlatmak mümkündür.
Python'da TypeError, bir işlem veya fonksiyonun yanlış bir türde veri ile çalıştırılmaya çalışıldığı durumlarda oluşan bir hata türüdür. Örneğin, bir string (metin) ile bir tam sayı (int) arasında toplama gibi bir işlem yapmaya çalışırsanız bu hata fırlatılır.
Python'da type() fonksiyonu, bir nesnenin türünü (type) öğrenmek için kullanılır. Bu fonksiyon, bir değerin hangi veri tipine (örneğin int, float, str, list, vb.) ait olduğunu döner.
Basit Örnek
Çıktı:
Açıklama:
param adında bir parametre alan fonksiyon adında bir fonksiyon tanımladık.
type(param) ifadesi, param değişkeninin veri türünü döndürür.
type(param) is float ifadesi, param'ın türünün tam olarak float olup olmadığını kontrol eder.
Eğer param bir float ise, raise TypeError ile bir hata döndürülür. Bu, programın çalışmasını durdurur ve kullanıcıya bir hata mesajı gösterir: "Bu fonksiyona float türünde bir değer gönderilemez."
Eğer param bir float değilse, bu satır çalışır ve param değerini ekrana yazdırır.
Neden Kullanılır?
Bu kontrol, fonksiyona istenmeyen veri tiplerinin gönderilmesini engellemek için kullanılır.
Hata durumunda kullanıcıya açıklayıcı bir mesaj verir, bu da hatanın sebebini anlamayı kolaylaştırır.
e) FONKSİYON PARAMETRESİNİ KONTROL ETME ÖZET VİDEO
3. KISIM ALIŞTIRMALARI
a. Lambda (Anonim Fonksiyonlar)
Alıştırma: Bir lambda fonksiyonu yazın. Verilen bir sayıyı 3 ile çarpsın. Ardından 2 sayının sonucu üzerinden işlemi test edin.
Açıklama:
Lambda fonksiyonu x giriş değişkenini 3 ile çarpar.
uc_ile_carp(4) fonksiyonu 4 girişini alır ve sonucu hesaplar: 4×3=124 \times 3 = 124×3=12.
Aynı işlem 7 için de tekrarlanır: 7×3=217 \times 3 = 217×3=21.
b. Fonksiyonlar İçinde Fonksiyon
Alıştırma: Bir dış fonksiyon yazın, bu fonksiyonun içinde bir iç fonksiyon tanımlayın. İç fonksiyon verilen bir sayıyı karesiyle çarpsın.
Açıklama:
ic_fonksiyon, bir sayının karesini hesaplar.
dis_fonksiyon, sayıyı karesiyle çarpar.
3×(32)=3×9=273 \times (3^2) = 3 \times 9 = 273×(32)=3×9=27 sonucunu döndürür.
c. Rekursif (Özyinelemeli) Fonksiyonlar
Alıştırma: Verilen bir sayının 1'e kadar olan toplamını rekursif olarak hesaplayan bir fonksiyon yazın.
Açıklama:
Fonksiyon, kendini çağırarak n+(n−1)n + (n-1)n+(n−1) şeklinde toplar.
toplam(4)=4+3+2+1=10toplam(4) = 4 + 3 + 2 + 1 = 10toplam(4)=4+3+2+1=10.
d. Dekoratörler
Alıştırma: Bir dekoratör yazın, bir fonksiyon çalışmadan önce "Başlıyoruz" yazsın, çalıştıktan sonra "Bitti" yazsın.
Açıklama:
@mesaj_dekoratoru ile merhaba fonksiyonu sarılır.
Fonksiyon çalışmadan önce "Başlıyoruz", çalıştıktan sonra "Bitti" yazdırılır.
e. Yerel ve Global Değişkenler
Alıştırma: Bir global değişken tanımlayın ve bir fonksiyon içinde bu değişkeni değiştirin.
Açıklama:
x global olarak 5 olarak tanımlanır.
global_degis fonksiyonu, global anahtar kelimesiyle x değişkenini 10 yapar.
Sonuçta x fonksiyon dışında da değişmiş olur.
f) Fonksiyona gönderilen parametrenin tipini kontrol etme
Alıştırma:
Bir fonksiyon yazın:
Fonksiyonun adı say_number olsun.
Bu fonksiyon bir parametre alacak.
Eğer parametre bir tam sayı (int) değilse, TypeError fırlatsın ve "Sadece tam sayılar kabul edilir." mesajını göstersin.
Eğer parametre bir tam sayıysa, ekrana "Sayı: <parametre değeri>" yazdırsın.
Açıklama:
say_number fonksiyonu, num adında bir parametre alır.
type(num) is not int ifadesi, num'un türünün int olup olmadığını kontrol eder. Eğer num bir int değilse, bir TypeError fırlatır ve fonksiyon sonlanır.
Eğer num bir int ise, parametreyi ekrana yazdırır.
KISIM ALIŞTIRMALARI ÖZET VİDEO:
Ödev:
Bir fonksiyon yazın, yalnızca belirli bir anahtar kelimenin (örneğin "isim") değerini yazdırsın ve oluşturduğunuz kodların fotoğrafını aşağıdaki mail adresine gönderiniz.
Maile isim soy isim, sınıf ve okul numarası bilgilerinizi yazmayı unutmayınız.
egitimdebil@gmail.com
Önerilen program: IDE - PYTHON (Bilgisayarla çalışmayanlar, kodları deftere yazıp fotoğrafını gönderebilirler.)
Bilişim Teknolojileri Öğretmeni: İshak BEZCİ
Son gün ve saat : Pazar gece 12.00
Comments