• Sonuç bulunamadı

Fonksiyonların Belgelendirilmesi

13.6 ˙Istenen Sayıda ˙Isimli Argüman Kullanımı

13.11 Fonksiyonların Belgelendirilmesi

Su örne˘ge bir bakalım:

#!/usr/bin/env python

Burada gördü˘gümüz gibi, e˘ger kullanıcı 0 de˘gerini girerse, bu de˘ger listeye eklenmeyecek, Python hiçbir ¸sey yapmadan bu satırı atlayacaktır. ˙I¸ste pass buna benzer durumlarda, “hiçbir

¸

sey yapmadan yola devam et!” anlamı katar kodlarımıza.

Dedi˘gimiz gibi, pass deyiminin bu görevlerini daha önce ö˘grenmi¸stik. pass deyimini

yukarıdaki durumlar dı¸sında bir de ¸söyle bir durumda kullanabilirsiniz: Diyelim ki bir program yazıyorsunuz. Bu programda bir fonksiyon tanımlayacaksınız. Fonksiyonun isminin ne

olaca˘gına karar verdiniz, ama fonksiyon içeri˘gini nasıl yazaca˘gınızı dü¸sünmediniz. E˘ger program içinde sadece fonksiyonun ismini yazıp bırakırsanız programınız çalı¸sma sırasında hata verecektir. ˙I¸ste böyle bir durumda pass deyimi imdadınıza yeti¸sir. Bu deyimi kullanarak

¸

söyle bir ¸sey yazabilirsiniz:

def bir_fonksiyon():

pass

Fonksiyon tanımlarken fonksiyon gövdesini bo¸s bırakamazsınız. Çünkü dedi˘gimiz gibi, e˘ger gövdeyi bo¸s bırakırsanız programınız çalı¸smaz. Böyle bir durumda, yukarıda gösterdi˘gimiz gibi fonksiyonu tanımlayıp gövde kısmına da bir pass deyimi yerle¸stirebilirsiniz. Daha sonra gövde kısmına ne yazaca˘gınıza karar verdi˘ginizde bu pass deyimini silebilirsiniz.

13.11 Fonksiyonların Belgelendirilmesi

Her zaman söyledi˘gimiz gibi, kod bir kez yazılır, bin kez okunur. Bu yüzden yazdı˘gınız kodların anla¸sılır olması her ¸seyden önemlidir. Program yazarken, yazdı˘gınız kodların i¸slevinin yanısıra anla¸sılır olmasına da dikkat etmeniz gerekir. Program yazarları, yazdıkları kodların daha kolay anla¸sılmasını sa˘glamak için bazı yardımcı araçlardan da faydalanır. Mesela önceki

derslerimizde gördü˘gümüz yorum (comment) kavramı bu yardımcı araçlardan biridir.

Python programcılarının, okunaklılı˘gı artırmak için kullanabilece˘gi bir ba¸ska yardımcı araç da belgelendirme dizileridir (docstring). Dilerseniz hemen bununla ilgili küçük bir örnek verelim:

#!/usr/bin/env python

# coding: utf-8 -*-def fonk():

"""bo¸s bir fonksiyondur. Hiçbir i¸se yaramaz..."""

pass

Gördü˘günüz gibi, belgelendirme dizisini fonksiyon tanımının hemen ardından getiriyoruz.

Belgelendirme dizilerinde üç tırnak kullanmak adettendir.

Bir fonksiyona ait belgelendirme dizisine eri¸smek için ¸su yöntemi kullanıyoruz:

Mesela sum() fonksiyonunun belgelendirme dizisine ula¸salım:

>>> print sum.__doc__

sum(sequence[, start]) -> value

Returns the sum of a sequence of numbers (NOT strings) plus the value of parameter ’start’ (which defaults to 0). When the sequence is empty, returns start.

Kendi yazdı˘gımız fonksiyonların belgelendirme dizilerine de aynı ¸sekilde ula¸sabiliriz. Önce fonksiyonumuzu tanımlayalım:

>>> def fonk():

... """bo¸s bir fonksiyondur. Hiçbir ... i¸se yaramaz..."""

... pass

¸

Simdi de fonksiyonumuzun belgelendirme dizisine ula¸salım:

>>> print fonk.__doc__

bo¸s bir fonksiyondur. Hiçbir i¸se yaramaz...

Gelin isterseniz biraz daha anlamlı bir örnek verelim:

#!/usr/bin/env python

# coding: utf-8

-*-def not_ortalamasi_hesapla(ogrenci_sayisi=5):

"""Not ortalaması hesaplayan bir fonksiyon.

Bu fonksiyonun aldı˘gı tek argüman

kullanıcıya kaç kez not bilgisi sorulaca˘gını gösterir."""

deneme = 0 toplam = []

while deneme < ogrenci_sayisi:

deneme += 1

toplam.append(int(raw_input("%s. ö˘grencinin notu: "

% deneme))) print "Toplam %s ö˘grenci var." % deneme print ("Bu ö˘grencilerin not ortalaması: %s"

%(sum(toplam)/deneme))

not_ortalamasi_hesapla()

Gördü˘günüz gibi, belgelendirme dizileri bize yazdı˘gımız bir fonksiyonun ne i¸se yaradı˘gını anlatma imkanı sa˘glıyor. Belgelendirme dizileri özellikle yazdı˘gımız kodları okuyan ba¸skaları için kıymetlidir. Belgelendirme dizileri sayesinde, yazdı˘gımız kodları okuyanlar, yazdı˘gımız

¸

seyin ne i¸se yaradı˘gı hakkında fikir sahibi olacaktır.

Yukarıdaki kodlarda yer alan belgelendirme dizisini ekrana basmak için kodlarınıza ¸söyle bir satır eklemelisiniz:

print not_ortalamasi_hesapla.__doc__

Bu arada, yazdı˘gınız belgelendirme dizilerinin de Python’un girintileme kurallarına uygun olması gerekti˘gine dikkat edin.

Böylece fonksiyonlar konusunu tamamlamı¸s olduk. Artık yeni ve çok önemli bir konu olan

“Modüllere” ba¸slayabiliriz. Ama tabii ki önce bölüm sorularımız...

13.12 Bölüm Soruları

1. Esasında siz, bu bölümde inceledi˘gimiz fonksiyon konusuna hiç de yabancı sayılmazsınız.

Bu bölüme gelinceye kadar pek çok fonksiyon ö˘grenmi¸stik. Mesela daha önceki derslerimizden hangi fonksiyonları hatırlıyorsunuz?

2. Python’daki sum() fonksiyonunun yaptı˘gı i¸si yapan bir fonksiyon yazın. Yazdı˘gınız fonksiyon bir liste içindeki sayıların toplamını verebilmeli.

3. Kullanıcıya isim soran bir program yazın. Bu program kullanıcının ismini ekrana

dökebilmeli. Ancak e˘ger kullanıcının girdi˘gi isim 5 karakterden uzunsa, 5 karakterden uzun olan kısım ekrana basılmamalı, onun yerine ”...” i¸sareti gösterilmelidir. Örne˘gin kullanıcıdan alınan isim Abdullah ise programınız “Abdul...” çıktısını vermeli.

4. Bir önceki soruda yazdı˘gınız programda kullanıcı, içinde Türkçe karakterler bulunan bir isim girdi˘ginde programınızda nasıl bir durum ortaya çıkıyor? Örne˘gin programınız “I¸sıl” ismine nasıl bir tepki veriyor? Sizce bunun sebebi nedir?

5. Yukarıdaki fonksiyonlarla ilgili ¸söyle bir örnek vermi¸stik:

#!/usr/bin/env python

# coding: utf-8 -*-def tek():

print "Girdi˘giniz sayı bir tek sayıdır!"

def cift():

print "Girdi˘giniz sayı bir çift sayıdır!"

sayi = raw_input("Lütfen bir sayı giriniz: ") if int(sayi) % 2 == 0:

cift() else:

tek()

Bu kodlara ¸söyle bir baktı˘gınızda, aslında bu kodları ¸su ¸sekilde de yazabilece˘gimizi farketmi¸ssinizdir:

#!/usr/bin/env python

# coding: utf-8

-*-sayi = raw_input("Lütfen bir sayı giriniz: ") if int(sayi) % 2 == 0:

print "Girdi˘giniz sayı bir çift sayıdır!"

else:

print "Girdi˘giniz sayı bir tek sayıdır!"

Bu kodları böyle de˘gil de fonksiyon içinde yazmamızın sizce ne gibi avantajları vardır?

6. Argüman ile parametre arasındaki farkı açıklayın.

7. Standart bir kurulum beti˘gini taklit eden bir program yazın. Örne˘gin programınız ¸su a¸samaları gerçekle¸stirebilmeli:

ˆ Kullanıcıya, “Kuruluma ho¸sgeldiniz!” mesajı göstermeli,

ˆ Kullanıcıya bir lisans anla¸sması sunmalı ve bu anla¸smanın ¸sartlarını kabul edip etmedi˘gini sormalı,

ˆ E˘ger kullanıcı lisans anla¸smasının ¸sartlarını kabul ederse kuruluma devam etmeli, aksi halde kurulumdan çıkmalı,

ˆ Kullanıcıya, “standart paket”, “minimum kurulum” ve “özel kurulum” olmak üzere üç farklı kurulum seçene˘gi sunmalı,

ˆ Kullanıcının seçimine göre, programda kurulu gelecek özelliklerin bazılarını etkinle¸stirmeli veya devre dı¸sı bırakmalı,

ˆ Programın sistem üzerinde hangi dizine kurulaca˘gını kullanıcıya sorabilmeli,

ˆ Kurulumdan hemen önce, programın hangi özelliklerle kurulmak üzere oldu˘gunu kullanıcıya son kez bildirmeli ve bu a¸samada kullanıcıya kurulumdan vazgeçme veya kurulum özelliklerini de˘gi¸stirme imkanı vermeli,

ˆ E˘ger kullanıcı kurulum özelliklerini de˘gi¸stirmek isterse önceki a¸samaya geri dönebilmeli,

ˆ E˘ger kullanıcı, seçti˘gi özelliklerle kurulumu gerçekle¸stirmek isterse program kullanıcının belirledi˘gi ¸sekilde sisteme kurulabilmeli,

ˆ Son olarak kullanıcıya kurulumun ba¸sarıyla gerçekle¸stirildi˘gini bildiren bir mesaj göstermeli.

Not: Bu adımları kendi hayal gücünüze göre de˘gi¸stirebilir, bunlara yeni basamaklar ekleyebilirsiniz.

8. Fonksiyonlar konusunu anlatırken ¸söyle bir örnek vermi¸stik:

#!/usr/bin/env python

# coding: utf-8 -*-def tek():

print "Girdi˘giniz sayı bir tek sayıdır!"

def cift():

print "Girdi˘giniz sayı bir çift sayıdır!"

sayi = raw_input("Lütfen bir sayı giriniz: ") if int(sayi) % 2 == 0:

cift() else:

tek()

Bu programın zayıf yönlerini bulmaya çalı¸sın. Sizce bu program hangi durumlarda çöker? Bu programın çökmesini engellemek için ne yapmak gerekir?

BÖLÜM

14

Modüller

Bu bölümde Python’daki en önemli konulardan biri olan modüllerden söz edece˘giz. Ancak modülleri kullanabilmek için tabii ki öncelikle “modül” denen ¸seyin ne oldu˘gunu anlamamız gerekiyor.

¸

Söyle dü¸sünün: Diyelim ki bir program yazıyorsunuz. Yazdı˘gınız bu programın içinde karakter dizileri, sayılar, de˘gi¸skenler, listeler, demetler, sözlükler, kümeler ve fonksiyonlar var.

Programınız da .py uzantılı bir metin dosyası içinde yer alıyor. ˙I¸ste bütün bu ö˘geleri ve veri tiplerini içeren .py uzantılı dosyaya modül adı verilir. Bu bilgiye göre, ¸simdiye kadar yazdı˘gınız ve bundan sonra yazaca˘gınız bütün Python programları aynı zamanda birer modüldür.

Peki, bu bilginin bize ne faydası var? Ya da ¸söyle soralım: Yazdı˘gımız bir Python programının modül olması neden bu kadar önemli?

Hatırlarsanız bir önceki bölümde Python’daki fonksiyonlardan bahsetmi¸stik. Yine hatırlarsanız o bölümde carp() adlı bir fonksiyon da tanımlamı¸stık. Bu fonksiyonu kullanabilmek için ne yapmamız gerekti˘gini biliyorsunuz. carp() fonksiyonuna ihtiyacımız oldu˘gunda bu fonksiyonu ça˘gırmamız yeterli oluyor. ¸Simdi ¸söyle bir dü¸sünelim: Biz bu carp() fonksiyonuna ihtiyacımız oldu˘gunda fonksiyonu ça˘gırmak yoluyla aynı program içinde kullanabiliyoruz. Peki ya aynı fonksiyona ba¸ska bir Python programında da ihtiyacımız olursa ne yapaca˘gız? O fonksiyonu kopyalayıp öbür Python programına yapı¸stıracak mıyız? Tabii ki hayır! Kodları alıp oradan oraya kopyalamak programcılık tecrübeniz açısından hiç de verimli bir yöntem de˘gildir.

Üstelik do˘gası gere˘gi “kopyala-yapı¸stır” tekni˘gi hatalara oldukça açık bir yoldur. Biz herhangi bir Python programında bulunan herhangi bir fonksiyona (veya niteli˘ge) ihtiyaç

duydu˘gumuzda o fonksiyonu (veya niteli˘gi) programımıza “aktaraca˘gız”. Peki, bunu nasıl yapaca˘gız?

Dedi˘gimiz gibi bütün Python programları aynı zamanda birer modüldür. Bu özellik sayesinde Python programlarında bulunan fonksiyon ve nitelikler ba¸ska Python programları içine

aktarılabilirler. Böylece bir Python programındaki i¸slevsellikten, ba¸ska bir Python programında da yararlanabilirsiniz.

˙I¸ste bu bölümde, bütün bu i¸slemleri nasıl yapaca˘gımızı ö˘grenece˘giz. Dilerseniz lafı daha fazla dolandırmadan modüller konusuna hızlı bir giri¸s yapalım.