EEM-241 İleri Düzey Programlama
2024-2025 Güz Dönemi
Ders 8 - Fonksiyonlar, Modüller ve Eşzamanlı Dolaşma
1. Neden fonksiyon?
Fonksiyonlar tekrarları azaltır, programı küçük parçalara ayırır ve test etmeyi kolaylaştırır.
def topla(a, b):
return a + b
sonuc = topla(5, 7)
print(sonuc)
aveb: parametre5ve7: argümanreturn: sonucu çağıran koda geri gönderir
print ekrana yazar; return değeri programın başka bir yerinde kullanılabilir kılar.
def daire_alani(yaricap):
import math
return math.pi * yaricap ** 2
toplam_alan = daire_alani(2) + daire_alani(3)
print(toplam_alan)
2. Belgeleme ve tür ipuçları
def uzaklik(a: tuple, b: tuple) -> float:
"""İki boyutlu iki nokta arasındaki Öklid uzaklığını döndürür."""
x1, y1 = a
x2, y2 = b
return ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5
print(uzaklik((1, 1), (4, 5)))
help(uzaklik)
Tür ipuçları denetimi zorunlu kılmaz; okuyucuya ve geliştirme araçlarına bilgi verir.
3. Varsayılan ve anahtar kelimeli argümanlar
def kuvvet(taban, us=2):
return taban ** us
print(kuvvet(5))
print(kuvvet(5, 3))
print(kuvvet(us=3, taban=5))
Varsayılan değeri olan parametreler, zorunlu parametrelerden sonra yazılır.
4. Değişken sayıda argüman
def topla(*sayilar):
toplam = 0
for sayi in sayilar:
toplam += sayi
return toplam
print(topla(1, 2))
print(topla(1, 2, 3, 4, 5))
def bilgi_yazdir(**bilgiler):
for anahtar, deger in bilgiler.items():
print(f"{anahtar}: {deger}")
bilgi_yazdir(isim="Ali", bolum="EEM", sinif=2)
5. Fonksiyon tasarlama ve doğrulama
def ortalama(sayilar):
"""Boş olmayan bir sayı koleksiyonunun ortalamasını döndürür."""
if len(sayilar) == 0:
return None
return sum(sayilar) / len(sayilar)
print(ortalama([10, 20, 30]))
print(ortalama([]))
Bir fonksiyonun farklı durumlarını küçük çağrılarla sınayın:
assert topla(2, 3) == 5
assert uzaklik((0, 0), (3, 4)) == 5
assert ortalama([]) is None
6. Yerel ve global kapsam
a = 1
def ornek():
a = 2 # yalnızca fonksiyon içinde geçerli yerel değişken
print("Fonksiyon içi:", a)
ornek()
print("Fonksiyon dışı:", a)
Fonksiyonların mümkün olduğunca parametre alıp sonuç döndürmesi tercih edilir. global ile dış değişkeni değiştirmek kodu izlemeyi ve test etmeyi zorlaştırır.
sayac = 0
def artir(deger):
return deger + 1
sayac = artir(sayac)
7. Lambda ifadeleri
Lambda, kısa ve tek ifadeli anonim fonksiyonlar içindir.
topla = lambda x, y: x + y
print(topla(1, 4))
En yaygın kullanım, sıralama anahtarı gibi kısa bir davranış vermektir:
noktalar = [(3, 2), (1, 4), (5, 1)]
noktalar.sort(key=lambda nokta: nokta[1])
print(noktalar)
Karmaşık işlemde normal def daha okunaklıdır.
8. Modüller ve kütüphaneler
import math
print(math.pi)
print(math.sqrt(16))
print(math.factorial(10))
from math import sin, radians
for derece in range(0, 360, 30):
print(f"{derece:3}: {sin(radians(derece)):.2f}")
Genellikle import math biçimi, ismin hangi modülden geldiğini açık tuttuğu için okunaklıdır.
Rastgele ölçüm verisi
import random
olcumler = [random.randint(0, 10) for _ in range(20)]
frekanslar = {deger: olcumler.count(deger) for deger in range(11)}
print(olcumler)
print(frekanslar)
9. enumerate
Hem elemana hem indeksine ihtiyaç olduğunda sayaç değişkeni yerine enumerate kullanılır.
metin = "Python"
for indeks, karakter in enumerate(metin):
print(f"{indeks}: {karakter}")
dersler = ["Devre", "Programlama", "Elektronik"]
for sira, ders in enumerate(dersler, start=1):
print(f"{sira}. {ders}")
10. zip
Birden fazla koleksiyonu eşzamanlı dolaşmak için kullanılır.
a = [1, 4, 3, 2, 1]
b = [3, 2, 2, 3, 4]
toplamlar = []
for x, y in zip(a, b):
toplamlar.append(x + y)
print(toplamlar)
kisiler = ["Mehmet", "Ali", "Ahmet", "Ayşe"]
sehirler = ["Isparta", "Burdur", "Antalya", "Denizli"]
for kisi, sehir in zip(kisiler, sehirler):
print(f"{kisi}: {sehir}")
zip, varsayılan olarak en kısa koleksiyon bittiğinde durur.
kisi_sehir = dict(zip(kisiler, sehirler))
print(kisi_sehir)
11. Mühendislik uygulaması: Karmaşık sayılar
z = 3 + 4j
print(z.real, z.imag)
print(z.conjugate())
print(abs(z))
import cmath
import math
def kutupsala_cevir(z):
genlik, aci_rad = cmath.polar(z)
return genlik, math.degrees(aci_rad)
def kartezyene_cevir(genlik, aci_derece):
return cmath.rect(genlik, math.radians(aci_derece))
print(kutupsala_cevir(3 + 4j))
print(kartezyene_cevir(5, 53.13))
Alıştırmalar
- Bir sayının asal olup olmadığını döndüren
asal_mifonksiyonunu yazın. - Bir listedeki en küçük ve en büyük değeri tuple olarak döndüren fonksiyon yazın.
- Dikdörtgen alanı hesaplayan fonksiyona pozitif kenar doğrulaması ekleyin.
- İki eşit uzunluklu gerilim ve akım listesinden
zipile güç listesi üretin. - Karmaşık sayıların genliklerine göre sıralanmasını
keyvelambdaile sağlayın.