🔮Fonksiyonlar

Python üzerinde fonksiyonlar ve metotlar

👀 Hızlı Bakış

  • 👬 Fonksiyonlara değişken değerlerinin kopyası gönderilir

  • 💁‍♂️ Parametre olarak aldıkları objelerin içeriğini değiştirebilirler, ama kendisini değiştiremezler

  • ✨ Parametre değerleri tanımlandıkları anda atanır, her çağırıldığında değil

  • ⚡ Varsayılan parametre değerleri değiştirilemez değerler olmalıdır, aksi halde sorunlar oluşur

‍‍🧙‍♂ Detaylı bilgi için 📖 Mutable Default Arguments alanına bakabilirsin.

✨ Oluşturma

  • 🆔 Fonksiyon ismi eşsiz olmalıdır, override yapısını python desteklemez

  • 💎 Parametreler tip belirtmeden de yazılabilir

  • 📝 Dokümantasyon için fonksiyonun tanımlandığı satırın altına """ karakterleri arasına içerik yazılır

  • return yapısı ile sonuçlarını döndürürler

📢 Kodların derlenme yapısı yukarıdan aşağı olduğu için fonksiyonlar, yukarıda (önceden) tanımlanmadan kullanılamaz.

def function_name(parameters):
  """docstring"""
  statement(s)

💎 Parametreler

  • ⚡ Fonksiyonlar tanımlandığı vakit varsayılan atamalar yapılır.

  • 🚄 *args, **kwargs şeklinde list ve dict elemanları alan parametreler tanımlanabilir

  • 🆔 Parametre tipler param: type şeklinde belirtiliebilir ama zorunlu değildir

‍🧙‍♂ Detaylı bilgi için Function Parameter Types in Python yazısına bakabilirsin.

def greet(name, msg = "Good morning!"):
   """
   This function greets to
   the person with the
   provided message.

   If message is not provided,
   it defaults to "Good
   morning!"
   """

   print("Hello",name + ', ' + msg)

greet("Kate") # Varsayılan parametreyi kullanma
greet("Bruce","How do you do?") # Sıralı parametre verme
greet("Bruce", msg="Naber") # İşaretleyerek paremetre verme
# Değerlerin kopyalanması
def increase(a):
	return a + 2

a = 5
b = increase(a)  # 7
print(a)  # 5

♿ Erişebilirlik

  • 🙄 Python üzerinde private ve public yapısı derleyici tarafından kontrol edilmez

  • ⚖️ Kodun anlaşılabilirliği artırmak için programcılar tarafından belirlenen kurallardır

  • 🌫️ __ ile başlayan fonksiyonlar private olarak algılanır, sınıf dışında önerilerde gözükmezler

  • 🌃 _ ile başlayan fonksiyonlar dosya içinde public dosya dışında private olarak ifade edilir (interval)

🧱 Türler

def calc_factorial(x):
    """This is a recursive function
    to find the factorial of an integer"""

    if x == 1:
        return 1
    else:
        return (x * calc_factorial(x-1))

num = 4
print("The factorial of", num, "is", calc_factorial(num))
calc_factorial(4)              # 1st call with 4
4 * calc_factorial(3)          # 2nd call with 3
4 * 3 * calc_factorial(2)      # 3rd call with 2
4 * 3 * 2 * calc_factorial(1)  # 4th call with 1
4 * 3 * 2 * 1                  # return from 4th call as number=1
4 * 3 * 2                      # return from 3rd call
4 * 6                          # return from 2nd call
24                             # return from 1st call

💚 Özyineleyen Fonksiyonların Avantajları

  • Özyineleyen fonksiyonlar kodun daha temiz ve zarif gözükmesini sağlar

  • Karmaşık bir görev alt görevlere ayrılarak rahat çözülebilir

  • İç içe döngülere göre daha iyidir

💔 Özyineleyen Fonksiyonların Zararları

  • Bazı durumlarda anlaşılabilmesi zordur

  • Uzun tekrarlarda çok fazla vakit ve zaman harcarlar

  • Hata ayıklama oldukça zordur

🌇 Global, Local ve Nonlocal

Kavram
Açıklama
Erişim

global

Tüm modülde geçerli değişkenler

Okuma

local

Fonksiyonların içerisindeki yerel değişkenler

Okuma ve Yazma

nonlocal

Modül ile fonksiyon arasında kalan, genellikle iç içe fonksiyonlarda kullanılan değişkenler

🏃‍♂️ Hız Hakkında

  • Fonksiyonlarda işlem yapılma hızı, manuel (kod satırı olarak) işlem yapılmasından daha hızlıdır.

  • ~%80 daha hızlı çalıştığını script üzerinden görebilirsiniz

  • Bu değer bilgisayar donanımınıza göre değişiklik gösterecektir

  • Hafızayı (memorial) kullanan fonksiyonlar tekrarlı (recursive) fonksiyonlardan daha hızlıdır.

Ek kaynaklar:

from time import time

# Obje uzunluğu
RANGE = 1000

# Toplam test sayısı
TEST_RANGE = 10000

# Fonksiyonun yavaş kaldığı testlerin sayısı
func_slow_count = 0

# Objeyi oluşturma
data1 = [i for i in range(RANGE)]
data2 = [i for i in range(RANGE)]
data3 = [i for i in range(RANGE)]

avg_func_speed = 0
for test in range(TEST_RANGE):
    first_time = time()

    # Normal işleme
    data = []
    for test2 in range(len(data1)):
        data.append(data1[test2])
    for test2 in range(len(data2)):
        data.append(data2[test2])
    for test2 in range(len(data3)):
        data.append(data3[test2])

    normal_time = time() - first_time

    # Fonksiyon ile işleme
    def fdata(data1, data2, data3):
        data = []
        for test2 in range(len(data1)):
            data.append(data1[test2])
        for test2 in range(len(data2)):
            data.append(data2[test2])
        for test2 in range(len(data3)):
            data.append(data3[test2])
        return data

    data = [i for i in range(RANGE)]

    first_time = time()

    # Fonksiyon ile veri atama
    fdata = fdata(data1, data2, data3)

    func_time = time() - first_time

    if normal_time - func_time < 0:
        func_slow_count += 1

    avg_func_speed = (
        avg_func_speed * test + (normal_time / func_time - 1) * 100
    ) / (test + 1)

print("Fonksiyon işlemi normalden %" + "%.2f daha hızlı, testlerde " % avg_func_speed + "%" + "%.2f ihtimalle yavaş kalmıştır." %
      (func_slow_count * 100 / TEST_RANGE))

💠 Dahili ve Harici Fonksiyonlar

  • Dahili fonksiyonlar, python ile gelen hazır fonksiyonlardır ve direkt olarak kullanılabilirler

  • Harici fonksiyonları kullanmadan önce import <paket> ile paketi dahil etmeniz lazım

  • Fonksiyonların kullanımı <paket>.<fonksiyon> şeklindedir

Fonksiyon
Açıklama
Örnek
Çıktı

print(<string>)

Ekrana yazma

print("X: {1}, Y: {2}")

X: {1}, Y: {2}

print('\r' + <string>, end='')

Satır başına yazı yazma

sum, len

Toplama, uzunluk, ortalama

sum([1, 2, 3])

5

eval(<string>)

Verilen stringi hesaplama

eval("x + 5")

6

type(<obje>)

Objenin türünü bulma

type(x)

<class 'number'>

enumerate(<obje>, <si>)

Numaralandırma

i, line in enumerate(file, 0)

string = "Yemreak"
for i, char in enumerate(string):
  print(i, char)

# 0 Y
# 1 e
# 2 m
# ...

Last updated

© 2024 ~ Yunus Emre Ak ~ yEmreAk