Python Dersleri
Fonksiyon,belirli sayıda verileri kullanarak bunları işleyen ve bir sonuç üreten komut grubudur.Fonksiyonlar programlamada kullanacağımız ve sürekli tekrar eden komutların kullanımını daha da kolaylaştırmak için oluşturacağımız yapılardır.
Bu tanımlamaları yaptıktan sonra şu şekilde bir açıklama yapabiliriz. Elimizde bir kod kümesi var ve biz bunu programımız için de tekrar tekrar kullanıyoruz. Bu noktada fonksiyonlar devreye giriyor ve bu kod kümesini tekrar tekrar yazmak yerine bir fonksiyon haline çeviriyoruz. İstediğimiz yerde bu fonksiyonu çağırıyoruz.
Yani fonksiyonlar bizi kod israfından kurtararak daha az kod ile aynı işi yapmamızı sağlar.
Fonksiyon Tanımlamak
Python'da fonksiyon tanımlarken diğer programa dillerinden biraz farklı olarak "def" isimli bir parçacıktan yararlanacağız. "def" parçacığından sonra fonksiyonumuzun adını yazacağız.İsim verirken Türkçe karakter kullanmamanız gerektiğine kesinlikle dikkat etmelisiniz.Şimdi bir örnek verelim;
1
|
def fonk_adi(): |
1
2
3
4
5
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def ilk_fonksiyon(): print "Merhaba Python, fonksiyonlar ile tanışıyorum." |
1
2
3
4
5
6
7
8
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def ilk_fonksiyon(): print "Merhaba Python, fonksiyonlar ile tanışıyorum." ilk_fonksiyon() Merhaba Python, fonksiyonlar ile tanışıyorum. |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def dogru(): print "Tebrikler,girdiğiniz parola doğru." def yanlis(): print "Üzgünüz,girdiğiniz parola yanlış." parola = "123456" giris = raw_input ( "Parolayı giriniz:" ) if (parola = = giris): dogru() else : yanlis() Parolayı giriniz: 123456 Tebrikler,girdiğiniz parola doğru. |
Fonksiyonlarda Parametre Kullanımı
Şimdiye kadar ki kullandığımız fonksiyonlarda tanımlama yaparken parantez içini hep boş bıraktık.Bu şekilde kullanabiliriz veya bu parantezler içine bir takım veriler eklememiz gereken durumlar olabilir.Bu verilere programlama dillerinde parametre adı verilir.
Bu parametre olayını şu şekilde bir örnek vererek çok daha iyi anlamınızı sağlayabiliriz.
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def carp(): sayi1 = 15 sayi2 = 10 carpim = sayi1 * sayi2 print carpim carp() 150 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def carp(sayi1,sayi2): carpim = sayi1 * sayi2 print "Girdiğiniz sayıların çarpımı:" ,carpim sayi1 = int ( raw_input ( "Birinci sayıyı giriniz:" )) sayi2 = int ( raw_input ( "İkinci sayıyı giriniz:" )) carp(sayi1,sayi2) Birinci sayıyı giriniz: 10 İkinci sayıyı giriniz: 5 Girdiğiniz sayıların çarpımı: 50 |
Fonksiyonu tanımlarken ve fonksiyonu çağırırken kullandığımız değişken isimleri aynı olmak zorunda değildir.Bizim bu örneğimizde öyle olması sizi böyle bir düşünceye kapılmanıza sebep olmasın.Bu örneği sayıları kullanıcıdan almadan ve değişken kullanmadan şu şekilde de çağırabilirdik.
1
2
3
4
5
6
7
8
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def carp(sayi1,sayi2): carpim = sayi1 * sayi2 print "Girdiğiniz sayıların çarpımı:" ,carpim carp( 10 , 20 ) |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def toplam(liste): toplam = 0 for i in liste: toplam + = i print toplam liste = [ 1 , 2 , 3 , 4 , 5 , 8 , 10 ] toplam(liste) 33 |
İsimli ve Sıralı Argümanlar
Şu ana kadar kullandığımız fonksiyonlarda fark etmesek bile sıralı argümanları kullandık.Sıralı argümanlarda fonksiyona gönderdiğimiz argümanların sırası çok önemlidir.
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def fonksiyon(isim,not1,not2): ortalama = (not1 + not2) / 2 print isim, "adındaki öğrencinin not ortalaması:" ,ortalama fonksiyon( "Mazlum" , 80 , 90 ) Mazlum adındaki öğrencinin not ortalaması: 85 |
1
2
3
4
5
6
7
8
|
fonksiyon( 80 , "Mazlum" , 90 ) Traceback (most recent call last): File "/home/mazlumagar/workspace/Python/a.py" , line 10 , in fonksiyon( 80 , "Mazlum" , 90 ) File "/home/mazlumagar/workspace/Python/a.py" , line 6 , in fonksiyon ortalama = not1 + not2 TypeError: cannot concatenate 'str' and 'int' objects |
İşte bu tarz sorunlar yaşamak istemiyorsak isimli argümanları kullanabiliriz.Hemen bu örneğimizi isimli argüman türüne çevirelim ve aradaki farkı görelim.
1
2
3
4
5
6
7
8
9
10
11
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def fonksiyon(isim,not1,not2): ortalama = (not1 + not2) / 2 print isim, "adındaki öğrencinin not ortalaması:" ,ortalama fonksiyon(not1 = 80 ,isim = "Mazlum" ,not2 = 90 ) Mazlum adındaki öğrencinin not ortalaması: 85 |
Varsayılan Değerli Argümanlar
Bu tür argümanlar fonksiyon tanımlanırken parametreye varsayılan olarak atanır.
Bu konuyu hazır olarak bulunan range() fonksiyonu üzerinden anlatırsak çok rahat bir şekilde anlayacaksınız.
Hatırlarsanız range() fonksiyonu herhangi bir sayıya kadar olan sayıların listesini veriyordu.
1
2
3
4
|
sayilar = range ( 14 ) print sayilar [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 ] |
1
2
3
4
|
sayilar = range ( 6 , 14 ) print sayilar [ 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 ] |
1
2
3
4
|
sayilar = range ( 6 , 14 , 2 ) print sayilar [ 6 , 8 , 10 , 12 ] |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def topla(sayi,kacar = 1 ): toplam = 0 i = 0 while (sayi>i): toplam + = i i + = kacar print "Toplam:" ,toplam topla( 10 ) Toplam: 45 |
1
2
3
|
topla( 10 , 3 ) Toplam: 18 |
Not:Varsayılan değerli argümanlarda dikkat etmemiz gereken en önemli kural; varsayılan değerli parametrenin sıralamanın en sonunda olması gerektiğidir.
Yani fonksiyonu şu şekilde tanımlarsak;
1
2
3
4
5
|
def topla(kacar = 1 ,sayi): File "/home/mazlumagar/workspace/Python/a.py" , line 4 def topla(kacar = 1 ,sayi): SyntaxError: non - default argument follows default argument |
İstenen Sayıda Sıralı Argüman Kullanımı
Bugüne kadar oluşturduğumuz bütün fonksiyonlar belirli sayıda parametre alıyordu. Peki biz parametre sayısını sınırlamasak,istediğimiz kadar argüman girsek olmaz mı? Bu istediğimizi bir çok programlama dilinde yapamazken Python bize bu imkanı sağlıyor.
1
|
def ogrenci(ad,numara,fakülte,sinif) |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def ogrenci( * bilgiler): bilgi = "" for i in bilgiler: bilgi + = i print "Ögrencinin bilgileri:\n" ,bilgi ogrenci( "Mazlum " , "Teknoloji Fakütesi " , "Bilgisayar Mühendisliği " , "1.Sınıf" ) Ögrencinin bilgileri: Mazlum Teknoloji Fakütesi Bilgisayar Mühendisliği 1.S ınıf |
1
2
3
4
5
6
7
8
9
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def ogrenci( * bilgiler): print bilgiler ogrenci( "Mazlum " , "Teknoloji Fakutesi " , "Bilgisayar Muhendisligi " , "1.Sinif" ) ( 'Mazlum ' , 'Teknoloji Fakutesi ' , 'Bilgisayar Muhendisligi ' , '1.Sinif' ) |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def demet( * bolumler): for sira,bolum in enumerate (bolumler): print "%s : %s" % (sira,bolum) demet( "Bilgisayar" , "Elektrik-Elektronik" , "Makina" , "İnşaat" ) 0 : Bilgisayar 1 : Elektrik - Elektronik 2 : Makina 3 : İnşaat |
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def bolum(bolum1,bolum2,bolum3,bolum4): print bolum1,bolum2,bolum3,bolum4 bolumler = [ "Bilgisayar " , "Elektrik-Elektronik " , "Makina " , "İnşaat " ] bolum( * bolumler) Bilgisayar Elektrik - Elektronik Makina İnşaat |
1
2
3
4
|
Traceback (most recent call last): File "/home/mazlumagar/workspace/Python/a.py" , line 10 , in fnk( * liste) TypeError: fnk() takes exactly 2 arguments ( 3 given) |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def ortalama( * notlar): toplam = 0 for ders in notlar: toplam + = int (ders) print toplam / len (notlar) notlar = [] sayi = 0 print "Öğrenci Notlarını Giriniz:\n" while 5 >sayi: notlar.append( raw_input ( "Not:" )) sayi + = 1 ortalama( * notlar) Öğrenci Notlarını Giriniz: Not: 10 Not: 20 Not: 50 Not: 80 Not: 90 50 |
İstenen Sayıda İsimli Argüman Kullanımı Fonksiyonlara istediğimiz sayıda sıralı argüman göndermeyi öğrendikten sonra şimdi de istediğimiz sayıda isimli argüman göndermeyi öğrenelim. Sıralı argümanlarda "*" operatörünü kullanıyorduk.İsimli argümanlarda ise "**" operatörünü kullanarak verileri fonksiyona alıyoruz.Hatırlarsanız isimli argümanları anlatırken şöyle bir örnek vermiştik.
1
2
3
4
5
6
7
8
9
10
11
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def fonksiyon(isim,not1,not2): ortalama = (not1 + not2) / 2 print isim, "adındaki öğrencinin not ortalaması:" ,ortalama fonksiyon(not1 = 80 ,isim = "Mazlum" ,not2 = 90 ) Mazlum adındaki öğrencinin not ortalaması: 85 |
1
2
3
4
5
6
7
8
9
10
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def fonksiyon( * * bilgiler): ortalama = (bilgiler[ "not1" ] + bilgiler[ "not2" ]) / 2 print bilgiler[ "isim" ], "adındaki öğrencinin not ortalaması" ,ortalama fonksiyon(not1 = 80 ,isim = "Mazlum" ,not2 = 90 ) Mazlum adındaki öğrencinin not ortalaması: 85 |
1
2
3
4
5
6
7
8
9
10
11
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def fonksiyon( * * bilgiler): ortalama = (bilgiler[ "not1" ] + bilgiler[ "not2" ]) / 2 print bilgiler[ "isim" ], "adındaki öğrencinin not ortalaması" ,ortalama sozluk = { "not1" : 80 , "isim" : "Mazlum" , "not2" : 90 } fonksiyon( * * sozluk) Mazlum adındaki öğrencinin not ortalaması: 85 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def not_ortalamasi( * * ortalamalar): for i,k in ortalamalar.items(): print "'" ,i, "' isimli öğrencinin not ortalaması:" ,k ortalama = { "Mazlum" : 2.4 , "Okan" : 2.7 , "Sunay" : 3.2 , "Nilay" : 3.0 , "Sultan" : 2.6 , "Mücahit" : 3.3 } not_ortalamasi( * * ortalama) ' Sunay ' isimli öğrencinin not ortalaması: 3.2 ' Sultan ' isimli öğrencinin not ortalaması: 2.6 ' Mücahit ' isimli öğrencinin not ortalaması: 3.3 ' Mazlum ' isimli öğrencinin not ortalaması: 2.4 ' Okan ' isimli öğrencinin not ortalaması: 2.7 ' Nilay ' isimli öğrencinin not ortalaması: 3.0 |
Global Deyimi
"global" kelimesi Türkçede "evrensel" demektir.Bu deyim sadece Python için özel değildir.
Günümüzde var olan hemen hemen bütün programlama dillerinde bulunur.Birazdan göreceğimiz "return" ve "pass" deyimi de aynı şekilde hemen hemen bütün programlama dillerinde bulunurlar.Bu deyimler artık kalıplaşmıştır.
Şimdi tekrar "global" deyimine dönelim.Programlama dillerinde bir fonksiyon içinde tanımlanan değişkenler fonksiyon ile oluşturulur ve fonksiyon sonlandığı zaman oluşturulan bu değişkenler de fonksiyon ile beraber sonlanır.Yani bir fonksiyon içinde oluşturulan fonksiyonu fonksiyon dışında herhangi bir yerde kullanamayız.Şimdi bu dediklerimizi örnek vererek açıklayalım.
1
2
3
4
5
6
7
8
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def fonk(): a = "Global değişkenler" print a fonk() |
1
2
3
4
5
6
7
8
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def fonk(): a = "Global değişkenler" fonk() print a |
1
2
3
4
|
Traceback (most recent call last): File "/home/mazlumagar/workspace/Python/global.py" , line 8 , in print a NameError: name 'a' is not defined |
1
2
3
4
5
6
7
8
9
10
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def fonk(): global a = "Global değişkenler" fonk() print a Global değişkenler |
return Deyimi
Şu ana kadar yazdığımız bütün fonksiyonlarda ekrana bir sonuç bastırdık. Ama program yazarken her zaman böyle yapmayız. Yazdığımız bir fonksiyondan değer döndürmek ve bu değer ile işlemler yapmak isteyebiliriz. Yani "return" deyimi fonksiyonun deriye herhangi bir değer döndürmesini sağlar.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def dondur(not_): if not_ > 50 : return "Dersten Geçtiniz." else : return "Dersten Kaldınız." sonuc = dondur( 60 ) print sonuc Dersten Geçtiniz. |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def dondur(sayi): return sayi % 2 sonuc = dondur( 52 ) if sonuc = = 1 : print "Sayı Tek." else : print "Sayı Çift." Sayı Çift. |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/usr/bin/env python # -*- coding: utf-8 -*- ucret = raw_input ( "Ücreti giriniz:" ) if ucret> 50 : pass else : print "Bu ücrete kitap bulabilirsiniz." print "Teşekkürler" Ücreti giriniz: 20 Teşekkürler |
1
2
3
4
5
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def gec(): pass |
1
2
|
^ IndentationError: expected an indented block |
Python içinde kullanımımız için hazır olarak bulunan fonksiyonlara gömülü fonksiyonlar denir. Daha önceden gördüğümüz len(),sum(),range() fonksiyonlar bu tür fonksiyonlardır. Bu fonksiyonlar Python içinde kullanıma hazır bir şekilde beklemektedir.
Python'da bulunan bu gömülü fonksiyonların listesine ; text-decoration-line: none; outline: none; font-family: Arial, Tahoma, "Century gothic", sans-serif; font-size: 13px; background-color: rgb(254, 254, 254);">http://docs.python.org/2/library/functions.html adresinden ulaşabilirsiniz.
Program yazarken bir fonksiyon yazmadan önce bu listeyi kontrol etmeli ve eğer istediğimiz fonksiyon varsa onu kullanmalıyız.Çünkü bu fonksiyonlar Python geliştiricileri tarafından hazırlanmış olduğu için çok hızlı ve verimlidirler.
Belgelendirme Dizileri
Fonksiyonların açıklamasının yapılması için "belgelendirme dizileri" kullanılır. Bir fonksiyonun belgelendirme dizisine erişmek için "__doc__" kullanılır. Daha önceden öğrendiğimiz len() fonksiyonunun belgelendirme dizisini ekrana yazdıralım.
1
2
3
4
5
6
7
8
9
|
#!/usr/bin/env python # -*- coding: utf-8 -*- print len .__doc__ len ( object ) - > integer Return the number of items of a sequence or mapping. |
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def belge(): """Bu fonksiyonumuzun belgelendirme dizisidir. Buraya fonskiyonumuzun kullanımını yazabiliriz.""" a = 10 print belge.__doc__ Bu fonksiyonumuzun belgelendirme dizisidir. Buraya fonskiyonumuzun kullanımını yazabiliriz. |
Not: Belgelendirme dizileri fonksiyon tanımlamasından hemen sonra gelmelidir. Şu şekilde bir kullanım yanlıştır.
1
2
3
4
5
6
7
8
9
10
11
|
#!/usr/bin/env python # -*- coding: utf-8 -*- def belge(): a = 10 """Bu fonksiyonumuzun belgelendirme dizisidir. Buradan fonksiyonumuzun ne işe yaradığını öğrenebilirsiniz""" print belge.__doc__ None
|