Dersler

View on GitHub

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)

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

  1. Bir sayının asal olup olmadığını döndüren asal_mi fonksiyonunu yazın.
  2. Bir listedeki en küçük ve en büyük değeri tuple olarak döndüren fonksiyon yazın.
  3. Dikdörtgen alanı hesaplayan fonksiyona pozitif kenar doğrulaması ekleyin.
  4. İki eşit uzunluklu gerilim ve akım listesinden zip ile güç listesi üretin.
  5. Karmaşık sayıların genliklerine göre sıralanmasını key ve lambda ile sağlayın.