Bilişim Teknolojileri ve Yazılım – Bilgisayar Bilimi

Python İle Programlamanın Temelleri-6

Fonksiyonlar-1

1. Neden Fonksiyonlar?

Büyük ve kapsamlı bir program yazdığımızı ve program kapsamında pek çok kez aynı işlemi yapmamız gerektiğini düşünelim. Örneğin karekökü hesaplamak. Matematik bağlamında iki geometrik nokta (x1, y1) ve (x2, y2) arasındaki uzaklığı hesaplamamız gerekebilir. İkinci dereceden bir denklemin (ax2+bx+c = 0) çözüm kümesini bulmamız istenebilir. Elektrik mühendisliği ya da fizik bağlamında bir dizi değerin, sayıların karelerinin ortalamasının karekökünü bulmamız beklenebilir.

Bu durumda her formül için karekök hesaplama yapan program satırlarını tekrar tekrar gereken yerlere kopyalamamız mı gerekir? Peki ya karekök bulma işlemi pek çok farklı program tarafından kullanılan bir hesaplama ise o zaman bütün programların içerisine yine bu satırları eklememiz mi gerekir? Acaba bu şekilde tekrarlayan işlemler için bu kodu paketleyip tekrar kullanmamızı sağlayan bir yöntem var mıdır?

2. Fonksiyon Nedir?

Bu kodu paketleyerek tekrar tekrar kullanmamızı sağlayan yaklaşımlardan biri “fonksiyonlar”dır. Bir fonksiyon, tekrar kullanılabilen kod parçacığıdır. Kendimiz fonksiyon yazabileceğimiz gibi önceden yazılmış ve kullanıma hazır fonksiyonları da kullanabiliriz. Diğer programlama dillerinde olduğu gibi Python kapsamında da standart fonksiyonların bulunduğu bir kütüphane vardır. Programcılar, “modül” olarak adlandırılan bu fonksiyonları kendi kodları içinden çağırarak kullanabilirler.




3. Fonksiyonlara Giriş

Aslında biz ilk bölümden itibaren fonksiyonları kullanmaya başlamıştık: print, input, int, f loat, str, ve type. Sıkça kullanılan işlemlerin çoğu için Python kütüphanesinde pek çok fonksiyon bulunmaktadır. Fonksiyon kavramını anlatmak için karekök bulma ve kare alma işlemlerini kullanalım. Fonksiyonlar, belirli bir işlemi gerçekleştiren kod blokudur. İlgili işlemi gerçekleştirmek için fonksiyon çağrılır. Python kütüphanesinde sqrt isimli bir fonksiyon karekök alma işlemini yapmaktadır. Bu fonksiyon tam sayı ya da reel sayı kabul etmektedir. Örneğin parametre olarak 16 gönderildiğinde 4 değeri geri dönmektedir.

Fonksiyonları kapalı bir kutu olarak düşünebiliriz. İçerisindeki kodlama detaylarını bilmemize gerek olmadan kolayca çağırıp işlem yaptırmak için kullanabiliriz. Dolayısıyla işlemi nasıl yaptığından daha çok ne yaptığını bilmemiz yeterli olur.

3.1. sqrt() Fonksiyonu

Burada sqrt (sayi) komutu ilgili “fonksiyonu çağırmak” için kullanılmaktadır. Önceden kullandığımız fonksiyonlar gibi sık kullanılan fonksiyonların küçük koleksiyonu kapsamı dışındadır. Bu fonksiyon standart kütüphane içerisinde ayrı bir modül olarak düşünülebilir. Bu nedenle “import” anahtar kelimesi kullanılarak ve “math” yani matematik kütüphanesinden çağırılarak kullanılır. Böylece sqrt() fonksiyonu programa tanıtılmış olur. “sayi” ise fonksiyona gönderilecek parametredir. Parametreler fonksiyona işlem yapması için ihtiyaç duyduğu değerleri göndermek ve bilgi alışverişini sağlamak için kullanılır.

from math import sqrt

# Kullanıcıdan değer alınıyor

sayi = float(input(“Sayı Giriniz: “))

# Karakök hesaplanarak kok değişkenine aktarılıyor

kok = sqrt(sayi)

# Sonuçlar yazdırılıyor

print(sayi,” sayısının karekökü” “=”, kok)

sqrt() fonksiyonu sadece sayısal değerleri kabul eder. O yüzden farklı bir değer göndermek hata ile karşılaşılmasına neden olur. Örneğin sqrt(“16”) söz dizimi hatalı bir yapıdır.

3.1.1. sqrt() Fonksiyonunun Farklı Kullanımları

# Bu program sqrt() fonksiyonunun farklı kullanımlarını gösterir.

from math import sqrt

x = 16

# İstenilen sabit değerin karekökünün alınması

print(sqrt(16.0))

# Değişkenin karekökünün alınmasını sağlar

print(sqrt(x))

# sqrt() fonksiyonunun içerisinde işlem kullanımı

print(sqrt(2 * x 5))

# İşlem sonucu geri dönen değerin değişkene aktarılması

y = sqrt(x)

print(y)

# İçerisinde işlem kullanılan sqrt() fonksiyonunun dönen değerinin işleme tabi tutulması

y = 2 * sqrt(x + 16) 4

print(y)

# İç içe sqrt() fonksiyonunun kullanılması

y = sqrt(sqrt(256.0))

print(y)

print(sqrt(int(“45”)))

Fonksiyonlar kendilerini çağırırken gönderilen parametreleri genellikle değiştirmez. Sonuçları fonksiyon adında ya da birden fazla parametre gönderildiği durumda sonucu içeren parametre ile iletir. Değer çağıran kişi tarafından bir değişkene atanmadığı sürece değişkenin değeri değişmez.

>>> from math import sqrt

>>> x = 2

>>> sqrt(x)

1.4142135623730951

>>> x

2

>>> x = sqrt(x)

>>> x

1.4142135623730951

3.2. Fonksiyonların Bölümleri

Çağıran kişi açısından fonksiyonun 3 önemli bölümü vardır:

İsmi: Her fonksiyonun, nasıl bir işlem yapılacağını ifade eden bir adı vardır. Değişkenleri isimlendirirken dikkat ettiğimiz kurallar, fonksiyon isimleri için de geçerlidir.

Parametreler: Bir fonksiyon belli sayıda parametre ile çağrılır ve her birinin doğru türde olması gerekir. Beklenenden daha az ya da çok sayıda parametre göndermek hataya neden olur.

Sonuç Türü: Fonksiyon kendini çağıran programa bir değer döndürür. Bu değer beklenen veri türü ile aynı olmalıdır.

>>> sqrt(10)

3.1622776601683795

>>> sqrt()

Traceback (most recent call last):

File “<pyshell#14>”, line 1, in <module>

sqrt()

TypeError: sqrt() takes exactly one argument (0 given)

>>> sqrt(10, 20)

Traceback (most recent call last):

File “<pyshell#15>”, line 1, in <module>

sqrt(10, 20)

TypeError: sqrt() takes exactly one argument (2 given)

>>> sqrt(16)

4.0

>>> sqrt(“16”)

Traceback (most recent call last):

File “<pyshell#3>”, line 1, in <module>

sqrt(“16”)

TypeError: a float is required

>>> type(sqrt(16.0))

<class “float”>

3.3. Parametresiz Fonksiyonlar

Bazı fonksiyonlar parametre kabul etmez. Örneğin rastgele bir sayı oluşturmamızı sağlayan random fonksiyonu bu duruma bir örnektir. Bu fonksiyonu çağırarak rastgele bir sayı değeri elde ederiz. Bu fonksiyonu parametre ile çağırmak hataya neden olacaktır.

>>> from random import random

>>> random()

0.9595266948278349

>>> random(20)

Traceback (most recent call last): File “<stdin>”, line 1, in <module>

TypeError: random() takes no arguments (1 given)

3.4. Değer Döndürmeyen Fonksiyonlar

Bazı fonksiyonlarda parametre beklemelerine rağmen sonuç, değeri döndürmeyebilir. Örneğin print fonksiyonunun işlevi, hesaplama yapmak değil, ekranda görüntülemek olduğu için bu fonksiyonun sonucu diğer fonksiyonlara göre farklıdır.

>>> print(print(4))

4

None

Bu örnekte içerideki parametre ekrana 4 yazdırırken dıştaki print, içerideki fonksiyon değerini döndürür. Ayrıca bir değişkene “None” değeri atayabiliriz. Bu durumda hiçbir değer atanmamış demektir.




4. Fonksiyon ve Modüller

Bir Python modülü Python kodları içeren bir dosyadır. Dosyanın adı modülün adına işaret eder. Örneğin math.py isimli bir dosya standart matematik modülünde yer alan fonksiyonları içerir. Python standart kütüphanesinde 230 modül kapsamında yer alan binlerce fonksiyon vardır. Bu modüllerin geniş bir uygulama alanı bulunmaktadır. Örneğin built-ins (yerleşik işlevler) isimli modül (__builtins__), daha önce kullandığımız fonksiyonları kapsamaktadır: print, input vb. Bu yerleşik işlevler standart kütüphanenin çok küçük bir kısmını oluşturmaktadır. Geri kalan tüm diğer fonksiyonlara ulaşmak için programcıların program ya da yorumlayıcı içinden öncelikle “import” komutunu kullanarak ilgili kütüphaneye erişim sağlamaları gerekir.

Bu komut ile ilgili kod parçacığı bilgisayarın sabit diskinde bir yerde saklanır. Böylece program, ihtiyaç duyduğunda bu kodları çalıştırmak için nereden çalıştıracağını bilir.

Python, bir modülden fonksiyon çağırmak için farklı yollar sunar. Bunlardan çok yaygın kullanılan ikisini inceleyelim.

from math import sqrt

Eğer birden fazla fonksiyon çağırmamız gerekirse örneğin yaygın logaritma ve trigonometri kapsamındaki cos fonksiyonuna da ihtiyacımız varsa söz dizimi şu şekilde olacaktır:

from math import sqrt, log10, cos

Böylece her 3 fonksiyon da program açısından erişilebilir ve kullanılabilir duruma gelir. “math” modülü pek çok farklı fonksiyonu da içermektedir. Eğer çok sayıda modül kullanmamız gerekiyorsa birkaç modülün spesifik olarak ismini belirtmek yerine

import math

ifadesini kullanarak “math” modülünün tamamına erişim sağlarız.

Böylece “math” modülündeki tüm fonksiyonlar erişilebilir hâle geldi. Ancak ilgili fonksiyonu çağırırken modülün adını da belirtmemiz gerekir. Modül adının “.” ile fonksiyon adlarına birleştirilerek kullanıldığına dikkat ediniz. Bu yapıya birleşik (modül adı. fonksiyon adı) yapı diyoruz. Programcıların çoğu fonksiyon çağırma işleminde bu yapıyı tercih eder çünkü bu yapı programı daha basit ve anlaşılır kılmaktadır.

y = math.sqrt(x)

print(math.log10(100))

5. Yerleşik İşlevler

Bir süredir kullandığımız print, input, int, f loat, str, ve type isimli fonksiyonlar __builtins__ isimli modülde yer almaktadır. Bu modül Python için özel bir modüldür. Bu modüldeki fonksiyonlar import komutu ile erişim sağlanmadan doğrudan kullanılabilmektedir. Bu ismi kullanmamıza gerek olmamasına rağmen istersek kullanabiliriz.

>>> print(“Merhaba”) Merhaba

>>> _ _ builtins _ _ .print(“Merhaba”) Merhaba

>>> print

<built-in function print>

>>> _ _ builtins _ _ .print

<built-in function

>>> id(print)

9506056

>>> id( _ _ builtins _ _ .print)

9506056

Bu etkileşimli sıra print fonksiyonunun gerçekten yerleşik işlevler kütüphanesinde olup olmadığını kontrol etmemizi sağlar. Diğer bir fonksiyon ise “id” fonksiyonudur. id(x) ifadesi ile x isimli nesnenin hafızadaki adresini öğreniriz. id(print) ve id(__builtins__.print) aynı değer ile sonuçlandığı için aynı fonksiyonun nesnesini kullandığımızı anlarız. “dir” fonksiyonu ise bir modüldeki tüm fonksiyonları listelememizi sağlar. Yerleşik işlevlerin listesini görmek için dir(__builtins__) komutunu kullanırız.

__builtins__ modulü bir de help (yardım) fonksiyonu içermektedir. Etkileşimli yorumlayıcıda spesifik fonksiyonlar hakkında anlaşılabilir bilginin sunulması sağlanır. Böylece her fonksiyona ilişkin ayrıntılı bilgi edinilebilir.

6. Standart Matematik Fonksiyonları

Standart “math” modülü fonksiyonel bir hesap makinesi ile yapılabilen işlemlerin çoğunu içerir. Ayrıca pi (p) ve e (e) değerlerini de tanımlar. “math” modülünün içerdiği tüm fonksiyonları dir (math) komutu ile görebiliriz.

Çağıran tarafından gönderilen parametre gerçek parametre olarak bilinir. Fonksiyon tarafından tanımlanan parametre ise resmî parametredir. Bir fonksiyon çağrıldığında ilk gerçek parametre ilk resmî parametre değerine; ikinci gerçek parametre ikinci resmî parametre değerine atanır. Bu nedenle parametreleri doğru sırada göndermek çok önemlidir. Örneğin,

math.pow(8,2)

8 değerinin karesini alıp 64 sonucunu döndürürken

math.pow(2,8)

2 üzeri 8 değerini hesaplar ve 256 değerini döndürür.

Karekök fonksiyonunu asal sayıları belirlemek için de kullanabiliriz. Bütün olasılıkları (n ve n-1 için) denemek yerine n değerinin karekök sonucuna kadar olan değerleri denememiz yeterli olacaktır.

from math import sqrt

sonDeger = int(input(“Hangi sayıya kadar asal sayılar listelensin?”))

deger = 2 # En küçük asal sayı

while deger <= sonDeger:

# İstenilen değere kadar dönmesi için döngü kuruluyor

kontrol = True # Başlangıç aşamasında kontrol değişkeni True olarak belirlenir

# 2 ile -1 arasındaki tüm değerlerin kontrolünün yapılması

geciciDeger= 2

kok = sqrt(deger) # Döngüde sırası gelen değerin karakökü hesaplanıyor

while geciciDeger <= kok:

if deger % geciciDeger == 0:

kontrol = False # Asal sayı özelliği yitiriliyor ve kontrol False oluyor

break # Kontrol döngüsünden çıkılıyor.

geciciDeger += 1 # Bir sonraki kontrol sayısına geçiş

if kontrol:

print(deger, end= ” “) # Şarta uyan değer Asal olarak kabul edilip yazdırılıyor.

deger += 1 # Asal sayı kontrolü için sonraki sayı

print() # Kursor bir sonraki satıra alınıyor

Ekran Çıktısı

Hangi sayıya kadar asal sayılar listelensin? 51

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

7. time Fonksiyonları

Zamanla ilgili bilgi ve işlemlerin yer aldığı modül, “time” modülüdür. Bunlardan ikisi clock ve sleep fonksiyonlarıdır. Time.clock fonksiyonu ile programın belli bölümlerinin çalışma süresini ölçebiliriz. Programın ilk çağrıldığı andan itibaren geçen süreyi saniye olarak verir.

from time import clock print(“Adınızı Giriniz: “, end=””) baslangicZamani = clock()

ad = input()

zaman = clock() baslangicZamani

print(ad, “bilgilerinizi”, zaman, “zamanda girdiniz”)

Ekran Çıktısı

Adınızı Giriniz: Oğuz

Oğuz bilgilerinizi 0.00411499999999998 zamanda girdiniz

Bir Python programının 1.000.000’a kadar bütün sayıların toplamını hesaplamasının ne kadar sürdüğünü öğrenmek için yine aynı fonksiyon kullanılır.

from time import clock

toplam = 0 # Toplam değişkeni tanımlanıp ilk değer olarak 0 veriliyor

basla = clock() # İşlem süresinin hesaplanması için süre başlatılıyor

for n in range(1, 1000001): # Toplamı alınacak sayılar için 1.000.000’e kadar döngü kuruluyor

toplam += n

gecenZaman = clock() basla # Geçen zaman hesaplanıyor

print(“Toplam:”, toplam, “Geçen Süre:”, gecenZaman) # Sonuçlar yazdırılıyor

Ekran Çıktısı

Toplam: 500000500000 Geçen Süre: 0.16708000000000003

Bir Python programının 10.000’e kadar bütün asal sayıların toplamını hesaplamasının ne kadar sürdüğünü öğrenmek için yine aynı fonksiyon kullanılır.

# 10.000″e kadar olan asal sayıların adetini ve geçen zamanı bulan program

from time import clock sonDeger = 10000

sayac = 0

zaman = clock() # Süre başlatılıyor

# En küçük asal sayı olan 2 den istenilen değere kadar döngü kuruluyor

for deger in range(2, sonDeger + 1):

# Sırayla sayılar ele alınıyor

kontrol = True # Değerlerin kontrol edilmesi için ilk değer True veriliyor

# Asal olma özelliğinin kontrolü için bölenlerinin döngüsü kuruluyor

for bolenSayi in range(2, deger):

if deger % bolenSayi == 0:

kontrol = False # Tam bölme işlemi oluştuysa kontrol False yapılıyor

break # ve döngü sonlandırılıyor

if kontrol:

sayac += 1 # Asal olma özelliği sağlanmışsa sayac arttırılıyor

print() # Yeni satır başı

gecenZaman = clock() zaman # İşlem tamamlandıktan sonra süre sonlandırılıyor

print(“Adet:”, sayac, ” Geçen Zaman:”, gecenZaman, ” saniye”)

Ekran Çıktısı

Adet: 1229 Geçen Zaman: 0.8711089999999999 saniye

Time.sleep() fonksiyonu ise programın çalışması sırasında belirtilen süre kadar durmasını sağlar. Örneğin geriye sayımda her sayıdan sonra 1 saniye beklemek için aşağıda görülen kod kullanılır.

from time import sleep

for sayac in range(10, -1, -1): # Range 10, 9, 8, …, 0

print(sayac) # Sayac yazdırılıyor

sleep(1) # 1 saniye bekleme işlemi yapılıyor




8. Rastgele Sayılar

Rastgele sayılar; birçok programlama dilinde, oyun ve simülasyonlarda kullanılır. Bütün rastgele sayılar üreten algoritmalar, aslında gerçek rastgele sayılar üretmez. Sözde rastgele sayılar üreten bu algoritmalar uzun süre kullanımdan sonra aynı seriyi üretmeye başlar. Gerçek rastgele değerler, farklı sıralamada gelir ve bu sıralamayı tekrarlamaz. Python standart kütüphanesinde, Mersenne Twister algoritmasına dayalı olarak çalışan sözde rastgele değer üretmek mümkündür.

Mersenne Twister algoritmasına ilişkin daha fazla bilgi almak için https://docs.python.org/2/library/random.html adresini ziyaret ediniz.

Aşağıdaki tabloda rastgele değer üreten fonksiyonlar ve özellikleri açıklanmıştır.

random.seed fonksiyonu, üretilecek sözde rastgele değerler için bir başlangıç değeri belirler. random. random veya random.randrange fonksiyonları her çağrıldığında bir sonraki sözde değerler için yeni bir değer döndürür. Aşağıdaki örnek, 1 ile 100 arasında rastgele değer döndürür.

from random import randrange, seed

for i in range(0, 100): # 100 adet rastgele sayı için döngü kuruluyor

print(randrange(1, 1001), end=” “) # 1..1001 aralığında üretilen rastgele sayı yazdırılıyor

print()


Fonksiyonlar-1 konusu ile ilgili sunum dosyasına ve konu testine (yakında) aşağıdan ulaşabilirsiniz.