Programalam2 Pyton
Programalam2 Pyton
Ünite
Video Canlı Ders Sesli Kitap Sesli Özet
Özeti
444 10 26
AÖF Kitapları Öğrenci Kullanım Kılavuzu
Öğrenme çıktıları
Bölüm içinde hangi bilgi, beceri ve yeterlikleri
kazanacağınızı ifade eder.
Tanım
Bölüm içinde geçen
önemli kavramların
Bölüm Özeti tanımları verilir.
Bölümün kısa özetini gösterir.
Dikkat
Konuya ilişkin önemli
Sözlük uyarıları gösterir.
Bölüm içinde geçen önemli
kavramlardan oluşan sözlük
ünite sonunda paylaşılır.
Karekod
Bölüm içinde verilen
Neler Öğrendik ve Yanıt Anahtarı
karekodlar, mobil
Bölüm içeriğine ilişkin 10 adet
cihazlarınız aracılığıyla
çoktan seçmeli soru ve cevapları
sizi ek kaynaklara,
paylaşılır.
videolara veya web
adreslerine ulaştırır.
Editör
Yazarlar
Öğretim Tasarımcısı
Öğr.Gö[Link]. Orkun Şen
Grafiker
Gülşah Karabulut
PROGRAMLAMA II
E-ISBN
978-975-06-4315-6
Python ile
BÖLÜM 1 Programlamaya BÖLÜM 2 Akış Kontrolü
Giriş
iii
BÖLÜM 3 Fonksiyonlar BÖLÜM 4 Veri Tipleri
iv
Dosya İşlemleri ve
BÖLÜM 5 BÖLÜM 6 Nesne ve Sınıf
Hata Yakalama
v
Python ile MySQL Django ile Web
BÖLÜM 7 BÖLÜM 8
Veritabanı İşlemleri Sitesi Hazırlama
vi
Önsöz
Değerli arkadaşlar,
Yapay zeka uygulamaları, makine öğrenmesi, ğiz. Sonrasında Python programlama dilinde
görüntü işleme, oyun geliştirme, büyük veri önemli bir kavram olan veri türleri konusuna
analizi gibi kavramlarla günümüzde çok sık değinecek hemen ardından günlük hayatta
karşılaşıyoruz. Bu kitapta işte bu ve benzeri sıklıkla kullanılan bir dijital ortam bileşeni çer-
çok çeşitli alanlarda uygulama geliştirmeye çevesinde Python ile dosya işlemleri hakkında
imkan sağlayan, geniş kullanım alanına sahip, detaylı incelemeler yapacağız. Nesne yönelim-
platformlar arası bir programlama dili olan li programlamada kullanılan bileşenler ve de-
Python programlama dili anlatılmıştır. taylarını ilgili kod örnekleri bağlamında ince-
Temel düzeyden başlayarak öncelikle nesne leyeceğiz. Python ile veritabanı uygulamaları,
tabanlı programlamanın ne olduğunu öğrene- Web uygulamaları geliştirme yapacağız.
ceğiz. Sonrasında Python programlama diline Bu kitapta yer alan kodlama bilgilerini kitapta
giriş yapacak, kontrol ifadelerinin çeşitli du- bilgisi verilen geliştirme ortamında kendiniz
rumlar için kullanımlarını ve döngü ifadeleri- mutlaka deneyiniz. Ortaya çıkan hata kodla-
nin kullanımlarını öğreneceğiz. Python fonksi- rını kendiniz görünüz. Verilen kodları kopyala-
yon türlerini inceleyecek fonksiyon farklarını yarak kendi kod geliştirme ortamınıza aktarıp
ve fonksiyon parametrelerinin farklı kullanım çalıştırınız. Kodlar üzerinde değişiklikler yap-
şekillerini kavrayacağız. Özyinelemeli fonksi- rak farklı sonuçlar elde ederek uygulama bece-
yonlar hazırlarken, modül yapısı ve modülle- rinizi geliştiriniz.
rin programın içerisine dahil edebilecek, paket
yapısını ve içe aktarma ile paket yükleyicisinin Yazılım geliştirme sürecinde başvuru kitabınız
çalışmasını ve kullanımını ifade edebilece- olması, çalışmalarınıza katkı sağlaması dileğiyle.
Editör
Doç.Dr. Muhammet Recep OKUR
vii
Bölüm 1
Python ile Programlamaya Giriş
öğrenme çıktıları
Başlarken
1 2
1 Python programlama dilinin ve kod Temel Kavramlar
geliştirme arayüzünün kurulumunu 2 Anahtar kelimelerin ve değişken
gerçekleştirebilme isimlerinin tanımlamasını kavrayabilme
3 4
3 Giriş / çıkış fonksiyonlarının ifade Operatörler
edilebilmesi ve harici modüllerin kod 4 Python dilinde kullanılan operatörlerin
içerisinde kullanılmasını kavrayabilme kullanım alanlarını ifade edebilme
Anahtar Sözcükler: • Python • Editör • Kurulum • Veri Tipleri • I/O İşlemleri • Temel Operatörler
• Temel Kavramlar
2
1
Programlama II
GİRİŞ
Python, nesne tabanlı programlamanın yanında, fonksiyonel programlamayı da destekleyen, geniş kul-
lanım alanına sahip bir programlama dilidir. Python programlama dili, 2000’li yıllardan itibaren gelişen
donanımsal gelişmeler neticesinde, özellikle mühendislik hesaplamalarında ve bilimsel araştırmalarda sıkça
tercih edilmeye başlanmıştır.
Diğer dillere göre daha kolay olması, dinamik bir yapıya sahip olması ve geniş bir kütüphaneye sahip
olması gibi nedenlerle günümüzde veri işleme gibi alanlarda oldukça popülerleşmiş ve geniş bir kullanıcı
kitlesine ulaşmıştır.
İnternetin hızlanması ve yaygınlaşması neticesinde açık kaynak kod kullanımının ve geliştirmesinin
yayılması, Pyhton programlama dilinin kullanım alanlarının genişlemesi için büyük bir fırsat olmuştur.
Böylece Python’un standart kütüphanesine, diğer bir çok kütüphane ve geliştirme araçlarına, lisansa ihti-
yaç duyulmadan ücretsiz bir şekilde ulaşılabilmektedir.
Ayrıca Python programlama dili ile, Flask ve Django gibi ortamlarda web geliştirme yapılabilmektedir.
Bunun yanında, yapay zeka ve makine öğrenmesi gibi büyük veriler üzerinde analiz çalışmaları yapılmak-
tadır. Veri analizi, oyun geliştirme, robotik uygulamalar ve mobil uygulamalar da Python programlama
dilinin bize sağladığı uygulama geliştirme ortamları olarak gösterilebilir.
BAŞLARKEN
Python programlama dili, Guido van Rossum tarafından 1990 yılında tasarlanmaya başlanmıştır. Bu
programlama dili ismini de sanıldığı gibi bir yılan cinsinden değil, Monty Python’s Flying Circus isimli skeç
ve çizgi film sahnelerinden oluşan 45 bölümlük diziyi sergileyen Monty Python adlı altı kişilik bir İngiliz
komedi grubundan almıştır.
Ocak 1994’te 1.0 versiyonu çıkan Python dilinin 2.0 versiyonu Ekim 2000’de, 3.0 versiyonu ise Aralık
2008’de piyasaya çıkmıştır. Günümüzdeki geliştirme faaliyetleri ise 2001 yılında kurulan ve kar amacı
gütmeyen Python Yazılım Vakfı (Python Software Foundation) etrafında toplanan gönüllüler vasıtasıyla ger-
çekleştirilmektedir. Python kaynak kodu ise GNU Genel Kamu Lisansı (GPL) altında kullanılmaktadır.
Python Özellikleri
Python, platformlar arası bir programlama dilidir, yani Microsoft Windows, Linux ve MacOS gibi
farklı işletim sistemlerinde çalışabilmektedir. Bunun yanında ücretsiz ve açık kaynak kodlu bir dildir. Gü-
nümüz Linux ve MacOS işletim sistemlerinin çoğunda önceden yüklenmiş olarak bulunmaktadır.
Python programlama dili, Interpreted Language yani yorumlanan diller mimarisinde tasarlanmıştır.
Yani çoğu diğer yüksek seviye diller gibi derleme (compilation) ve çalıştırma (execution) şeklinde ayrı
adımları yoktur. Kodlar yorumlayıcı tarafından satır satır çalıştırılır.
Python, yeni kullanıcılar için öğrenmesi ve kullanması kolay, basit bir dil olarak tasarlanmıştır. Kuru-
lumu ve yazım kuralları basittir. Bellek temizliği (Garbage Collector) gibi işleri yöneten otomatik bellek
yönetimi özelliğine sahiptir.
Python, yüksek seviyeli yani kullanıcıya daha yakın bir programlama dilidir. Yorumlanabilir, nesne
yönelimli ve dinamik bir yapıya sahip bir dil olan Python; Yapay zeka uygulamaları, derin makine öğren-
mesi, görüntü işleme, uzaktan kontrol, veri analizleri ve veri kontrolleri, oyun ve blockchain gibi çok çeşitli
alanlarda uygulama geliştirmeye imkan sağlamaktadır.
Python programlama dilinin bazı özelliklerinden de şu şekilde bahsedebiliriz:
• Basit yazım kuralları (Syntax) sayesinde kodun okunması kolaydır.
• Kodlar satır bazlı derlenerek çalıştırılır. Yani diğer çoğu dil gibi satır sonlarındaki “;” gibi işaretleri
dikkate alarak çalışmaz.
• Kolay okunan kodları sayesinde kodun bakım ve geliştirmesi de kolaydır.
3
1
Python ile Programlamaya Giriş
• Anahtar kelimeler, açık bir söz dizimi ve basit yapısı ile yeni başlayanların da hızlı bir şekilde öğren-
melerini sağlar.
• Farklı platformlarda aynı arabirim ile çalışarak kodun taşınabilir olmasını sağlar.
• Çalışma zamanında yorumlayıcı tarafından işlenir. Çalıştırmadan önce programın derlenmesi ge-
rekmez. Bu özelliği ile PERL ve PHP gibi script dillerine benzemektedir.
• Çeşitli amaçlar için hazırlanmış, büyük çoğunluğu Windows, MacOS ve Linux üzerinde çalışabilen
kullanımı kolay bir çok kütüphaneleri vardır.
• Tüm ticari veritabanı uygulamalarını destekler.
• Farklı platformlarda çalışabilen ve taşınabilen GUI (kullanıcı arayüzü) oluşturulmasını sağlar.
• Nesne yönelimli bir dil olmasının yanında, fonksiyonel ve prosedür tabanlı programlama metotla-
rını da destekler.
• Otomatik çöp toplama (garbage collector) desteği vardır.
• Dinamik tip kontrolünü destekler ve yüksek seviyeli dinamik veri tiplerini sağlamaktadır.
• Java, C, C++, CORBA, ActiveX ve COM ile kolay bir şekilde entegre edilebilir.
• Büyük programlar için de daha iyi ve ölçeklenebilir bir yapıyı desteklemektedir.
Mac ortamında terminal açmak için görev çubuğunda bulunan kısa yoldan veya Launchpad’e bası-
lınca açılan MacOS başlangıç menüsünden Diğer (Other) klasöründeki Terminal ikonuna tıklanarak
da açılabilir.
4
1
Programlama II
C:\Users\default>python
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit
(AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
Eğer >>> şeklinde bir veri girişi istenen ekran karşımıza çıkıyorsa, derleyici açılmış demektir. Açılan bu
ekrana “immediate mode” adı verilmektedir, yani anında Python kodu yazıp enter tuşuna basarak çalıştı-
rabileceğiniz bir kod editörüdür diyebiliriz.
Python kodu içeren “.py” uzantılı dosyaları da komut satırından çalıştırabiliriz. Herhangi bir metin
editörü ile “merhaba_dunya.py” isimli bir dosya hazırlayalım. İçerisine de aşağıdaki kod satırını ekleyerek
kaydedelim.
print("Merhaba Dünya")
Dosyanın konumu bilgisayarınızdaki geçerli kullanıcı klasörü olduğunu varsayarak aşağıdaki komut
ile bu dosyayı çalıştıralım. Komut çalıştırıldığında ekrana “Merhaba Dünya” yazdırıldığını göreceksiniz.
Böylece ilk Python programımızı yazmış olacağız.
En güncel kurulum dosyalarına, çeşitli dosya ve bilgilere Python’un resmi web sitesi [Link]
[Link]/ adresinden erişebilirsiniz. Python kurulum dosyası çok çeşitli platformlar için mevcuttur.
Yalnızca kendi kullandığınız işletim sistemi için geçerli olan dosyayı indirmeniz ve Python’u yüklemeniz
gerekmektedir. Python 2 ve 3 sürümleri daha yaygın olarak kullanılmaktadır. Bu ana sürümlerin de birçok
alt sürümü mevcuttur. Kullanılan Python modüllerine göre uygun sürümlerin yüklenmesi gerekmektedir.
Kitabımızda, sahip olduğu yeni özellikler sebebiyle Python 3 sürümü incelenecektir.
Python programlama dilinin çeşitli platformlara yüklemeye ilişkin adımları kısaca inceleyelim.
5
1
Python ile Programlamaya Giriş
Sudo apt-get update komutu, yapılandırılmış tüm kaynaklardan paket bilgilerini güncellemek için
kullanılır.
Sudo apt-get install paket_adı_versiyon komutu ise, çevrimiçi yazılım deposundan istediğiniz uygula-
manın en son sürümünü indirmek için kullanılır.
Günümüzde Linux işletim sistemlerinin neredeyse tümünde Python kurulu olarak gelmektedir. Ara-
larındaki tek fark ise kurulu olan sürümüdür. Bu noktada, Python 2.X sürümüne de sahip olabilirsiniz.
$ python
$ python3
Windows Kurulumu
Windows işletim sistemlerinde Python kurulu olarak gelmemektedir. Python programlama dilini kur-
mak için [Link] adresinden son sürümün kurulum dosyasının indirilmesi ge-
rekmektedir. “exe” uzantılı kurulum dosyasını indirip çift tıklayarak kurulumu başlatabilirsiniz. Eğer önta-
nımlı ayarlar ile kurarsanız, Python programlama dili %LOCALAPPDATA%\Programs\Python dizinine
kurulacaktır. “Customize Installation” düğmesine basılarak kurulumun özelleştirilerek istenilen klasöre
kurulması sağlanabilir.
MacOS Kurulumu
MacOS işletim sisteminde Python kurulumu için [Link] adresinden
Python derleyicisinin istenilen sürümü seçilerek indirilir. İndirileren “pkg” uzantılı dosya ile Python der-
leyicisi kurulumu gerçekleştirilir.
6
1
Programlama II
• Thonny IDE’nin [Link] sitesinden işletim sisteminize uygun kurulum dosyasını indi-
rerek çalıştırın.
• Dosya > Yeni menüsüne tıklayarak yeni bir dosya açın. Ardından dosyayı .py uzantılı olarak kayde-
din. Örneğin, [Link], ö[Link] gibi. Dosyaya herhangi bir isim verebilirsiniz, ancak, dosya
adı “.py” ile bitmelidir.
• Dosyaya Python kodunu yazın ve kaydedin.
• Ardından Çalıştır > Geçerli betiği çalıştır’a tıklayarak veya F5’e basarak programı çalıştırabilirsiniz.
Öğrenme Çıktısı
1 Python programlama dilinin ve kod geliştirme arayüzünün kurulumunu gerçekleştirebilme
7
1
Python ile Programlamaya Giriş
TEMEL KAVRAMLAR
Programlama dillerinde de tıpkı konuşma dillerinde olduğu gibi yazım kuralları vardır. Programlama
dilleri dizayn edilirken, kodların yorumlanması veya derlenmesi de bu kurallara uygun şekilde gerçekleş-
mektedir. Bu kurallar doğru şekilde uygulanmadığı zaman hatalara neden olacaktır. Ayrıca bu kurallara
uygun şekilde yazılan kodun daha anlaşılır olmasının yanında güncelleme, hata ayıklama gibi işlemlerin
daha kolay gerçekleştirilmesi sağlanacaktır.
Python Tanımlayıcıları
Tanımlayıcı, sınıf, işlevler, fonksiyonlar, değişkenler vb. varlıklara verilen isimdir. Bir varlığı diğerinden
ayırmaya yardımcı olur. Python 3 sürümünden itibaren Unicode (UTF-8) desteği sağlamaktadır. Böylece
hem verilerde hem de program içerisinde kullanılan değişken, metot ve sınıf isimlendirmelerinde Türkçe
karakterler kullanılabilir.
Tanımlayıcı yazma kurallarını da şu şekilde listeleyebiliriz:
• Tanımlayıcılar, küçük harf (a’dan z’ye) veya büyük harf (A’dan Z’ye) veya rakamlardan (0 ila 9) veya
alt çizgi _’den oluşan bir harf kombinasyonu olabilir.
- myClass, var_1 ve print_this_to_screen gibi isimlendirmelerin tümü geçerli örneklerdir.
• Bir tanımlayıcı bir rakamla başlayamaz.
• 1değişken geçersiz, ancak değişken1 geçerli bir isimlendirmedir.
• Anahtar kelimeler tanımlayıcı olarak kullanılamaz. Bu şekilde kullanıldığında, kod yorumlanırken
geçersiz sözdizimi hatası verecektir.
global = 1
8
1
Programlama II
Kod Çıktısı:
File "<interactive input>", line 1
global = 1
^
SyntaxError: invalid syntax
a@ = 0
Kod Çıktısı:
File "<interactive input>", line 1
a@ = 0
^
SyntaxError: invalid syntax
bu_cok_uzun_bir_degisken_tanimlayicisidir_ve_bir_sinir_yoktur = 0
dikkat
Python büyük/küçük harfe duyarlı bir dildir. Bu, Değişken ve değişken tanımlayıcı isimlendimeleri-
nin aynı olmadığı anlamına gelmektedir.
Tanımlayıcılara her zaman anlamlı bir isim vermek daha mantıklı olacaktır. Böylece uzun bir aradan
sonra kodunuza baktığınızda neyi temsil ettiğini anlamak daha kolay olacaktır. s = 10 geçerli bir isimlen-
dirme olsa da, sayac = 10 yazmak daha açıklayıcı olacaktır.
dikkat
cok_uzun_bir_degisken gibi bir alt çizgi kullanılarak birden çok kelime ayrılabilir.
a = 1 + 2 + 3 + \
4 + 5 + 6 + \
7 + 8 + 9
9
1
Python ile Programlamaya Giriş
Bu açık bir satırın devamıdır. Python’da, parantezler ( ), köşeli ayraçlar [ ] ve süslü parantezler { } içinde
de satır devamı belirtilir. Örneğin, yukarıdaki çok satırlı ifadeyi şu şekilde de ifade edebiliriz:
a = (1 + 2 + 3 +
4 + 5 + 6 +
7 + 8 + 9)
colors = ['red',
'blue',
'green']
Aşağıdaki gibi noktalı virgül kullanarak birden çok ifadeyi tek bir satırda da kodlayabiliriz:
a = 1; b = 2; c = 3
for i in range(1,11):
print(i)
if i == 5:
break
Python’daki girinti yapısı, kodun düzgün ve temiz görünmesini sağlar. Böylece her zaman benzer ve
tutarlı görünen Python programlarıyla karşılaşırız. Satır devamında girinti yok sayılabilir, ancak girinti
yapmak her zaman iyi bir fikirdir. Kodu daha okunaklı hale getirir. Örneğin:
Kod:
if True:
print('Hello')
a = 5
if True: print('Hello'); a = 5
Her iki kod yazımı da geçerlidir ve aynı şeyi yapar, ancak ilk yazım formatı daha açık ve okunaklıdır.
Kod yazarken yapılacak bir yanlış girinti, “IndentationError” ile sonuçlanacaktır.
10
1
Programlama II
Yeni yazdığınız programın önemli ayrıntılarını bir ay içinde unutabilirsiniz. Bu yüzden bu kavramlar
için yorum şeklinde yapılan açıklamalar, kodu yazan ya da inceleyen yazılımcılar için zamandan kazanç
sağlayacaktır.
Python programlama dilinde, yorum yazmaya başlamak için hash (#) sembolü kullanılmaktadır. Yeni
satır karakterine kadar uzanır. Python yorumlayıcısı yorumları yok saymaktadır, yani yazılan yazıların
kodunuzu bozma ihtimali yoktur.
Bunu yapmanın başka bir yolu da '''' (tek tırnak) veya """ (çift tırnak) şeklinde üçlü tırnak kullanmak-
tır. Bu üçlü tırnak işaretleri genellikle çok satırlı açıklamalar için kullanılır. Ancak çok satırlı bir yorum
olarak da kullanılabilirler. Bu yorumlar dokümantasyon dizesi (Docstring) olmadıkça, herhangi bir ekstra
kod üretmezler.
def double(num):
"""double değer hesaplayan fonksiyon"""
return 2*num
Belge dizeleri, bir işlevin, sınıfın veya modülün tanımından hemen sonra eklenir. Bu sayede doküman
dizelerinin üçlü tırnak kullanan çok satırlı yorumlardan ayrılması sağlanır. Belge dizeleri, nesneyle __
doc__ öznitelikleri olarak ilişkilendirilir. Böylece, yukarıdaki işlevin belgelerine aşağıdaki kod satırlarıyla
erişilebilir:
Kod:
def double(num):
"""double değer hesaplayan fonksiyon"""
return 2*num
print(double.__doc__)
11
1
Python ile Programlamaya Giriş
Kod Çıktısı:
double değer hesaplayan fonksiyon
Değişkenler
Değişkenler, verileri depolamak için ayrılmış bellek alanlarıdır. Bu, bir değişken oluşturulduğunda bel-
lekte bir yer ayrıldığı anlamına gelmektedir. Daha basit bir ifade ile değişkenler, verileri bellekte depolamak
için kullanılan bellek konumlarının isimlendirmesi olduğu söylenebilir.
sayi = 26
Değişkenleri içinde kitap saklanan bir çanta gibi düşünebiliriz ve çantadaki kitap her an değiştirilebilir.
sayi = 26
sayi = 26.2
Başlangıçta sayı değişkeninin değeri 26 idi ve daha sonra 26.2 olarak değiştirildi. Python’da aslında
değişkenlere değer atanmaz. Bunun yerine Python, değerimizin hafızadaki referansını değişkene verir.
Python dilinde değişkenlere bellek alanı ayırmak için açık bildirimlere yani değişken türlerinin önce-
den tanımlanmasına gerek yoktur. Değişken tipi yokmuş gibi algılansa da, değişken tipleri atanan değere
göre yorumlama sırasında belirlenir. Değişkenin türü, yeni değer atamalarında rahatça değiştirilebilir. De-
ğer atamaları için “=” işareti kullanılmaktadır.
Kod:
deger = 222 # deger değişkeni sayı (int) türünde
print(deger )
deger = "Anadolu" # deger değişkeni şimdi metin (string) türüne dönüştü
print(deger )
Kod Çıktısı:
222
Anadolu
sayi = 26222
noktali_sayi = 26.22
metin = "Programlama öğreniyorum"
12
1
Programlama II
Burada sayi1 değişkenine 56, sayi2 değişkenine 11 ve metin1 değişkenine de Eskişehir değerleri ataması
yapılmıştır.
dikkat
Nesne yönelimli programlamada iki tür atamadan bahsedilebilir. Biri değer tabanlı atama, diğeri de adres
tabanlı atamadır. Değer tabanlı atamada aynı değeri alan değişkenlerin değerleri değiştirilince farklı ad-
resleri işaret ettiği için değişkenlerin değerleri bu değişiklikten etkilenmez. Fakat adres tabanlı atamalarda,
değişkenler hafızadaki adresi işaret ettiği için aynı değeri alan değişkenlerden birinin değeri değiştiğinde,
diğer değişkenin de değeri değişmektedir.
Sabitler
Sabit, değeri değiştirilemeyen bir değişken türüdür. Sabitler, ileride değiştirilemeyecek bilgileri tutan
kaplar olarak düşünülebilir. Python’da sabit diye bir kavram yoktur, fakat sabitleri tanımlarken bazı kulla-
nım önerileri vardır.
Sabitler genellikle bir modülde bildirilir ve bu modül ana program içerisine dahil edilir. Burada modül,
ana dosyaya aktarılan değişkenleri, işlevleri vb. içeren yeni bir dosyadır. Modülün içinde, sabitler sözcükleri
ayırarak tamamı büyük harflerle ve alt çizgilerle yazılır.
dikkat
Python programlama dilinde sabit kavramı yoktur. Sabitlerin anlaşılabilmesi için büyük harfle yazılması
daha uygun görülmüştür. Aynı dosya içinde hatta küçük harfle tanımlandığında da bir sorun oluşturmaz.
import sabit_degerler
print(sabit_degerler.YER_CEKIMI) # 9.80665
print(sabit_degerler.PI) # 3.14159
13
1
Python ile Programlamaya Giriş
Yukarıdaki kod örneklerinden de görüldüğü gibi, sabit_degerler.py dosyasında iki tane sabit olmasını
istediğimiz değer tanımladık. Daha sonra bu değerleri kullanabilmek için [Link] yani kodumuzu çalış-
tıracağımız ana dosyaya bu dosyayı dahil ettik. Dikkat edilirse, sabitlerin bulunduğu dosya adından sonra
“.” karakteri ile içerdiği sabit değerlerimize erişebiliyoruz.
Veri Tipleri
Python’daki her değişken bir nesnedir ve bunların sahip oldukları veriler farklı türlerde olabilir. Ör-
neğin, bir kişinin yaşı sayısal bir değer olarak kaydedilirken, adresi karakter dizisi olarak saklanmaktadır.
Python, olası işlemleri ve farklı depolama yöntemlerini tanımlamak için kullanılan çeşitli standart veri
türlerine sahiptir.
Python’da beş standart veri türü vardır. Bunlar:
• Numbers (Sayılar)
• String (Karakter Dizisi)
• List (Liste)
• Tuple (Demet)
• Dictionary (Sözlük)
Python’da değişkenlere atanan değerlerin ya da dışarıdan kullanıcıdan alınan verilerin tipini öğrenebil-
mek için type() fonksiyonu kullanılmaktadır.
Kod:
metin = "Python öğrenmeye yeni başladım..."
sayi = 2626
noktali_sayi = 12.45
listem = [34, 26.1, 'Python öğreniyorum']
demet = ( 20.26, 'Anadolu', 26+4j )
sozluk = {1:'değer','anahtar':2.6}
print(type(metin ))
print(type(sayi ))
print(type(noktali_sayi ))
print(type(listem ))
print(type(demet ))
print(type(sozluk ))
Kod Çıktısı:
<class 'str'>
<class 'int'>
<class 'float'>
<class 'list'>
<class 'tuple'>
<class 'dict'>
Veri türleri ileriki ünitelerde daha detaylı anlatılacaktır fakat ön bilgi olması amacıyla burada kısaca
bahsedeceğiz.
14
1
Programlama II
Numbers (Sayılar)
Sayı veri tipleri sayısal değerleri saklamaktadır. Bu türlere bir değer atandığında sayı nesneleri oluşturulur.
hiz = 50
mesafe = 126
sure = 12
Ayrıca “del” ifadesini kullanarak bir sayı nesnesine yapılan başvuruyu silebilirsiniz. del ifadesinin kul-
lanımı da şu şekildedir:
del var1[,var2[,var3[....,varN]]]]
Tekli veya çoklu nesneyi silmek için “del” komutu kullanılabilir. Örnek kod üzerinde inceleyecek olursak:
del hiz
del mesafe, sure
dikkat
Python, uzun tam sayıları büyük L harfiyle görüntüler. Küçük “l” harfi kullanılmasına izin verir, ancak
1 sayısıyla karıştırılmaması için yalnızca büyük “L” harfi kullanılması önerilir.
Karmaşık bir sayı, x + yj ile gösterilen bir gerçel kayan noktalı sayı çiftinden oluşur; burada x ve y gerçel
sayılardır ve j sanal birimdir.
15
1
Python ile Programlamaya Giriş
Kod:
#!/usr/bin/python
Kod Çıktısı:
Merhaba Dünya!
M
rha
rhaba Dünya!
Merhaba Dünya!Merhaba Dünya!
Merhaba Dünya! Bu kısmı da ekledik...
dikkat
Python dilinde karakter dizileri (String) değiştirilemez (immutable) yapıda tasarlandıkları için bu diziye
ekleme ya da çıkartma yapılamaz.
List (Liste)
Liste, sıralı bir öğe dizisidir. Python’da en çok kullanılan veri tiplerinden biridir ve çok esnektir. Bir
listedeki tüm öğelerin aynı türden olması gerekmez. Listeler string, tamsayı, ondalık sayı, tuple ve liste
elemanlarından oluşabilir. Liste veri tipi değiştirilebilir (mutable) bir yapıya sahiptir. Yani bu veri tipine
eleman ekleme, çıkartma ve güncelleme işlemleri yapılabilmektedir.
Bir liste tanımlamak oldukça basittir. Virgülle ayrılmış öğeler parantez [ ] içine alınır.
Listeden bir öğeyi veya bir dizi öğeyi çıkarmak için dilimleme operatörünü [ ] kullanabiliriz. Dikkat
edilmesi gereken bir husus da Python’da dizin elamanlarının 0’dan başlamasıdır.
16
1
Programlama II
Kod:
asallar = [2, 3, 5, 7, 11, 13, 17, 19]
# asallar [2] = 5
print("asallar [2] = ", asallar [2])
Kod Çıktısı:
asallar [2] = 5
asallar [0:3] = [2, 3, 5]
asallar [5:] = [13, 17, 19]
Tuple (Demet)
Tuple, farklı veri tiplerinin bir araya gelerek oluşturdukları veri tipine denir. Liste ile benzer sıralı bir öğe
dizisidir. Tek farkları, Tuple’ın değişmez olmasıdır. Tuple’lar bir kez oluşturulduktan sonra değiştirilemez.
Tuple’lar, verileri yazmaya karşı korumak için kullanılır ve dinamik olarak değiştirilemedikleri için ge-
nellikle listelerden daha hızlıdır. Tuple elemanları virgülle ayrılan parantez () içinde tanımlanır.
Tuple yapısında da elemanlara erişebilmek için dilimleme operatörü olan “[ ]” kullanabiliriz ancak
değerini değiştiremeyiz.
Kod:
demet = ( 20.26, 'Anadolu', 26+4j )
# demet[1] = Anadolu
print("demet[1] = ", demet[1])
Kod Çıktısı:
demet[1] = Anadolu
demet[0:3] = (20.26, 'Anadolu', (26+4j))
Traceback (most recent call last):
File "[Link]", line 14, in <module>
demet[1] = "Eskişehir"
TypeError: 'tuple' object does not support item assignment
17
1
Python ile Programlamaya Giriş
Kodun çıktısından da görüldüğü gibi, Tuple tipinde tanımlanmış değişkenlerin değerleri sonradan
müdahale edilerek değiştirmeye izin verilmemektedir.
Dictionary (Sözlük)
Sözlük, anahtar - değer çiftlerinin sırasız bir koleksiyonudur. Liste ve Tuple gibi farklı veri tiplerinin
bir araya gelerek oluşturduğu veri tipidir. Tuple’dan farkı ise, sözlük tipi değiştirilebilir olduğu için eleman
ekleme, çıkarma ve güncelleme işlemleri yapılabilmektedir. Genellikle büyük miktarda verimiz olduğunda
kullanılır. Sözlükler veri almak için optimize edilmiştir. Ancak değeri alabilmek için anahtarı bilmeliyiz.
Python’da sözlükler, her öğe anahtar:değer biçiminde bir çift olacak şekilde süslü parantezler { } içinde
tanımlanır. Değer kısmı herhangi bir veri tipinden değer alabilirken, anahtar kısmı sadece string ve int
değerler alabilir.
Kod:
sozluk = {1:'değer','anahtar':2.6}
print(type(sozluk ))
# Hata oluşacaktır
print("sozluk [2] = ", sozluk [2])
Kod Çıktısı:
<class 'dict'>
sozluk [1] = değer
sozluk ['anahtar'] = 2.6
Traceback (most recent call last):
File "[Link]", line 9, in <module>
print("sozluk [2] = ", sozluk [2])
KeyError: 2
Kod çıktısında alınan hatanın nedeni, sözlük değişkeninde anahtar değeri “2” olan bir atama bulunmamasıdır.
Tür Dönüşümü
Kimi durumlarda veri tipleri arasında dönüşüme ihtiyaç duyulabilmektedir. Farklı veri tipleri arasında
int(), float(), str() gibi tip dönüştürme fonksiyonlarını kullanarak dönüştürme yapabiliriz. En fazla tür
dönüşümleri string ve integer ifadeler arasında gerçekleşmektedir.
int() => Sayı değerli karakter dizisini veya sayıyı tam sayıya çevirir
float() => Sayı değeri veya sayı içeren karakter dizisini noktalı sayıya çevirir
str() => Sayıyı karakter dizisine dönüştürür
18
1
Programlama II
Kod:
sayi_int = 123
sayi_flo = 1.23
print("sayi_yeni değeri:",sayi_yeni )
print("sayi_yeni veri tipi:",type(sayi_yeni ))
Kod Çıktısı:
sayi_int veri tipi: <class 'int'>
sayi_flo veri tipi: <class 'float'>
sayi_yeni değeri: 124.23
sayi_yeni veri tipi: <class 'float'>
Yukarıdaki kod parçasında, sayi_int ve sayi_flo olmak üzere iki değişken ekleyerek değeri sayi_yeni
içinde saklıyoruz. Sırasıyla her üç nesnenin veri tipini incelediğimizde, sayi_int veri türünün bir tamsayı,
sayi_flo veri türünün bir kayan nokta olduğunu görebiliriz. Ayrıca, Python veri kaybını önlemek için her
zaman daha küçük veri türlerini daha büyük veri türlerine dönüştürdüğü için sayi_yeni’nin bir kayan nokta
veri türüne sahip olduğunu görmekteyiz.
Metin dizisi (yüksek) veri tipi ve tamsayı (düşük) veri tipinin eklenmesini inceleyelim.
Kod:
sayi_int = 123
sayi_str = "456"
print(sayi_int+sayi_str)
Kod Çıktısı:
sayi_int veri tipi: <class 'int'>
sayi_str veri tipi: <class 'str'>
Traceback (most recent call last):
File "[Link]", line 7, in <module>
print(sayi_int+sayi_str)
TypeError: unsupported operand type(s) for +: 'int' and 'str'
19
1
Python ile Programlamaya Giriş
Yukarıdaki programda,
sayi_int ve sayi_str olmak üzere iki değişken tanımlandı. Kodun çıktısından da görüldüğü gibi TypeEr-
ror aldık. Python, bu gibi durumlarda Örtülü Dönüştürmeyi gerçekleştiremez.
Böyle durumlar için Python’un Açık Dönüştürme çözümünü kullanabiliriz.
Kod:
sayi_int = 321
sayi_str = "987"
sayi_str = int(sayi_str)
print("Tür dönüşümünden sonra sayi_str veri tipi:",type(sayi_str))
Kod Çıktısı:
sayi_int veri tipi: <class 'int'>
Tür dönüşümünden önce sayi_str veri tipi: <class 'str'>
Tür dönüşümünden sonra sayi_str veri tipi: <class 'int'>
sayi_int ve sayi_str toplamları: 1308
Toplamın veri tipi: <class 'int'>
20
1
Programlama II
Öğrenme Çıktısı
2 Anahtar kelimelerin ve değişken isimlerinin tanımlamasını kavrayabilme
21
1
Python ile Programlamaya Giriş
Çıkış İşlemleri
Verileri standart çıktı aygıtında yani ekranda görüntülemek için print() işlevini kullanırız. Veriler bir
dosyaya da gönderilebilir, dosya işlemlerinin detayları ilerideki konularda incelenecektir.
Kod:
print('Bu yazı ekrana yazdırılacak')
x = 925
print('x in değeri:', x)
Kod Çıktısı:
Bu yazı ekrana yazdırılacak
x in değeri: 925
Yukarıdaki kod parçasının çıktısında, metin ve x değişkeninin değeri arasında öntanımlı bir şekilde bir
boşluk gelmektedir. Print metodunun parametreleri de şu şekildedir:
Kod:
print(1, 2, 3, 4)
print(1, 2, 3, 4, sep='*')
print(1, 2, 3, 4, sep='|', end='&')
Kod Çıktısı:
1 2 3 4
1*2*3*4
1|2|3|4&
Çıktı Formatlama
Çıktımızın göze hoş görünmesi için biçimlendirmek gerekebilir. Bu biçimlendirme işlemi [Link]()
metodu kullanılarak yapılabilir. Bu yöntem herhangi bir string ifade tarafından kullanılabilir.
Kod:
a = 13; b = 43
print('a değeri {} ve b değeri {}'.format(a,b))
Kod Çıktısı:
a değeri 13 ve b değeri 43
Burada küme parantezleri { } yer tutucu olarak kullanılır. Sayıları (tuple indeksi) kullanarak da yazdı-
rılacakları sırayı belirtebiliriz.
22
1
Programlama II
Kod:
print('{0} ve {1} derslerini çok severim'.format('fizik','kimya'))
print('{1} ve {0} derslerini çok severim'.format('fizik','kimya'))
Kod Çıktısı:
fizik ve kimya derslerini çok severim
kimya ve fizik derslerini çok severim
Kod:
print('Merhaba {isim}, {selamlama}'.format(selamlama = 'Günaydın', isim
= 'Kamil'))
Kod Çıktısı:
Merhaba Kamil, Günaydın
String ifadeler “%” operatörü yardımıyla da biçimlendirilebilir. Virgülden sonra kaç değerin yazdırıl-
ması isteniyor ise .f kullanırız.
Kod:
x = 123.456789
print('x değeri %3.2f' %x)
print('x değeri %3.4f' %x)
print('x değeri %3.6f' %x)
Kod Çıktısı:
x değeri 123.46
x değeri 123.4568
x değeri 123.456789
Giriş İşlemleri
Şimdiye kadar incelediğimiz kod örnekleri statikti yani değişkenlerin değeri kod içinde sabit olarak
tanımlanmıştı. Bu kısımda ise kullanıcıdan veri almayı ve bu veriler ile işlem yapmayı inceleyeceğiz.
Hazırladığımız kodlar içinde esnekliğe izin vermek amacıyla kullanıcıdan veri alma ihtiyacı ortaya çıka-
bilir. Python’da buna izin vermek için input() metoduna sahibiz. input() sözdizimi şöyledir:
input([mesaj])
Gösterimdeki “mesaj” parametresi isteğe bağlı olarak eklenebilir. Buraya yazılacak mesaj ekranda
görüntülenecektir.
Kod:
veri = input('Bir sayı giriniz: ')
print( veri )
print( type( veri ) )
veri = int( veri )
print( type( veri ) )
23
1
Python ile Programlamaya Giriş
Kod Çıktısı:
Bir sayı giriniz: 123
123
<class 'str'>
<class 'int'>
Kod çıktısından da görüldüğü gibi, input fonksiyonu ile alınan verinin tipi hafızada string olarak tutul-
maktadır. Bu değeri int() veya float() fonksiyonları yardımıyla sayısal bir değere dönüştürebiliriz.
Kod:
import math
print( [Link] )
Kod Çıktısı:
3.141592653589793
Artık matematik modülündeki tüm tanımları kodumuz içinde kullanabiliriz. Ayrıca “from” anahtar
sözcüğünü kullanarak yalnızca bazı belirli özellikleri ve işlevleri de kodumuza aktarabiliriz. Örneğin:
Kod:
from math import pi
print( pi )
Kod Çıktısı:
3.141592653589793
İçe alma fonksiyonunu iki farklı dosya içeriği ile bir örnek üzerinde inceleyelim.
sabit_degerler.py dosyası içeriği
UNIVERSITE = "Anadolu"
BOLUM = "Programlama"
DONEM_SAYISI = 4
import sabit_degerler
Kod Çıktısı:
Anadolu Üniversitesine hoşgeldiniz! Programlama Bölümü 4 dönemlik bir bölümdür.
24
1
Programlama II
Öğrenme Çıktısı
3 Giriş / çıkış fonksiyonlarının ifade edilebilmesi ve harici modüllerin kod içerisinde
kullanılmasını kavrayabilme
OPERATÖRLER
Python’da operatörler, değişkenler ve değerler arasında aritmetik veya mantıksal hesaplama yapan özel
sembollerdir. Operatörün üzerinde çalıştığı değere işlenen denir.
21 + 5 = 26
Aritmetik Operatörler
Aritmetik operatörler toplama, çıkarma, çarpma gibi matematiksel işlemleri gerçekleştirmek için kullanılır.
Aşağıdaki tabloda Python tarafından desteklenen aritmetik operatörler ve kullanım örnekleri bulunmaktadır.
25
1
Python ile Programlamaya Giriş
Tabloda verilen aritmetik operatörlerin kod içerisinde kullanımını da bir örnek ile inceleyelim.
Kod:
x = 15
y = 4
print('x + y =',x+y)
print('x - y =',x-y)
print('x * y =',x*y)
print('x / y =',x/y)
print('x // y =',x//y)
print('x ** y =',x**y)
Kod Çıktısı:
x + y = 19
x - y = 11
x * y = 60
x / y = 3.75
x // y = 3
x ** y = 50625
Karşılaştırma Operatörleri
Karşılaştırma operatörleri de değerleri karşılaştırmak amacıyla kullanılmaktadır. Koşullara göre True
veya False döndürür. Aşağıdaki tabloda Python tarafından desteklenen karşılaştırma operatörleri ve kulla-
nım örnekleri bulunmaktadır.
Tabloda verilen karşılaştırma operatörlerinin kod içerisinde kullanımını da bir örnek ile inceleyelim.
Kod:
x = 34
y = 26
26
1
Programlama II
Kod Çıktısı:
x > y is True
x < y is False
x == y is False
x != y is True
x >= y is True
x <= y is False
Mantıksal Operatörler
Mantıksal operatör olarak and, or ve not kullanılmaktadır. Aşağıdaki tabloda Python tarafından destek-
lenen mantıksal operatörler ve kullanım örnekleri bulunmaktadır.
Tabloda verilen mantıksal operatörlerin kod içerisinde kullanımını da bir örnek ile inceleyelim.
Kod:
x = True
y = False
Kod Çıktısı:
x and y : False
x or y : True
not x : False
27
1
Python ile Programlamaya Giriş
Atama Operatörleri
Atama operatörleri, değişkenlere değer atamasında kullanılırlar.
a = 99, sağdaki 99 değerini soldaki a değişkenine atayan basit bir atama operatörüdür.
Python’da da, diğer çoğu programlama dilinde olduğu gibi, a += 5 ifadesini destekler. Yani değişkene
değer ekleyerek atama yapan çeşitli bileşik operatörler vardır. Bu ifade de a = a + 5’e eşittir.
28
1
Programlama II
Özel Operatörler
Python dili, kimlik operatörü veya üyelik operatörü gibi bazı özel operatör türlerini içermektedir.
Kimlik Operatörleri
“is” ve “is not”, Python’daki kimlik operatörleridir. İki değerin (veya değişkenin) belleğin aynı bölü-
münde bulunup bulunmadığını kontrol etmek için kullanılırlar. İki değişkenin eşit olması, her zaman
onların aynı olduğu anlamına da gelmemektedir.
Kod:
x1 = 25
y1 = 25
x2 = 'Merhaba'
y2 = "Merhaba"
x3 = [10,20,30]
y3 = [10,20,30]
Kod Çıktısı:
False
True
False
Örnek kodumuzu inceleyecek olursak; x1 ve y1’in aynı değerlere sahip tamsayılar olduğunu görüyoruz,
bu yüzden bunlar hem eşit hem de aynı. Aynı durum x2 ve y2 (string-dizeler) için de geçerlidir, yani x2 ve
y2 değişkenleri de eşittir.
Ancak x3 ve y3 listelerdir. Eşittirler ama özdeş değildirler. Çünkü Python kod yorumlayıcısı, eşit olma-
larına rağmen bu türdeki değişkenleri farklı hafıza birimlerine yerleştirir.
Üyelik Operatörleri
Python’daki üyelik operatörleri “in” ve “not in” olarak tanımlanmıştır. Bir dizide (string, list, tuple,
set ve dictionary) bir değerin veya değişkenin bulunup bulunmadığını test etmek için kullanılırlar. Fakat
dictionary tipinde sadece anahtar kelimenin olup olmadığı kontrol edilebilir, değer kontrolü yapılamaz.
29
1
Python ile Programlamaya Giriş
Kod:
x = 'Python öğreniyorum'
y = {1:'O',2:'N',3:'A'}
print('p' in x)
print('Yorum' not in x)
print(1 in y)
print('A' in y)
Kod Çıktısı:
False
True
True
False
x değişkeninde ‘P’ değeri mevcuttur fakat ‘p’ değeri olmadığı için False çıktısı alıyoruz. Çünkü Python
büyük/küçük harf duyarlıdır. “Yorum” kelimesi büyük harf ile başladığı için, x metninin içinde bulunma-
maktadır, bu yüzden “not in” şartını sağlar ve True değeri döndürmektedir. Benzer şekilde, 1 anahtardır ve
True sonucu vermektedir. Fakat ‘A’, y sözlüğündeki değerdir, bu nedenle, False değerini döndürür.
Yaşamla İlişkilendir
30
1
Programlama II
Python ile geliştirdiğiniz bir yazılımda bir den fazla hata olsa bile python, sadece bir hatayı göster-
mektedir. Bu da python da geliştirdiğiniz yazılımda hata ayıklamayı kolaylaştırmaktadır.
Python, açık kaynak kodlu ve OSI onaylı açık kaynak lisansına sahiptir. Böylelikle yazılım geliştiri-
cileri özgür içerikler geliştirebilir ve Python’a ait kaynak kodları indirip düzenlemeler yapabilir.
Python ile geliştirilmiş bir yazılım çalıştırıldığında veri türü otomatik olarak atanmaktadır. Böyle-
likle bir kod çalıştırılacağı zaman değişken türü belirlenmez.
Python kütüphanesi oldukça geniştir. Bu da python ile birlikte hemen hemen bir çok alan da dile-
diğiniz şekilde geliştirmeler yapabileceğiniz anlamına gelmektedir.
Python, C ve C++ dili ile birlikte çoğu dil de olduğu gibi farklı platformlarda çalıştırabilmek için
kodlarınızı değiştirmenizi istemez. Yani Python ile geliştirdiğiniz bir yazılımı, tekrar değişiklik yapma
gereği duymadan tüm platformlarda çalıştırabilirsiniz. Web geliştirmelerinizi ve programlarını hem li-
nux server hem de windows server içerisinde barındırabilirsiniz. Python ile birlikte masaüstü uygula-
malarınızı, web uygulamalarınızı ve görselleştirme uygulamalarınızı rahat bir şekilde geliştirebilirsiniz.
Kaynak: Güngör, G. (2021, 29 Kasım). Python Nedir, Ne İşe Yarar? Python Kullanım Alanları. https://
[Link]/makaleler/genel/python-nedir-ne-ise-yarar-python-kullanim-alanlari/ (Erişim Ta-
rihi 03.03.2022).
Öğrenme Çıktısı
4 Python dilinde kullanılan operatörlerin kullanım alanlarını ifade edebilme
31
1
Python ile Programlamaya Giriş
Başlarken
Python, farklı işletim sistemleri üzerinde çalışabilen, açık kaynak kodlu bir programlama dilidir. Ayrıca yapı
olarak yüksek seviyeli diller grubuna girmekte ve Python yorumlayıcısı tarafından çalıştırılmaktadır. kullanıcıya
yakın bir dil olan Python; Yapay zeka uygulamaları, derin makine öğrenmesi, görüntü işleme, uzaktan kontrol,
veri analizleri ve veri kontrolleri, oyun ve blockchain gibi çok çeşitli alanlarda uygulama geliştirmeye imkan
sağlamaktadır.
Basit yazım kuralları (Syntax) sayesinde kodun okunması kolaydır. Kolay okunan kodları sayesinde kodun
bakım ve geliştirmesi de kolaydır. Anahtar kelimeler, açık bir söz dizimi ve basit yapısı ile yeni başlayanların da
hızlı bir şekilde öğrenmelerini sağlar. Çeşitli amaçlar için hazırlanmış, kullanımı kolay bir çok kütüphaneleri
vardır. Tüm ticari veritabanı uygulamalarını destekler. Otomatik çöp toplama (garbage collector) desteği vardır.
Temel Kavramlar
Diğer programlama dillerinde olduğu gibi, Python programlama dilinde de anahtar kelimeler değişken adı,
işlev/fonksiyon adı veya başka bir tanımlayıcı olarak kullanılamaz. Ayrıca değişken adları büyük küçük harf
duyarlıdır.
Tanımlayıcılar, sınıf, işlevler, fonksiyonlar, değişkenler vb. varlıklara verilen isimdir. Tanımlayıcılara anlamlı bir
isim vermek, daha sonra koda bakıldığında anlaşılması açısından yardımcı olacaktır. Python 3 sürümünden
itibaren Unicode (UTF-8) desteği sağlamaktadır. Böylece hem verilerde hem de program içerisinde kullanılan
değişken, metot ve sınıf isimlendirmelerinde Türkçe karakterler kullanılabilmektedir.
C, C++ ve Java gibi programlama dillerinin çoğunda, bir kod bloğunu tanımlamak için { } ayraçları kullanılır.
Ancak Python programlama dilinde girinti kullanır. Bir kod bloğu (bir fonksiyonun gövdesi, döngü vb.) girinti
ile başlar ve ilk girintisiz satırla biter. Girinti miktarı kullanıcıya bağlıdır, ancak bu blok boyunca tutarlı olmalı-
dır. Genellikle, girinti için dört boşluk veya sekme (tab) kullanılmaktadır.
Python programlama dilinde; Numbers (Sayılar), String (Karakter Dizisi), List (Liste), Tuple (Demet) ve Dic-
tionary (Sözlük) olmak üzere beş standart veri türü bulunmaktadır.
32
1
Programlama II
Python dili, kullanıcıya birçok yerleşik, dahili metot sunmaktadır. input() ve print() gibi işlevlerden bazıları,
sırasıyla standart girdi ve çıktı işlemleri için yaygın olarak kullanılmaktadır.
Verileri standart çıktı aygıtında yani ekranda görüntülemek için print() işlevini kullanırız. Print işlevinin for-
matlama özellikleri de mevcuttur.
Hazırlanan kodlar içinde esnekliğe izin vermek amacıyla kullanıcıdan veri alma ihtiyacı ortaya çıktığında, in-
put() metodu kullanılmaktadır. input fonksiyonu ile alınan verinin tipi hafızada string olarak tutulmaktadır.
Zaman içerisinde büyüyen kodlar, yönetilmesi kolaylaşması için daha küçük modüllere ayrılması tavsiye edil-
mektedir. Modül, Python tanımlarını ve ifadelerini içeren bir dosyadır. Python modüllerinin bir dosya adı
vardır ve “.py” uzantısı ile bitmektedir. Bir modülün içindeki tanımlar başka bir modüle veya Python’daki etki-
leşimli yorumlayıcıya aktarılabilir. Bunu yapmak için “import” anahtar sözcüğünü kullanılmaktadır.
Operatörler
Python’da operatörler, değişkenler ve değerler arasında aritmetik veya mantıksal hesaplama yapan özel sembol-
lerdir. Operatörün üzerinde çalıştığı değere işlenen denmektedir.
Python programlama dili, Aritmetik operatörler, Karşılaştırma Operatörleri, Mantıksal operatörler, Bitwise (Bit-
sel) Operatörler, Atama Operatörleri ile özel operatör olarak Kimlik ve Üyelik operatörlerini desteklemektedir.
33
1
Python ile Programlamaya Giriş
3 I. benim_sinifim
II. deger_1
III. continue
Yukarıdaki maddelerden hangilerinde doğru bir değişken isimlendirmesi yapılmıştır?
A. Yalnız I B. Yalnız II C. Yalnız III D. I ve II E. II ve III
4 Pyhton programlama dilinde bir kod bloğu …………. ile başlar ve …………. ile biter.
Yukarıdaki cümlede boş bırakılan yere aşağıdaki seçeneklerden hangisi gelmelidir?
A. {, } B. #, tab C. :, boşluk D. [, ] E. girinti, ilk girintisiz satır
5 def double(num):
"""double değer hesaplayan fonksiyon"""
return 2 * num
print(double.__doc__)
6 Aşağıdaki seçeneklerden hangisi Python programlama dilindeki standart veri türlerinden biri değildir?
A. Numbers (Sayılar) B. String (Karakter Dizisi)
C. List (Liste) D. Tuple (Demet)
E. Vector (Vektör)
34
1
Programlama II
Yukarıdaki Python kod parçasının çıktısı aşağıdaki seçeneklerden hangisinde doğru olarak verilmiştir?
neler öğrendik?
A. 1#2#3#4!
B. 1234#!
C. 1#!2#!3#!4#!
D. 1!2!3!4!#
E. #1234!
8 x = 123.456789
print('x değeri %3.4f' %x)
Yukarıdaki Python kod parçasının çıktısı aşağıdaki seçeneklerden hangisinde doğru olarak verilmiştir?
A. 123.45
B. 123.457
C. 123.4568
D. 123.45679
E. 123.456789
10 Python programlama dilinde, ……… operatörleri “in” ve “not in” olarak tanımlanmıştır. Bir dizide
(string, list, tuple, set ve dictionary) bir değerin veya değişkenin bulunup bulunmadığını test etmek için
kullanılırlar.
Yukarıdaki tanımda boş bırakılan yere aşağıdaki operatör türlerinden hangisi gelmelidir?
A. Kimlik operatörü
B. Üyelik operatörü
C. Karşılaştırma operatörü
D. Kontrol operatörü
E. Bitwise (Bitsel) operatör
35
1
Python ile Programlamaya Giriş
1. C Yanıtınız yanlış ise “Python Özellikleri” ko- 6. E Yanıtınız yanlış ise “Temel Kavramlar” ko-
nusunu yeniden gözden geçiriniz. nusunu yeniden gözden geçiriniz.
neler öğrendik yanıt anahtarı
4. E Yanıtınız yanlış ise “Temel Kavramlar” ko- 9. D Yanıtınız yanlış ise “Operatörler” konusunu
nusunu yeniden gözden geçiriniz. yeniden gözden geçiriniz.
5. A Yanıtınız yanlış ise “Temel Kavramlar” ko- 10. B Yanıtınız yanlış ise “Operatörler” konusunu
nusunu yeniden gözden geçiriniz. yeniden gözden geçiriniz.
Araştır Yanıt
1 Anahtarı
Araştır 1
Araştır 2
36
1
Programlama II
Araştır Yanıt
1 Anahtarı
Araştır 3
sabit_degerler.py
ULKE = "Türkiye"
BASKENT = "Ankara"
Araştır 4
Kaynakça
Eliçalışkan, M., Python Değişkenleri, (2022, Şubat 8). [Link]
İşleyen C., Matematiksel İşlemler ve Operatörler, (2022, Şubat 9). [Link]
islemler-ve-operatorler.
Özgül, F., (2022), Python Nasıl Kurulur?, (2022, Ocak 14). [Link]
Python - Variable Types, (2022, Şubat 8). [Link]
Python Değişkenler, (2022, Şubat 9). [Link]
Python Keywords and Identifiers, (2022, Ocak 28). [Link]
keywords-identifier.
Reitz, K., Installing Python 3 on Linux, (2022, Ocak 26). [Link]
linux.
Uzun E., (2022), 01.1. Python’a Giriş, (2022, Ocak 4). [Link]
Uzun, E., 03. Değişken Tipleri, (2022, Şubat 7). [Link]
37
Bölüm 2
Akış Kontrolü
öğrenme çıktıları
Akış Kontrolü
1 Kontrol ifadelerinin çeşitli durumlar için
farklı kullanımlarını kavrayabilme
1 2
2 Farklı döngü ifadelerinin kullanımını
kavrayabilme Ad ve Ad Alanı (Namespace)
3 Döngü içerisinde kullanılan özel ifadelerin 4 Ad ve ad alanı kavramlarının detaylarının
kullanımını kavrayabilme incelenerek kullanım yerlerini kavrayabilme
Anahtar Sözcükler: • Program Akış • Kontrol Deyimleri • Döngüler • for • while • if else • Ad • Ad Alanı
38
2
Programlama II
GİRİŞ
Bir problemin çözümünde kullanılan sıralı ve mantıksal adımların tümüne algoritma adı verilmekte-
dir. Algoritmanın bir programlama dili ile hazırlanmasına gerek yoktur. Bir başlangıç ve bitişinin olması
gerekmektedir. Karşılaşılabilecek tüm ihtimalleri kapsayacak nitelikte olmalı ve mutlaka belirli bir adım
sonunda bitmelidir, bitmeyen bir döngü içinde çalışmamalıdır.
Algoritmaların görselleştirilmesinde akış diyagramları kullanılmaktadır. Algoritma adımları arasındaki
tüm mantıksal ilişkiler gösterilmektedir. Böylece problemin çözümü çeşitli akış kontrol öğeleri vasıtasıyla
herkesin anlayabileceği şekilde oluşturulmaktadır.
Algoritmalarda kullanılan akış kontrol elemanları, her programlama dilinde birbirine benzer şekildedir.
Aralarında sadece sözdizimi/syntax olarak küçük farklar olabilmektedir. Akış diyagramlarındaki ilişkilere
göre, dile özgü kontrol elemanları ile program kodları hazırlanır. Bu bölümde, Python programlama diline
özgü kontrol elemanları ve ad alanı kavramları örnekler üzerinden incelenecektir.
AKIŞ KONTROLÜ
Bir problemin çözülmesinde izlenecek mantıklı ve ardışık şekilde gelen işlem dizisine Algoritma de-
nilmektedir. Algoritmanın da tüm dünya tarafından kabul edilmiş çeşitli semboller ile gösterilemesine de
Akış Diyagramı adı verilmektedir. Akış diyagramları hazırlanırken kullanılması gereken kontrol elemanları
vardır. Karşılaştırma operatörleri, döngüler gibi elemanların akış diyagramları ve kod tarafında kullanım-
larına örnekler verilecektir.
if…else Kontrolü
Yalnızca belirli bir koşul yerine getirildiğinde bir
kodu yürütmek istediğimizde karar verme gereklidir.
“if ” ifadesi bir koşulu kontrol ederek karar vermek
için kullanılır. Eğer koşul doğruysa, bir ifade bloğu dikkat
Programlama dillerinde Syntax adı verilen kavram,
çalıştırılır (if bloğu denir), aksi takdirde başka bir
kitabımızda sözdizimi olarak kullanılmaktadır.
ifade bloğunu işleriz (else bloğu olarak adlandırılır).
Kontrol kodunun diğer kontrol ifadeleri olan “elif ”
ve “else” ise isteğe bağlı olarak akışa uygun şekilde
kullanılabilir.
if İfadesi Sözdizimi:
if test ifadesi:
ifade(ler) Test Yanlış
İfadesi
“if ” kontrolünde, program test ifadesini değerlendirir ve yalnızca
test ifadesi True (doğru) ise ifadeyi/ifadeleri yürütür. Test ifadesi False
(yanlış) ise, ifade(ler) yürütülmez. Ayrıca Python, sıfır olmayan değerleri Doğru
True olarak yorumlar. None ve 0 değerleri False olarak yorumlanır.
Python’da diğer çoğu dildeki gibi parantez kullanılmadığı için, if ifa-
desinin gövdesi girinti ile belirtilir. Kontrol bloğunun gövdesi bir girinti İfade(ler)
ile başlar ve girintisiz ilk satır bu bloğun sonlandığını gösterir.
39
2
Akış Kontrolü
Kod:
# Sayı pozitif ise uygun bir mesaj yazdırıyoruz
sayı = 3
if sayı > 0 :
print(sayı, "pozitif bir sayıdır.")
print("Bu her zaman yazdırılır.")
sayı = -1
if sayı > 0 :
print(sayı, "pozitif bir sayıdır.")
print("Bu da her zaman yazdırılır.")
Kod Çıktısı:
3 pozitif bir sayıdır.
Bu her zaman yazdırılır.
Bu da her zaman yazdırılır.
Yukarıdaki kod örneğinde, num > 0 test ifadesidir. if kontrolünün gövdesi, yalnızca bu test ifadesi True
(doğru) olarak değerlendirilirse yürütülür. sayı değişkeni değeri 3’e eşit olduğundan, test ifadesi doğrudur
ve if ’in gövdesi içindeki ifadeler yürütülür. print() ifadesi, if bloğunun (girintisiz) dışında kaldığı için test
ifadesinden bağımsız olarak yürütülür.
Diğer if kontrolünde ise, sayı değişkeni -1’e eşitse, test ifadesi yanlıştır ve if gövdesi içindeki ifadeler at-
lanır. Yine aynı şekilde print() ifadesi, if bloğunun (girintisiz) dışında kaldığı için test ifadesinden bağımsız
olarak yürütülür.
40
2
Programlama II
Kod:
# sayının pozitif mi negatif mi olduğunu kontrol ederek
# uygun mesajı verelim
sayı = 7
if sayı >= 0 :
print("Pozitif veya Sıfır")
else:
print("Negatif sayı")
Kod Çıktısı:
Pozitif veya Sıfır
Yukarıdaki örnekte, sayı değişkeninin değeri 7’ye eşit olduğunda, test ifadesi doğrudur ve if bloğundaki
kodlar yürütülür ve else bloğu atlanır. sayı değişkeni değeri -9’a eşitse, test ifadesi yanlıştır ve else’nin göv-
desi yürütülür ve if ’in gövdesi atlanır.
num 0’a eşitse, test ifadesi doğrudur ve if öğesinin gövdesi yürütülür ve else öğesinin gövdesi atlanır.
41
2
Akış Kontrolü
Kod:
''' Sayının pozitif, negatif veya sıfır olup olmadığını kontrol ederek
uygun bir mesaj gösterelim '''
sayı = 2.54
if sayı > 0:
print("Pozitif sayı")
elif sayı == 0:
print("Sıfır")
else:
print("Negatif sayı")
Kod Çıktısı:
Pozitif sayı
Kodu kısaca inceleyecek olursak; sayı değişkeni pozitif olduğunda, Pozitif sayı yazdırılır. Sayı 0’a eşitse
Sıfır yazdırılır ve sayı negatif ise, Negatif sayı yazdırılır.
İç İçe if İfadeleri:
Başka bir if...elif...else ifadesinin içinde bir if...elif...else ifadesine sahip olabiliriz. Bu ifadeler herhangi
bir sayıda birbirinin içine yerleştirilebilir. Girinti, iç içe geçme düzeyini anlamanın tek yoludur. Kafa ka-
rıştırıcı olabilirler, bu nedenle gerekmedikçe kullanılmamalıdır.
Kod:
''' Bu sefer iç içe if ifadesini kullanarak, kullanıcının girdiği sayının pozi-
tif, negatif veya sıfır olup olmadığını kontrol edelim ve uygun bir mesaj gösterelim
'''
42
2
Programlama II
Kod Çıktısı:
Bir sayı giriniz: -127
Negatif sayı
for Döngüsü
Döngüler, içerdikleri kod bloklarının birden fazla sayıda çalışmasını sağlayan yapılardır. Python’daki
for döngüsü, bir dizi (list, tuple, string) veya diğer yinelenebilir/tekrarlanabilir nesneler üzerinde yineleme
yapmak için kullanılır. Bir dizi üzerindeki her tekrara geçiş (iterasyon)
denir.
Listedeki tüm
nesneler için
for Döngüsü Sözdizimi:
for değer in liste:
Son
döngü gövdesi elemana Evet
ulaşıldı
Sözdizimini inceleyecek olursak; mı?
dikkat
Dizideki son öğeye ulaşana kadar döngü devam eder. for döngüsünün gövdesi, girinti kullanılarak kodun geri
kalanından ayrılır.
43
2
Akış Kontrolü
Kod:
# Listedeki tüm sayıların toplamını bulan Python kodu
# sayı listesi
sayılar = [11, 26, 20, 34, 42, 77, 55, 3, 4, 91]
print("Toplam",toplam)
Kod Çıktısı:
363
range() Fonksiyonu
range() fonksiyonu bir sayı dizisi oluşturmak için kullanılmaktadır. range(10), 0’dan 9’a (10 sayı) kadar
sayı oluşturmak için kullanılmaktadır. Bu fonksiyona parametre olarak verilen değer dahil edilmez, bu
değer durma noktası olarak kabul edilir.
Başlangıç, bitiş ve adım değerleri de range (başlangıç, bitiş, adım) olarak tanımlanmaktadır. Adım değeri
verilmezse varsayılan olarak 1 alınmaktadır.
Range fonksiyonu ile bir nesne oluşturduğumuzda “içerdiği” her sayıyı üretmez. Yani bu fonksiyon,
verimsiz olacağı için tüm değerleri bellekte saklamaz. Böylece başlangıç, bitiş, adım boyutunu hatırlar ve
işlem yaparken bir sonraki sayıyı üretir.
Bu fonksiyondaki tüm öğelerin çıktısını almaya zorlamak için list() işlevini kullanabiliriz. Ayrıca range
fonksiyonu, in, len ve __getitem__ işlemlerini de desteklemektedir.
Kod:
print(range(10))
# 0-10 arası sayılar (10 hariç)
print(list(range(10)))
# 3-9 arası sayılar (9 hariç)
print(list(range(3, 9)))
# 3-19 arasındaki sayılar (19 hariç) 2 artarak
print(list(range(3, 19, 2)))
Kod Çıktısı:
range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7, 8]
[3, 5, 7, 9, 11, 13, 15, 17]
44
2
Programlama II
İndis kullanarak bir liste üzerinde işlem yapan kod örneği inceleyelim.
Kod:
tür = [ "Türk Pop", "Türkçe Rock", "Anadolu Rock", "Arabesk" ]
Kod Çıktısı:
Türk Pop müziğini severim
Türkçe Rock müziğini severim
Anadolu Rock müziğini severim
Arabesk müziğini severim
for…else Döngüsü
Bir for döngüsüne, isteğe bağlı olarak bir else bloğu eklenebilir. if karşılaştırma deyiminden farklı
olarak, for döngüsündeki else bloğu, for döngüsünde kullanılan dizideki elemanlar bittiğinde çalıştırılır.
Herhangi bir şekilde for döngüsünde kesinti olmazsa else bloğu çalıştırılır. Bir for döngüsünü durdurmak,
döngüden çıkmak için break anahtar kelimesi kullanılabilir. Bu durumda else bloğu göz ardı edilerek
çalıştırılmaz.
Kod:
isimler = ["Harun", "Rabia", "Kerem", "Abdullah", "Elif"]
for i in isimler:
print(i)
else:
print("Başka eleman kalmadı...")
Kod Çıktısı:
Harun
Rabia
Kerem
Abdullah
Elif
Başka eleman kalmadı...
Kod örneğimizde, for döngüsü, döngü tükenene kadar listenin öğelerini yazdırır. for döngüsü bittiğin-
de, else içindeki kod bloğunu yürütür ve “Başka eleman kalmadı” yazdırır.
for...else döngüsünde, yalnızca break anahtar sözcüğü kullanıldığında else bloğu atlanarak döngü son-
landırılır. Bir örnek ile inceleyelim.
45
2
Akış Kontrolü
Kod:
# öğrencinin aldığı notları gösteren program
öğrenci_adı = 'Semra'
Kod Çıktısı:
75
Kod örneğimizde, öğrenci adını listede bulduğunda karşılık gelen “75” değerini vererek for döngüsün-
den çıktı ve else kod bloğuna girmedi.
while Döngüsü
Python’daki while döngüsü, test ifadesi (koşul) doğru olduğu sürece bir kod bloğu içindeki işlemleri
tekrar etmek için kullanılır. Döngü gövdesini çalıştırmadan önce koşulu test eder. Bu döngü genellikle
önceden kaç kez işlem tekrarı yapılacağı bilinmeyen durumlarda kullanılır.
while kod bloğunda yapılan işlemler, test ifadesinden yanlış değeri Test Yanlış
alınana kadar tekrar eder. Diğer operatörlerde olduğu gibi, while dön- ifadesi
güsünün gövdesi girinti ile belirlenir. Gövde girinti ile başlar ve girinti-
siz ilk satır bitişi gösterir.
Doğru
Döngü gövdesi
dikkat
Python, sıfır olmayan herhangi bir değeri Doğru (True) olarak yorumlar.
None ve 0 değerleri ise Yanlış (False) olarak yorumlanır. Döngüden
çık
46
2
Programlama II
Kod:
# 1 den kullanıcının girdiği n sayısına kadar
# doğal sayıların toplanması işlemi
# toplam = 1+2+3+...+n
while i<= n:
toplam = toplam + i # her bir i değerinin toplam değere eklenmesi
i = i + 1 # sayaç değerini arttırma
Kod Çıktısı:
n değerini girin: 22
Toplam: 253
Örnek kodda, i sayaç değişkeni n’den küçük veya ona eşit olduğu sürece (örneğimizde 22) test ifadesi
Doğru (True) olacaktır. Döngünün gövdesindeki sayaç değişkeninin (i) değeri her bir döngü tekrarında
arttırılmıştır. Unutulmamalıdır ki, döngüdeki sayaç değişkeninin arttırılmaması, sonsuz bir döngüye (hiç
bitmeyen döngü) neden olacaktır.
while…else Döngüsü
for döngüsünde olduğu gibi, while döngüsünde de isteğe bağlı bir else bloğu kullanılabilir. while dön-
güsündeki koşul Yanlış (False) olarak değerlendirilirse, else kısmı yürütülür. Ayrıca while döngüsü bir
break deyimi ile sonlandırılabilir. Bu gibi durumlarda, else kısmı göz ardı edilir. Bu nedenle, bir while
döngüsünün else kısmı, while bloğundaki kodda herhangi bir kesinti olmazsa ve while test koşulu yanlış
(False) ise, yani while döngüsü doğal şekilde tamamlandıysa çalışacaktır. Bir örnek ile inceleyelim.
Kod:
sayac = 0
47
2
Akış Kontrolü
Kod Çıktısı:
while bloğu içinde, sayaç: 0
while bloğu içinde, sayaç: 1
while bloğu içinde, sayaç: 2
while bloğu içinde, sayaç: 3
while bloğu içinde, sayaç: 4
else bloğu içinde
Kod çıktısında da görüldüğü gibi, sayaç değişkeninin değeri 5 olduğu zaman while döngüsünün kont-
rol ifadesi Yanlış (False) değerini alarak döngüyü tamamlamış ve işlem sırası else bloğuna geçmiştir.
break Deyimi
break ifadesi, onu içeren döngüyü sonlandırmak için
kullanılır. Programın çalışma sırası, döngünün gövdesinden Döngüye giriş
hemen sonraki ifadeye geçer. break ifadesi iç içe bir döngü
içinde ise (döngü başka bir döngü içinde ise), break ifadesi
en içteki döngüyü sonlandıracaktır.
Döngü Yanlış
test
break Sözdizimi: ifadesi
break
Doğru
Kod:
for harf in "Python Öğreniyorum":
if harf == "o":
break?
break
print( harf )
Hayır
print("for bloğundan sonra")
Döngüden
çık
Döngü gövdesi
sayac = 1
48
2
Programlama II
Kod Çıktısı:
P
y
t
h
for bloğundan sonra
1
2
3
while bloğundan sonra
Örnek kodda, bir string dizisi ile işlem yapılmaktadır. Döngüden çıkabilmek için sıradaki harfin “o”
olup olmadığı kontrol edilmektedir. Böylece, çıktıda o’ya kadar tüm harflerin yazdırıldığını görmekteyiz.
Bu kontrol sağlandıktan sonra döngü sona ermektedir.
Devamındaki while döngüsünde ise, ilk değeri 1 olarak verilmiş sayaç değişkeni 10 değerinden küçük iken
kod bloğu çalışacaktır. Sayaç değerinin 4’e göre alınan mod değerinin 0’a eşit olduğu durumda döngünün
sonlanması için break deyimi eklenmiştir. Böylece 1’den 3’e kadar değerler yazdırılmış ve döngü sonlanmıştır.
continue Deyimi
Türkçe karşılığı devam anlamına gelen continue deyimi, bir döngü içindeyken kendisinden sonraki
kodları çalıştırmadan, döngünün başına gelerek işleme bir sonraki eleman ile devam edilmesini sağlar. Yani
break deyimindeki gibi döngü sonlandırılmaz, ancak bir sonraki döngü elemanı ile devam eder.
Kod:
Döngü Yanlış
for sayi in range(13):
test
if sayi % 3 == 0: ifadesi
continue
print( sayi ) Doğru
Kod Çıktısı:
1 Evet continue
2 ?
4
5
Hayır
7
Döngüden
8 çık
Döngü gövdesi
10
11 Şekil 2.7 continue İfadesi Akış Diyagramı.
Örnek kodda sayı 3 ile tam bölünebiliyorsa yorumlayıcı continue deyimi ile kodun kalan kısmını es
geçerek, döngünün başına gelmektedir.
49
2
Akış Kontrolü
pass Deyimi
Türkçe karşılığı geçmek, sırasını atlatmak anlamına gelen pass deyimi, kodlamada da anlamına uy-
gun şekilde kullanılmaktadır. Kod içinde kullanıldığında görmezden gel, hiç bir şey yapma gibi bir görev
üstlenir. Python’da bir yorum ve pass deyimi arasındaki farkı, yorumlayıcının bir yorumu tamamen yok
sayarken, pass deyimini yok saymamasıdır diyebiliriz. Pass deyimi genellikle bir işlevi olmaması gereken
fakat sözdizimi olarak bir ifade eklenmesi gereken durumlarda kullanılır.
Kod:
'''pass daha sonra eklenecek işlemler için sadece bir yer tutucudur '''
metin = {'p', 'a', 's', 's'}
for harf in metin:
pass
Kod örneğinde de görüldüğü gibi, pass ifadesini genelde yer tutucu olarak kullanırız. Henüz işlevi
tanımlanmamış bir döngü veya fonksiyonumuz olduğunu ve bunu ileride hazırlamak istediğimizi varsa-
yalım. Döngümüz boş bir kod bloğu ile tanımlandığında yorumlayıcı hata verecektir. Bu nedenle, hiçbir
işlevi olmayan bir kod bloğu oluşturmak için pass ifadesini kullanılır. pass deyimi, aynı şekilde fonksiyon
ve sınıflarda da kullanılabilir.
Kod:
def function( parametre ):
pass
class DenemeSinifi:
pass
switch-case Deyimi
Eğer kod içerisinde bir ifade için yapılması gereken kontrol işlemleri sayıca fazla ise, if..else blokları
yerine, C#, Java ve JavaScript gibi programlama dillerindeki switch deyimi kullanılabilir. Fakat diğer dille-
rin aksine, Python dilinde switch-case ifadesi bulunmamaktadır. Bu durumu aşmak için sözlük eşleşmesi
(dictionary mapping) kullanılmaktadır.
Kod:
def trafik_isigi(argument):
switcher = {
1: "Kırmızı",
2: "Sarı",
3: "Yeşil",
}
50
2
Programlama II
Kod Çıktısı:
Trafik ışığı sırasını giriniz:3
Yeşil
Öğrenme Çıktısı
1 Kontrol ifadelerinin çeşitli durumlar için farklı kullanımlarını kavrayabilme
2 Farklı döngü ifadelerinin kullanımını kavrayabilme
3 Döngü içerisinde kullanılan özel ifadelerin kullanımını kavrayabilme
AD VE AD ALANI (NAMESPACE)
Bu bölümde, ad alanı, adlardan nesnelere yapılan eşleme ve değişkenlerin kapsamları incelenecektir.
Ad/İsim
Python’da her şey bir nesnedir. Ad (tanımlayıcı olarak da adlandırılır) nesnelere verilen bir isimdir. Ad,
temel alınan nesneye erişmenin bir yoludur.
Örneğin, sayi = 10 atamasını yaptığımızda, 10 bellekte depolanan bir nesnedir ve “sayi”, onu ilişkilen-
dirdiğimiz isimdir. Python’un hazır fonksiyonlarından id() aracılığıyla bazı nesnelerin RAM’deki adresini
alabiliriz. Nasıl kullanılacağına bir örnek ile inceleyelim.
Kod:
"""
Not: id fonksiyonunu kendi bilgisayarınızdan çalıştırdığınızda, örnekte verilen-
den farklı hafıza değerleri getirebilir
"""
a = 20
print('id(20) =', id(20))
print('id(a) =', id(a))
51
2
Akış Kontrolü
Kod Çıktısı:
id(20) = 1693969200
id(a) = 1693969200
Kod örneğimizde iki id fonksiyonu da 20 değerine eriştiği için aynı adres değerini elde ettik. Şimdi
biraz daha farklı bir örnek ile id() fonskiyonunu inceleyelim.
Kod:
"""
Not: id fonksiyonunu kendi bilgisayarınızdan çalıştırdığınızda, örnektekinden
farklı hafıza değerleri getirebilir
"""
a = 20
print('id(a) =', id(a))
a = a+10
print('id(a) =', id(a))
b = 20
print('id(b) =', id(b))
print('id(20) =', id(20))
Kod Çıktısı:
id(a) = 1693968912
id(a) = 1693968928
id(30) = 1693968928
id(b) = 1693968912
id(20) = 1693968912
Yukarıda farklı değişken değerlerinin aynı adresi işaret ettiğini görüyoruz. Bu durumu daha anlaşılır
olması için bir grafik üzerinde inceleyelim.
a 20 20 b 20
a 30 a 30
52
2
Programlama II
Başlangıçta bir nesne “20” değeri ile oluşturuldu ve “a” adı onunla ilişkilendirildi. a = a+10 atama işle-
mini yaptığımızda ise, yeni bir nesne “30” değeri ile oluşturuldu ve sonra “a” bu nesneyle ilişkilendirildi.
Yani, “a” adının hafızada gösterdiği adres atama son-
rasında değiştirildi.
id(a) ve id(30)’un aynı değerlere sahip olduğu gö-
rülmektedir. Ayrıca, b = 20 ataması yapıldığında, yeni dikkat
“b” adı önceki nesne “20” ile ilişkilendirilmektedir. Ad, isim diye bahsedilen kavramlar, değişkenler için
Python’un yeni bir yinelenen nesne oluşturma- kullanılan kavramlardır. Değişkenlere kurallar çerçe-
sı gerekmediğinden bu kullanım şekli verimliliği vesinde istenilen isim verilebilir. Bu isimler, hafızada
arttırmaktadır. Ad bağlamanın bu dinamik yapısı tutulan verinin adresini işaret eder.
Python’u güçlü kılar; bir ad herhangi bir nesne tipine
atıfta bulunabilir.
Kod:
a = 5
print( id(a) )
a = [1,2,3]
print( id(a) )
def merhabaYaz():
print("Merhaba!")
a = merhabaYaz
a()
print( id(a) )
Kod Çıktısı:
1526590016
67073208
67057624
Merhaba!
67080104
Yukarıdaki kod içerisinde kullanılan “a” değişkenine yapılan tüm atamalar geçerlidir. Bunun yanında
fonksiyonlar da nesnedir, böylece bir ad ile onlara da atıf yapılabilir.
Ad Alanı (Namespace)
Ad alanı, aynı amaç için oluşturulmuş sınıflar, fonksiyonlar ve özellikleri bir çatı altında toplayan ya-
pıya verilen isimdir. Namespace içerisine birbiri ile alakalı sınıf ve fonksiyonların konulmasına dikkat
edilmesi gerekir. Böylece aynı namespace içinde toplanan fonksiyonlar, ihtiyaç duyulan noktada koda
eklenerek daha kolay yönetilebilir kod yazmada yardımcı olmaktadır.
53
2
Akış Kontrolü
Kod:
def dis_fonk():
b = 20
def ic_fonk():
c = 30
a = 10
54
2
Programlama II
Kodumuzdaki a değişkeni global ad alanında tanımlıdır. Değişken b, dış fonksiyon olarak tanımlı
dis_fonk() öğesinin yerel ad alanındadır ve c değişkeni de, dış fonksiyonun içindeki bir iç fonksiyon olan
ic_fonk() öğesinin içinde tanımlanmış ve iç içe yerel ad alanındadır.
Biraz daha detaylı bakacak olursak; ic_fonk() içindeyken, c bizim için yereldir, b yerel değildir ve a glo-
baldir. Okumanın yanı sıra c’ye yeni değerler atayabiliriz, ancak ic_fonk()’dan b ve a’yı sadece okuyabiliriz,
değer ataması yapamayız.
İç fonksiyonda b’ye bir değer atamaya çalışırsak, dış fonksiyonda tanımlı b’den farklı yeni bir yerel b
değişkeni oluşturulur. Aynı durum, a’ya bir değer atandığında da olacaktır.
Ancak, a global olarak tanımlanırsa, tüm referans ve atamalar global a’yı işaret edecektir. Benzer şekilde,
b değişkenini yeniden bağlamak istiyorsak, yerel olmayan olarak bildirilmelidir. Aşağıdaki örnek ile global
a değişkeninin durumunu inceleyelim.
Kod:
def dis_fonksiyon():
a = 20
def ic_fonksiyon():
a = 30
print('a =', a)
ic_fonksiyon()
print('a =', a)
a = 10
dis_fonksiyon()
print('a =', a)
Kod Çıktısı:
a = 30
a = 20
a = 10
Kodun ekran çıktısından da görüldüğü gibi, 3 farklı “a” değişkeni farklı ad alanlarında tanımlanmış ve bu
şekilde erişilmiştir. Aynı örneği a değişkeni için “global” anahtar kelimesini kullanarak tekrar inceleyelim.
55
2
Akış Kontrolü
Kod:
def dis_fonksiyon():
global a
a = 20
def ic_fonksiyon():
global a
a = 30
print('a =', a)
ic_fonksiyon()
print('a =', a)
a = 10
dis_fonksiyon()
print('a =', a)
Kod Çıktısı:
a = 30
a = 30
a = 30
Bu örneğimizde, tüm referanslar ve atamalar, global anahtar sözcüğünün kullanılması nedeniyle global
a’ya yöneliktir. Yani her seferinde aynı “a” değişkeninin değeri değiştirilmektedir.
Bu kod örneğinde ilk önce a değişkenine 10 değeri ataması yapılmaktadır. Sonrasında dış fonksiyon
çağrılmakta ve global a değişkenimize 20 değeri atanmaktadır. Dış fonksiyonun içinden iç fonksiyon ça-
ğırılarak a değişkenimize bu sefer 30 değeri atanarak a değişkeninin değeri yazdırılmıştır. Dikkat edilirse a
değişkeni en son 30 değerini almış ve bu noktadan sonraki tüm ekrana yazdırılan a değerleri 30 olmaktadır.
Yaşamla İlişkilendir
56
2
Programlama II
lama da en önemli basamak programlama mantığını öğretmektir. Çözülmek istenen soruna yönelik
gerçekleştirilmek istenen işlemler esnasında yazılması gereken kodlar programlamanın diline göre de-
ğişiklik gösterebilir fakat programlamanın algoritma mantığı değişlik göstermemektedir. Bu kapsamda
programlama eğitiminden daha önce programlama mantığına önem verilmelidir. Programlama mantı-
ğının en önemli adımı ise algoritmalardır. Algoritmaların kullanılması programlamanın daha basit bir
şekilde yazılmasıdır. Bu sebeple programlama eğitimi süresinde ilk olarak algoritma yapısının üstünde
durmak gerekli olacaktır. Algoritmalar sadece programlamaların plan aşamasında ve yazılımın tasarım
aşamasında değil insanların kendi hayatlarında kullandıkları tüm sonlu işlemlerin içinde de yer almak-
tadır. Tüm bu işlemlerde algoritmik olarak düşünülmektedir. Bu kapsamda algoritma teriminin etkili
eğitimi üzerine yapılan çalışmalar her geçen gün artış göstermektedir.
Algoritmalar sadece bilgisayarlarla ilgili değildir. Müzik nasıl insan ruhuna değen evrensel bir dil
ise, algoritma da sorunları çözmeye yönelik kullanılan evrensel bir dil olmuştur. Algoritmalar düşünme
adımlarının ortaya konuluş şeklidir. Çünkü algoritmanın yapısı kullanıcı düşüncesini ifade eden bir
bilgisayar geometrisidir.
Algoritmaları benimsemek ve algoritmik düşünmek problem çözümünü kolaylaştırabilmektedir.
Gündelik hayatta karşılaşılan problemleri analiz ederek çözüm adımlarını sade bir şekilde belirlemek
yani problemin çözüm algoritmasını oluşturmak çözüme en kısa yoldan etkili bir şekilde ulaşabilme-
ye olanak sağlamaktadır. Önceden geliştirilmiş çözüm algoritmalarını bilmek ve benimsemek daha
önce karşılaşılmamış problemler ile karşılaşıldığında, çözüm üretmek için uyarlanabilir veya yeni
algoritma oluşturmada fikir verebilir. Bu bağlamda algoritmaları bilmek ve farkında olmak oldukça
önemli görülmektedir.
Kaynak: Aytekin, A., Sönmez Çakır, F., Yücel, Y. B. ve Kulaözü, İ. (2018). Algoritmaların Hayatımız-
daki Yeri ve Önemi. Avrasya Sosyal ve Ekonomi Araştırmaları Dergisi, 5 (7), 143-150. Retrieved from
[Link]
Öğrenme Çıktısı
4 Ad ve ad alanı kavramlarının detaylarının incelenerek kullanım yerlerini kavrayabilme
57
2
Akış Kontrolü
Kontrol ifadelerinin
1 çeşitli durumlar için farklı
kullanımlarını kavrayabilme
öğrenme çıktıları ve bölüm özeti
Akış Kontrolü
Bir problemin çözümünde kullanılan sıralı ve mantıksal adımların tümüne algoritma adı verilmektedir. Algo-
ritmanın da tüm dünya tarafından kabul edilmiş çeşitli semboller ile gösterilemesine de Akış Diyagramı adı
verilmektedir. Akış diyagramları hazırlanırken kullanılması gereken kontrol elemanları vardır.
Yalnızca belirli bir koşul yerine getirildiğinde bir kodu yürütmek istediğimizde karar verme gereklidir. “if ” ifa-
desi bir koşulu kontrol ederek karar vermek için kullanılır. if koşulu, çoklu yapıda kullanılabilir. Çoklu kontrol
yapısında, bir if kontrolünden sonra elif ya da else gelmelidir. if ve else ifadelerinden sonra yapılan girintiler,
kod bloklarını ayırmak için kullanılır.
Döngüler, içerdikleri kod bloklarının birden fazla sayıda çalışmasını sağlayan yapılardır. Python’daki for dön-
güsü, bir dizi (list, tuple, string) veya diğer yinelenebilir/tekrarlanabilir nesneler üzerinde yineleme yapmak için
kullanılır. Bir dizi üzerindeki her tekrara geçiş (iterasyon) denir.
Python programlama dilindeki while döngüsü, test ifadesi (koşul) doğru olduğu sürece bir kod bloğu içindeki
işlemleri tekrar etmek için kullanılır. Döngü gövdesini çalıştırmadan önce koşulu test eder. Bu döngü genellikle
önceden kaç kez işlem tekrarı yapılacağı bilinmeyen durumlarda kullanılır.
Kimi durumlarda döngülerin kırılması ya da bir sonraki elemana geçiş yapılması ihtiyacı duyulmaktadır. break
ifadesi, onu içeren döngüyü sonlandırmak için kullanılır. continue deyimi ise, bir döngü içindeyken kendisin-
den sonraki kodları çalıştırmadan, döngünün başına gelerek işleme bir sonraki eleman ile devam edilmesini
sağlar.
pass deyimi genellikle bir işlevi olmaması gereken fakat sözdizimi olarak bir ifade eklenmesi gereken durumlarda
kullanılır.
Eğer kod içerisinde bir ifade için yapılması gereken kontrol işlemleri sayıca fazla ise, if..else blokları yerine
switch deyimi kullanılabilir.
58
2
Programlama II
Ad ve ad alanı kavramlarının
4 detaylarının incelenerek kullanım
yerlerini kavrayabilme
Python’da her şey bir nesnedir. Ad (tanımlayıcı olarak da adlandırılır) nesnelere verilen bir isimdir. Ad, temel
alınan nesneye erişmenin bir yoludur.
Ad alanı ise, aynı amaç için oluşturulmuş sınıflar, fonksiyonlar ve özellikleri bir çatı altında toplayan yapıya
verilen isimdir. Namespace içerisine birbiri ile alakalı sınıf ve fonksiyonların konulmasına dikkat edilmesi
gerekir. Böylece aynı namespace içinde toplanan fonksiyonlar, ihtiyaç duyulan noktada koda eklenerek daha
kolay yönetilebilir kod yazmada yardımcı olmaktadır. Her modül kendi global ve yalıtılmış ad alanını oluş-
turmaktadır. Böylece farklı modüllerde bulunabilecek aynı isim çakışmasının önüne geçilmektedir.
Değişken kapsamı (scope), program içinde tanımlanmış bir değişkenin erişilebilir olduğu alana verilen isim-
dir. Tanımlanmış çeşitli ad alanları olmasına rağmen, programın her bölümünden hepsine erişilemeyebilir.
Bu durumda kapsam (scope) kavramı devreye girmektedir.
59
2
Akış Kontrolü
for m in meyveler:
print("Python öğreniyorum!")
if m == "portakal":
Yukarıda verilen örnek Python kodunda, a değişke- ....
ni değerinin b değişkeni değerinden büyük olduğu print(m)
durumda ekrana “Python öğreniyorum!” yazdır-
ması için boş bırakılan yerlere sırasıyla aşağıdaki Yukarıda verilen örnek Python kodunda, m değiş-
seçeneklerden hangisi gelmelidir? kenin değeri portakal’a eşit olduğunda ekrana yaz-
dırmadan bir sonraki iterasyona devam etmesi için
A. for, >, : B. if, >, :
boş bırakılan yere sırasıyla aşağıdaki seçeneklerden
C. elif, >, : D. if, <, : hangisi gelmelidir?
E. while, <, :
A. break
B. continue
2 x = 1 C. pass
.... x < 6 .... D. else
print(x) E. next
x += 1
Yukarıda verilen örnek Python kodunda, x değiş- 5 meyveler = ["armut", "elma", "por-
keni değerinin 6 dan küçük olduğu durumda ekra- takal", "şeftali", "karpuz"]
na x değerini yazdırarak x değişkeninin değerini bir altkume = []
arttırması için boş bırakılan yerlere sırasıyla aşağı-
for i in range(1, 3):
daki seçeneklerden hangisi gelmelidir?
[Link]( meyveler[i] )
A. for, : B. if, :
print(altkume)
C. else, : D. elif, :
E. while, : Yukarıda verilen örnek Python kodunun çıktısı
aşağıdaki seçeneklerden hangisinde doğru veril-
3 miştir?
i = 0
while i < 20: A. [‘elma’, ‘portakal’]
i += 1 B. [‘armut’, ‘elma’, ‘portakal’]
if i == 3: C. [‘armut’, ‘elma’, ‘portakal’, ‘şeftali’]
.... D. [‘elma’, ‘portakal’, ‘şeftali’]
elif .... E. [‘armut’, ‘elma’]
print("5 in katları", i)
print(i) 6 for x in range(6): print(x)
Yukarıda verilen örnek Python kodunda, i değiş- Yukarıda verilen örnek Python kodu çıktısı için
kenin değeri 3 olduğunda bir sonraki iterasyona aşağıdaki seçeneklerden hangisi doğrudur?
devam eden, i değişkeninin değeri 5’in katı ol-
duğunda da ekrana yazdırması için boş bırakılan A. Ekrana 1 den 6 ya kadar sayıları yazar
yerlere sırasıyla aşağıdaki seçeneklerden hangisi B. Ekrana 0 dan 5 e kadar sayıları yazar
gelmelidir? C. Kullanıcının girdiği bir x değeri 0 ile 6 arasında
A. break, i / 5 == 0 : ise ekrana yazar
B. break, i % 5 == 0 : D. Ekrana 6 tane x yazar
C. continue, i % 5 == 0 : E. Hatalı bir kod, çalışmaz
D. pass, i == 5
E. continue, i == 5
60
2
Programlama II
neler öğrendik?
ğıdaki seçeneklerden hangisi doğrudur? a = 7
A. Değişken adındaki “-” işareti kaldırılırsa hata def ic_fonk():
düzelir b = 8
B. Değişken adındaki 2 ve “_” işareti kaldırılırsa ic_fonk()
hata düzelir print("a:", a, " b:",b)
C. Değişken adındaki 2 ve “-” işareti kaldırılırsa
hata düzelir
D. Değişken değeri “40” şeklinde atanırsa hata dü- a = 10
zelir dis_fonk()
E. Değişken isminde bir hata bulunmamaktadır
Yukarıdaki Python kodunun çıktısı aşağıdakiler-
den hangisidir?
8 I. Öntanımlı
A. a: 7 b: 20
II. Global B. a: 10 b: 20
III. Yerel C. a: 7 b: 8
Kapsam, program içinde tanımlanmış bir değişke- D. a: 10 b: 8
nin erişilebilir olduğu alan için kullanılan bir kav- E. a: 8 b: 20
ramdır. Bu bilgi ışığında, yukarıdaki seçeneklerden
hangileri Python programlama dilindeki kapsam- 10 def dis_fonk():
lar arasında yer almaktadır?
b = 20
A. Yalnız I
def ic_fonk():
B. Yalnız III
C. I ve II c = 30
D. II ve III
E. I, II ve III a = 10
61
2
Akış Kontrolü
1. B Yanıtınız yanlış ise “Akış Kontrolü” konusu- 6. B Yanıtınız yanlış ise “Akış Kontrolü” konusu-
nu yeniden gözden geçiriniz. nu yeniden gözden geçiriniz.
neler öğrendik yanıt anahtarı
2. E Yanıtınız yanlış ise “Akış Kontrolü” konusu- 7. C Yanıtınız yanlış ise “Ad ve Ad Alanı (Names-
nu yeniden gözden geçiriniz. pace)” konusunu yeniden gözden geçiriniz.
3. C Yanıtınız yanlış ise “Akış Kontrolü” konusu- 8. E Yanıtınız yanlış ise “Ad ve Ad Alanı (Names-
nu yeniden gözden geçiriniz. pace)” konusunu yeniden gözden geçiriniz.
4. B Yanıtınız yanlış ise “Akış Kontrolü” konusu- 9. A Yanıtınız yanlış ise “Ad ve Ad Alanı (Names-
nu yeniden gözden geçiriniz. pace)” konusunu yeniden gözden geçiriniz.
5. A Yanıtınız yanlış ise “Akış Kontrolü” konusu- 10. E Yanıtınız yanlış ise “Ad ve Ad Alanı (Names-
nu yeniden gözden geçiriniz. pace)” konusunu yeniden gözden geçiriniz.
62
2
Programlama II
Araştır Yanıt
2 Anahtarı
while True:
parola = input("Lütfen 5 ile 10 karakter uzunluğu
arasında bir parola belirleyin: ")
if not parola:
print("Parola bölümü boş geçilemez!")
elif len(parola) in range(5, 11):
Araştır 1
#eğer parolanın uzunluğu 5 ile 10 karakter
aralığında ise
print("Yeni parolanız:", parola)
break
else:
print("Yeni parolanız 10 karakterden uzun 5
karakterden kısa olmamalı")
def dis_fonksiyon():
dis_degisken = 1
def ic_fonksiyon():
ic_degisken = 2
Araştır 2 global_degisken = 3
Kaynakça
Maraslı, A., (2021), Python Karar Verme İfadeleri, (2022, Mart 3). [Link]
dokuman/python-karar-verme-ifadeleri.
Özgül, F., (2022), Döngüler (Loops), (2022, Mart 6). [Link]
dongusu.
Python For Döngüsü (Örnekli ve Öğretici), (2022, Mart 8). [Link]
dongusu.
Python if...else Statement, (2022, Mart 3). [Link]
Unal, E., (2021), Python — Notlar, (2022, Mart 9). [Link]
1a0b9854b541.
63
Bölüm 3
Fonksiyonlar
Python Fonksiyonları
öğrenme çıktıları
1 2
2 Fonksiyon parametrelerinin farklı kullanım
şekillerini kavrayabilme Modül Yapısı (Module)
3 Özyinelemeli fonksiyonların hazırlanmasını 4 Modül yapısını ve modüllerin programın
kavrayabilme içerisine dahil edilmesini ifade edebilme
3 4
Paket Yapısı (Package) Paket Yöneticisi (PIP)
5 Paket yapısını ve içe aktarmayı ifade 6 Paket yükleyicisinin çalışmasını ve
edebilme kullanımını ifade edebilme
64
3
Programlama II
GİRİŞ
Program yazarken yapılan işi daha küçük parçalara ayırmak hem kodun okunaklığını hem de bakımını
daha kolay hale getirmektedir. Mantıksal çerçevede bölünen iş parçacıklarına fonksiyon adı verilmektedir.
Buradaki fonksiyon, matematiksel bir kavram değildir fakat işlev olarak benzemektedir.
Programlarda kolaylık olması açısından daha önceden hazırlanmış, yapılan işe uygun şekilde dizayn
edilmiş fonksiyonları barındıran paketler bulunmaktadır. Bu paketlerin kullanımı hem daha hızlı kod
yazmaya hem de hata ihtimallerini azaltmaya yardımcı olacaktır.
Python programlama dili, çok çeşitli paketleri sayesinde her kesimden kullanıcıya hitap etmektedir.
Makine öğrenmesi uygulamalarından veri bilimlerine, web uygulamasından oyun geliştirmeye, biyoloji
araştırmalarından görüntü işlemeye çok çeşitli alanlarda Python uygulamaları ile karşılaşmaktayız.
Bu bölümde fonksiyon oluşturma, çeşitleri, kullanımı gibi konuların yanında, fonksiyonlardan oluştu-
rulan paketlerin hazırlanması incelenecektir. Ayrıca standart kütüphane ve diğer Python kullanıcılarının
oluşturdukları kütüphanelerin kurulumu ve kullanımından bahsedilecektir.
PYTHON FONKSİYONLARI
Fonksiyonlar, belirli bir görevi yerine getiren kod bloklarına verilen isimdir. Fonksiyonlar, programları
daha küçük ve modüler parçalara ayırmaya yardımcı olur. Program büyüdükçe fonksiyonlar, yazılan kodun
daha düzenli ve yönetilebilir hale gelmesinde büyük rol oynamaktadır. Kod tekrarını önleyerek, kodun
yeniden kullanılabilir hale getirilmesini sağlar.
Fonksiyon gibi bir tanımlama yapılmak istendiğinde def anahtar kelimesi kullanılmaktadır.
Fonksiyon Sözdizimi:
def fonksiyon_adı(parametre(ler)):
"""docstring"""
kod bloğu
Kod:
def selamlama( isim ):
"""
Bu fonksiyon, parametre olarak girilen kişiye selam verir
"""
print("Merhaba, " + isim + ". Günaydın!")
65
3
Fonksiyonlar
Kod Çıktısı:
Lütfen isminizi giriniz: Hüsrev Paşa
Merhaba, Hüsrev Paşa. Günaydın!
return İfadesi
Return ifadesi, bir fonksiyondan çıkmak ve fonksiyonun çağrıldığı yere geri dönmek için kullanılır.
return Sözdizimi:
return [ifade listesi]
Bu ifade, değer hesaplayan veya değer döndürülen bir ifade içerebilir. Deyimde ifade yoksa veya bir
fonksiyonun içinde return ifadesi bulunmuyorsa, fonksiyon None nesnesini döndürür.
Kod:
def mutlak_deger(sayı):
"""Bu fonksiyon girilen sayının mutlak değerini döndürür """
if sayı >= 0 :
return sayı
else:
return -sayı
print(mutlak_deger( 11 ))
print(mutlak_deger( -26 ))
Kod Çıktısı:
11
26
def fonksiyon_ismi():
Fonksiyon gövdesi
return
Kod(lar)
fonksiyon_ismi():
Kod(lar)
66
3
Programlama II
Kod:
def deneme_fonk():
x = 26
print("Fonksiyon içindeki x değeri:",x)
x = 34
deneme_fonk()
print("Fonksiyon dışındaki x değeri:",x)
Kod Çıktısı:
Fonksiyon içindeki x değeri: 26
Fonksiyon dışındaki x değeri: 34
Burada x’in değerinin başlangıçta 34 olduğu görülmektedir. deneme_fonk() fonksiyonu, x’in değerini
26 olarak değiştirse de, fonksiyonun dışındaki değeri etkilememektedir. Bunun nedeni, aynı isimlere sahip
olmalarına rağmen, farklı kapsamlarda tanımlı iki farklı değişken olmaları sebebiyledir. Fonksiyonun için-
deki x değişkeni, fonksiyona özel olarak yerel tanımlanmış, dışarıdaki x değişkeni de genel tanımlanmış
bir değişkendir. Ayrıca, fonksiyonun dışındaki değişkenler fonksiyonun içinden erişilebilir. Yani küresel
bir kapsamları vardır.
Bu değerler fonksiyonun içinden okunabilir ancak değiştirilemez. Fonksiyon dışındaki değişkenlerin
değerini değiştirmek için, global anahtar sözcüğü kullanılarak global değişkenler olarak bildirilmeleri ge-
rekmektedir.
Fonksiyon Türleri
Python programlama dilinde fonksiyonlar en basit şekilde ikiye ayrılabilir. Bunlar;
67
3
Fonksiyonlar
Fonksiyon Argümanları/Parametreleri
Python’da, farklı sayılarda argüman alabilen fonksiyonlar tanımlanabilir. Tanımlanan fonksiyonlar, be-
lirtilen argümanlara uygun olarak çağrılmalıdır. Aksi takdirde, fonksiyon çağrısı bir hatayla sonuçlanacaktır.
Kod:
def selamlama( isim, mesaj ):
"""
Bu fonksiyon, parametre olarak girilen isme, yine parametre
olarak verilen mesajı verir
"""
print("Merhaba " + isim + ", " + mesaj)
Kod Çıktısı:
Lütfen isminizi giriniz: Süleyman
Lütfen mesajı giriniz: Sen muhteşemsin!
Merhaba Süleyman, Sen muhteşemsin!
Bu örneğimizde, selamlama() fonksiyonunun iki parametresi vardır. Bu fonksiyonu iki parametre ile
çağırdığımız için sorunsuz çalışıyor ve herhangi bir hata almıyoruz. Farklı sayıda argüman ile çağırırsak,
yorumlayıcı bir hata mesajı gösterecektir. Aşağıda, ilgili hata mesajlarıyla birlikte bir argümanlı ve hiçbir
argüman içermeyen bu fonksiyona yapılan bir çağrı yer almaktadır.
68
3
Programlama II
>>> selamlama( )
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: selamlama() missing 2 required positional arguments: 'isim' and 'mesaj'
Kod:
def selamlama( isim, mesaj = "Sitemizi ziyaret ettiğiniz için teşekkür ederiz" ):
"""
Bu fonksiyon, parametre olarak girilen isme, yine parametre
olarak verilen mesajı verir
"""
print("Merhaba " + isim + ", " + mesaj)
Kod Çıktısı:
Lütfen isminizi giriniz: İbrahim Ethem
Merhaba İbrahim Ethem, Sitemizi ziyaret ettiğiniz için teşekkür ederiz
Merhaba İbrahim Ethem, Herkese benden çay!
Örnek kodumuzda yer alan selamlama fonksiyonu “isim” parametresinin varsayılan bir değeri olmadığı
için, fonksiyon çağrılırken zorunlu olarak verilmesi gerekmektedir. Bunun yanında “mesaj” parametresine
varsayılan değer ataması yapıldığı için, fonksiyon çağrısı yapıldığında bu parametreye isteğe bağlı olarak
değer girilebilir ve girilen bu değer varsayılan değerin yerine yazılır.
Bir fonksiyonda ihtiyaç duyulduğu kadar bağımsız değişken varsayılan bir değere sahip olabilir. Ancak
bir tane varsayılan argüman olduğunda, sağındaki tüm argümanların da varsayılan değerlere sahip olması
gerekmektedir. Bu, varsayılan olmayan argümanların varsayılan argümanları takip edemeyeceği anlamına
gelir. Örneğin, örnekteki fonksiyon başlığı şu şekilde tanımlanmış olsaydı:
69
3
Fonksiyonlar
Kod:
# 2 anahtar kelime argümanlı
selamlama( isim="Fatih", mesaj="Okumak bir yaşam felsefesidir..." )
Örnek kod üzerinde görüldüğü gibi, bir fonksiyon çağrısı sırasında konumsal argümanlar anahtar ke-
lime argümanları ile karışık bir şekilde çağrılabilir. Ancak anahtar kelime argümanlarının konumsal ar-
gümanları takip etmesi gerektiği unutulmamalıdır. Anahtar kelime argümanlarından sonra konumsal bir
argüman çağırmak hatalara neden olacaktır.
70
3
Programlama II
Kod:
def selamlama( *isimler ):
"""
Bu fonksiyon, parametre olarak verilen isimlerdeki tüm kişileri
selamlar
"""
for isim in isimler:
print("Merhaba " + isim )
Kod Çıktısı:
Merhaba Harun
Merhaba Kerem
Merhaba Nurullah
Merhaba Mustafa
Merhaba Orkun
Burada, fonksiyonu birden çok argümanla çağırdık. Bu argümanlar, fonksiyona aktarılmadan önce bir
tupple’a (demet) aktarılır. Fonksiyonun içinde, tüm argümanları alabilmek için bir for döngüsü kullanılır.
Kod:
def faktöriyel(x):
""" Bu özyinelemeli fonksiyon, verilen bir tamsayının
faktöriyel değerini bulmak için hazırlanmıştır """
if x == 1:
return 1
else:
return (x * faktöriyel(x-1))
sayi = 5
print(sayi, "sayısının faktöriyel değeri: ", faktöriyel(sayi ))
71
3
Fonksiyonlar
Kod Çıktısı:
5 sayısının faktöriyel değeri: 120
dikkat
Bir sayının faktöriyeli, 1’den o sayıya kadar olan tüm Özyinelemeli fonksiyonlarda, sonsuz bir döngü-
tam sayıların çarpımıdır. Örnekte verilen 5 değeri için ye girmemesi için mutlaka fonksiyonun kendini
çağırmasını durduracak bir kontrol eklenmelidir.
(5! şeklinde gösterilir) 5! = 1*2*3*4*5 = 120’dir.
Örnekte, faktöriyel() kendini çağıran bir özyinelemeli fonksiyondur. Bu fonksiyonu pozitif bir tamsayı
ile çağırdığımızda, her adımda sayıyı azaltarak özyinelemeli olarak kendini çağıracaktır. Her fonksiyon çağ-
rısında, sayı bire eşit olana kadar, kendinden bir küçük sayının faktöriyeli ile çarpar. Daha iyi anlaşılması
amacıyla, bu özyinelemeli fonksiyon çağrısını adım adım inceleyelim.
faktöriyel(5) # 5 ile 1. çağrı
5 * faktöriyel(4) # 4 ile 2. çağrı
5 * 4 * faktöriyel(3) # 3 ile 3. çağrı
5 * 4 * 3 * faktöriyel(2) # 2 ile 4. çağrı
5 * 4 * 3 * 2 * faktöriyel(1) # 1 ile 5. çağrı
1 # 5. çağrıdan sayı=1 olarak döner, faktöriyel(1)
2 * 1 # 4. çağrıdan dönüş, faktöriyel(2)
3 * 2 # 3. çağrıdan dönüş, faktöriyel(3)
4 * 6 # 2. çağrıdan dönüş, faktöriyel(4)
5 * 24 # 1. çağrıdan dönüş, faktöriyel(5)
Sayı 1’e düştüğünde özyineleme sona ermektedir. Bu duruma temel koşul denir. Her özyinelemeli
fonksiyonun özyinelemeyi durduran bir temel koşulu olmalıdır, aksi takdirde işlev kendini sonsuza kadar
çağıracaktır.
Python yorumlayıcısı, yığın taşmalarına neden olan sonsuz yinelemelerden önüne geçmek amacıyla, yi-
nelemenin derinliklerini sınırlar. Varsayılan olarak, maksimum özyineleme derinliği 1000’dir. Sınır aşılırsa,
RecursionError ile sonuçlanır. Sonsuz döngü durumunu bir örnek ile inceleyelim.
Kod:
def özyinelemeliFonksiyon():
özyinelemeliFonksiyon()
özyinelemeliFonksiyon()
Kod Çıktısı:
File "ü[Link]", line 2, in özyinelemeliFonksiyon
özyinelemeliFonksiyon()
RecursionError: maximum recursion depth exceeded
Özyinelemenin Avantajları:
• Özyinelemeli fonksiyonlar, kodun temiz ve düzenli görünmesini sağlar.
• Karmaşık bir görev, özyineleme kullanılarak daha basit alt problemlere bölünebilir.
• İç içe geçmiş karmaşık döngüler kullanmaktansa, özyinelemeli fonksiyon kullanmak daha kolay bir
çözümdür.
72
3
Programlama II
Özyinelemenin Dezavantajları:
• Kimi zaman özyinelemenin arkasındaki mantığı takip etmek zor olabilir.
• Özyinelemeli fonksiyonlar, çok fazla bellek ve zaman harcadıkları için pahalıdır, verimsizdir.
• Özyinelemeli fonksiyonlarda hata ayıklamak zordur.
Lambda/Anonim Fonksiyonlar
Python dilinde anonim bir fonksiyon, isimsiz tanımlanmış bir fonksiyondur. Python’da normal işlevler
def anahtar sözcüğü kullanılarak tanımlanırken, anonim işlevler lambda anahtar sözcüğü kullanılarak
tanımlanır. Bu nedenle anonim işlevlere lambda işlevleri de denilmektedir.
Lambda fonksiyonları herhangi bir sayıda bağımsız değişkene sahip olabilir, ancak yalnızca bir ifade
olabilir. İfade değerlendirilir ve döndürülür. Lambda fonksiyonları, fonksiyon nesnelerinin gerekli olduğu
her yerde kullanılabilir.
Kod:
# lambda fonksiyon kullanım örneği
kareAl = lambda x : x * x
Kod Çıktısı:
7 sayısının karesi: 49
kareAl = lambda x : x * x
ile
def kareAl():
return x * x
73
3
Fonksiyonlar
Örnek olarak bir listeden yalnızca çift sayıları filtrelemek için filter() fonksiyonunun kullanımını inceleyelim.
Kod:
# Bir listedeki elemanların sadece çift olanları filtreleyen program
sayı_listesi = [1, 5, 4, 6, 8, 11, 3, 12]
print( yeni_liste )
Kod Çıktısı:
[4, 6, 8, 12]
Kod:
# map() fonksiyonu kullanarak bir listedeki her bir öğenin iki katını bulan program
print( yeni_liste )
Kod Çıktısı:
[14, 26, 102, 8, 18, 6, 22, 4, 38]
Global Değişkenler
Python’da, fonksiyonun dışında veya global kapsamda bildirilen bir değişken, global değişken olarak isim-
lendirilir. Bu, global bir değişkene fonksiyonun içinden veya dışından erişilebileceği anlamına gelmektedir.
Python’da global bir değişkenin nasıl oluşturulduğunu bir örnek ile inceleyelim.
Kod:
x = "global"
def degisken_test():
print("x fonksiyon içinde:", x)
degisken_test()
print("x fonksiyon dışında:", x)
74
3
Programlama II
Kod Çıktısı:
x fonksiyon içinde: global
x fonksiyon dışında: global
Örnek kodda, x global bir değişken olarak oluşturuldu ve x global değişkenini yazdırmak için bir de-
gisken_test() fonksiyonu tanımlandı. Son olarak, x’in değerini yazdıracak olan degisken_test() fonksiyonu
çağrıldı. Ve x değişkeninin fonksiyonun dışından ve içinden aynı değerleri verdiğini görülmektedir.
Şimdi de bir fonksiyonun içindeki x değerini değiştirildiği kod örneğini inceleyelim.
Kod:
x = 26
def degisken_test():
x = x * 3
print("x fonksiyon içinde:", x)
degisken_test()
print("x fonksiyon dışında:", x)
Kod Çıktısı:
UnboundLocalError: local variable 'x' referenced before assignment
Kodu çalıştırdığımızda karşımıza bir hata çıkmaktadır. Python, fonksiyon içinde işlem yapılan x’i yerel
bir değişken olarak ele almaktadır. x değişkeni ise, degisken_test() fonksiyonu içinde tanımlı değildir ve
ilk değer ataması yapılmamıştır. Bu sebepten yorumlayıcı hata vermektedir. Bu hatanın önüne geçebilmek
için, x değişkeni için “global” anahtar kelimesi kullanılmalıdır.
Şimdi bir de global değişkenlerin farklı dosyalar içerisinde tanımlanıp kullanımasını inceleyelim.
Python’da, global değişkenleri tutmak ve aynı program içindeki Python modülleri arasında bilgi paylaşmak
için bir [Link] modülü oluşturuyoruz. Python modülleri arasında global değişkenleri nasıl paylaşılabi-
leceği de örnek üzerinde gösterilmiştir.
config.x = 20
config.y = "metin"
print(config.x)
print(config.y)
import guncelleme
print(config.x)
print(config.y)
75
3
Fonksiyonlar
Kod Çıktısı:
1
boş
20
metin
Örnek Python kodunda [Link], [Link] ve [Link] olmak üzere 3 farklı dosya oluşturuldu.
[Link] modülü, x ve y global değişkenlerini saklamaktadır. [Link] dosyasında, [Link] mo-
dülü içe aktarılarak x ve y’nin değerleri değiştiriliyor. Benzer şekilde, [Link] dosyasında hem [Link]
hem de [Link] modülü içe aktarılmaktadır. Son olarak global değişkenlerin değerlerinin değişip
değişmediği ekrana yazdırılarak test edilmiştir.
Başka bir örnek üzerinde de global bir değişkeni iç içe geçmiş fonksiyonlarda nasıl kullanılacağını in-
celeyelim.
Kod:
def dis_fonk():
x = 20
def ic_fonk():
global x
x = 25
dis_fonk()
print("Ana kod bloğunda x:", x)
Kod Çıktısı:
İç fonksiyon çağrısından önce x: 20
İç fonksiyon çağrısından sonra x: 20
Ana kod bloğunda x: 25
Örnek programda, iç içe geçmiş ic_fonk() fonksiyonu içinde global bir değişken tanımlanmıştır. dis_
fonk() fonksiyonu içinde, x’in global anahtar sözcüğün hiçbir etkisi yoktur.
dis_fonk() fonksiyonunu çağırmadan önce ve sonra, x değişkeni yerel değişkenin değerini alır, yani x =
20 olmaktadır. dis_fonk() fonksiyonunun dışında, x değişkeni ic_fonk() fonksiyonunda tanımlanan değeri
alır, yani x = 25 değerini almaktadır. Çünkü ic_fonk() fonksiyonu (yerel kapsam) içinde global değişken
oluşturmak için x için “global” anahtar sözcüğü ile kullanılmıştır.
ic_fonk() fonksiyonu içinde herhangi bir değişiklik yaparsak, değişiklikler yerel kapsamın dışında, yani
dis_fonk() dışında görünür.
76
3
Programlama II
Kod:
def degisken_test():
x = "local değişken"
degisken_test()
print( x )
Kod Çıktısı:
NameError: name 'x' is not defined
Örnek kod çalıştırılınca hata vermektedir, çünkü yerel bir değişken olarak tanımlanmış x’e global kap-
samda erişilmeye çalışılıyor. Halbuki yerel değişkene yalnızca degisken_test() fonksiyonu içinde veya yerel
kapsamda erişilebilir.
Kod:
def test():
x = "local değişken"
print( x )
test()
Kod Çıktısı:
local değişken
Şimdiki kod örneğinde ise global değişkenlerin ve yerel değişkenlerin aynı kodda nasıl kullanılacağını
inceleyeceğiz.
Kod:
x = "global değişken"
def test():
global x
y = "local değişken"
x = x * 2
print( x )
print( y )
test()
Kod Çıktısı:
global değişken global değişken
local değişken
Örnek Python kodunda, test() fonksiyonu içinde x global ve y yerel değişken olarak tanımlandı. Ardın-
dan, x global değişkenini değiştirmek için çarpım operatörü “*” kullanıldı ve hem x hem de y değişkenleri
yazdırıldı.
test() fonksiyonunu çağırdıktan sonra, x’in değeri global olmaktadır. Çünkü x * 2, iki kez “global değiş-
ken” yazdırmak için kullanıldı. Bundan sonra, yerel değişken olarak tanımlanan y değeri yazdırıldı.
77
3
Fonksiyonlar
Kod:
x = 22
def test():
x = 34
print("local x:", x)
test()
print("global x:", x)
Kod Çıktısı:
local x: 34
global x: 22
Örnek Python kodunda, hem global değişken hem de yerel değişken için aynı x adı kullanıldı. Değiş-
ken her iki kapsamda, yani test() içindeki yerel kapsam ve test() dışında global kapsam bildirildiği için aynı
değişken yazdırıldığında farklı bir sonuç elde edilmektedir.
test() içindeki değişken yazdırıldığında, “local x: 34” çıktısını vermektedir. Buna değişkenin yerel kap-
samı denmektedir. Benzer şekilde, x değişkeni test() dışında yazdırıldığında, “global x: 22” vermektedir.
Buna da değişkenin global kapsamı denir.
Kod:
def dis_fonksiyon():
x = "local"
def ic_fonksiyon():
nonlocal x
x = "nonlocal"
print("iç fonksiyon:", x)
ic_fonksiyon()
print("dış fonksiyon:", x)
dis_fonksiyon()
Kod Çıktısı:
iç fonksiyon: nonlocal
dış fonksiyon: nonlocal dikkat
Yerel olmayan (nonlocal) olarak
Örnek kodda iç içe oluşturulmuş bir ic_fonksiyon() fonksiyonu tanımlanmış bir değişkenin değeri
bulunmaktadır. Yerel olmayan bir değişken oluşturmak için nonlo- değiştirildiğinde, değişiklikler ye-
cal anahtar kelimesi kullanılmaktadır. ic_fonksiyon() fonksiyonu, rel (local) değişkende de görünür.
dis_fonksiyon() fonksiyonunun kapsamında tanımlanır.
78
3
Programlama II
Öğrenme Çıktısı
1 Fonksiyon türlerini inceleyerek farklarını kavrayabilme
2 Fonksiyon parametrelerinin farklı kullanım şekillerini kavrayabilme
3 Özyinelemeli fonksiyonların hazırlanmasını kavrayabilme
def cikar( a, b ):
""" Bu fonksiyon verilen iki sayının farkını döndürür """
sonuc = a - b
return sonuc
def carp( a, b ):
""" Bu fonksiyon verilen iki sayının çarpımını döndürür """
sonuc = a * b
return sonuc
def bol( a, b ):
""" Bu fonksiyon verilen iki sayının küsüratlı bölümünü döndürür """
sonuc = a / b
return sonuc
Kod örneğinde matematiksel işlemleri içeren bir modül oluşturuldu. Bu modülü kod içerisinde kulla-
nabilmek için kullanılan “import” anahtar kelimesinden bahsedelim.
79
3
Fonksiyonlar
Örnek kodda tanımlanan fonksiyonların adları doğrudan geçerli simge tablosuna aktarılmaz. Burada
yalnızca modül adı örneğini içe aktarır. Modül adından sonra nokta işareti kullanarak fonksiyona erişilebi-
lir. Örneğin hazırladığımız modül içerisindeki çarpım yapan fonksiyonu şu şekilde çağırabiliriz:
>>> [Link](10,5)
50
Python dilinin çok sayıda standart modülü vardır. Bu dosyalar, Python’ın kurulduğu konumun için-
deki “lib” dizinindedir. Standart modüller de, kullanıcı tanımlı modüllerimizi içe aktardığımız gibi içe
aktarılarak kullanılabilir. Modülleri içe aktarmanın çeşitli yolları vardır. Bunları sırasıyla inceleyelim.
Kod:
# import (içe aktarma) ifadesi örneği
# standart math (matematik) modülü içe aktarma
import math
print("Pi sabiti değeri:", [Link])
Kod Çıktısı:
Pi sabiti değeri: 3.141592653589793
Kod:
# yeniden isimlendirme ile modülün içe aktarımı
import math as m
80
3
Programlama II
Kod:
# math modülünden sadece karekök almaya yarayan sqrt fonksiyonunu alalım
Kod Çıktısı:
256 sayısının karekökü: 16.0
Burada, matematik modülünden yalnızca sqrt özelliğini içe aktarıldı. Böyle durumlarda nokta operatö-
rü kullanılmaz. Ayrıca birden çok özellik şu şekilde içe aktarılabilir:
Örnek kodda e ve pi sabitlerine direk erişerek yazdırabildiğimiz gibi, sqrt fonksiyonunu da yeniden
adlandırarak karekok şeklinde kullanabiliriz.
Kod:
# standart math modülündeki tüm tanımlamaları içe aktarır
Örnek programda, matematik modülündeki tüm tanımlar içe aktarıldı. Bu, alt çizgi (özel tanımlar) ile
başlayanlar haricinde, math modülü kapsamında görünen tüm tanımları içermektedir.
Yıldız (*) sembolü ile her şeyi içe aktarmak iyi bir programlama uygulaması olarak görülmez. Yinelenen
tanımlara yol açabileceği gibi, kodun okunabilirliğini de engeller.
81
3
Fonksiyonlar
Kod:
>>> import test_modul
Bu kod parçası çalıştırıldı
>>> import test_modul
>>> import test_modul
>>> import test_modul
Hazırladığımız kodun yalnızca bir kez çalıştırıldığını görmekteyiz. Bu, modülümüzün yalnızca bir kez
içe aktarıldığını göstermektedir.
Hazırlanan modül, program sırasında değiştiyse, modülün tekrar yüklenmesi gerekecektir. Bunu yap-
manın bir yolu yorumlayıcıyı yeniden başlatmaktır. Ancak bu yöntem çok kullanışlı değildir. Python bunu
yapmanın daha verimli bir yolunu sunmaktadır. Bir modülü yeniden yüklemek için imp modülünün
içindeki reload() işlevi kullanılabilir.
Kod:
>>> import test_modul
Bu kod parçası çalıştırıldı
>>> import test_modul
>>> import imp
>>> [Link](test_modul)
Bu kod parçası çalıştırıldı
<module 'test_modul' from '.\\test_modul.py'>
Öğrenme Çıktısı
4 Modül yapısını ve modüllerin programın içerisine dahil edilmesini ifade edebilme
82
3
Programlama II
Paket
Oyun
import [Link]
[Link].zorluk_seviyesi(3)
83
3
Fonksiyonlar
Bu şekilde bir fonksiyona ulaşmak için uzun bir kod yazmak gerekecektir. Bunun yerine modülü paket
öneki olmadan aşağıdaki gibi içe aktarabiliriz:
Bir paket içindeki bir modülden yalnızca gerekli fonksiyonu, sınıfı veya değişkeni içe aktarmanın farklı
bir yolu da şu şekilde gösterilebilir:
Daha kolay olmasına rağmen, bu yöntem önerilmez. Tam ad alanını kullanmak, karışıklığı önler ve
aynı iki tanımlayıcı adının çakışmasını önleyecektir.
Python, paketleri içe aktarırken, modül arama yoluna benzer şekilde [Link] içinde tanımlanan dizin-
ler listesini kontrol eder.
Öğrenme Çıktısı
5 Paket yapısını ve içe aktarmayı ifade edebilme
ensurepip
Python, bir Python ortamına pip yükleyebilen bir “ensurepip” modülü ile birlikte gelmektedir.
84
3
Programlama II
Linux ortamında
MacOS ortamında
Windows ortamında
[Link]
Bu Python betiği, pip yüklemek için bir takım önyükleme mantığı kullanmaktadır. “[Link]” komut
dosyasının [Link] adresinden indirilmesi gerekmektedir. Bir terminal/ko-
mut istemi yardımıyla, [Link] dosyasını içeren klasöre cd komutu ile girdikten sonra, kullanılan işletim
sistemine uygun komutlar çalıştırılarak kurulum yapılır.
Linux ortamında
$ python [Link]
MacOS ortamında
$ python [Link]
Windows ortamında
C:\> py [Link]
Pip kurulumu için işletim sistemine uygun komutlar çalıştırıldıktan sonra, Python paket yükleyicisi
sisteminize doğru bir şekilde yüklenmiş olacaktır.
pip --version
yada
pip --help
Kurulumun başarılı olarak yüklendiğini kontrol etmek için bu komutlar çalıştırılabilir. Eğer ekranda
“pip: command not found” uyarısı alıyorsanız, paket yükleyicisi yüklenmemiştir ve tekrar yüklemeyi de-
nemelisiniz.
Modüller ve fonksiyonlarda olduğu gibi paketlerin de türleri vardır. Paketler, kaynaklarına göre iki
gruba ayrılmaktadır.
• Standart Paketler
• Üçüncü Şahıs Paketleri
İsimlerinden paketlerin içerikleri anlaşılsa da, paket türlerine kısaca değinelim.
85
3
Fonksiyonlar
Standart Paketler
Bu paketler, Python kurulumu sırasında gelen, standart kütüphanesinde bulunan paketlere verilen
isimdir. Bu paketlere erişebilmek için ilave olarak herhangi bir kurulum yapmaya gerek yoktur. Bilgisa-
yarda Python kurulum klasörü altında bulunan lib klasöründen erişilebilir. Bir paketin tam olarak nerede
olduğu, ilgili paketin __path__ özelliği sorgulanarak öğrenilebilir.
Kod:
>>> import urllib
>>> urllib.__path__
Kod Çıktısı:
['C:\\Users\\default\\AppData\\Local\\Programs\\Thonny\\lib\\urllib']
Sorgulanan nesne bir paket değilse, __path__ özelliği de olmayacaktır. Bu özellik ile sorgu yapıldığında
hata verecektir.
Kod:
>>> import subprocess
>>> subprocess.__path__
Kod Çıktısı:
Traceback (most recent call last):
File "<pyshell>", line 2, in <module>
AttributeError: module 'subprocess' has no attribute '__path__'
dikkat
Python programlama dili çalıştırılması için yorumlayıcıya ihtiyaç duymaktadır ve yüksek seviyeli bir dil-
dir. Bu işlemler için de bir işletim sistemi gerekmektedir. İşletim sistemleri genellikle C, C++ gibi düşük
seviyeli diller ile makine dili kullanılarak yazılmaktadır.
C:\\Users\\default\\AppData\\Local\\Programs\\Thonny\\lib\\urllib
[Link]
[Link]
[Link]
[Link]
[Link]
__init__.py
86
3
Programlama II
Örnek olarak, PyPI sitesinde bulunan sphinx paketini inceleyebiliriz Bu paket, restructuredText biçimli
metin dosyalarından kullanışlı belgeler oluşturulmasını sağlamaktadır. Kurulumu için şu komutu kulla-
nabiliriz:
Bu komut ile, sphinx paketinin tüm dosyaları PyPI sitesinden bilgisayarımıza indirilecektir. Otomatik
kurulum yerine, paketin siteden indirilerek de kurulum yapılabilmektedir. Bilgisayarımıza django pake-
tinin kurulumunu yapmak istediğimizde, [Link] adresinden paketin son
sürümü indirmekle işe başlayabiliriz. İndirilen [Link] uzantılı sıkıştırılmış dosya açıldığında pek çok klasör
ve dosya çıkacaktır. Django klasörünün içerisine girildiğinde [Link] isimli bir kurulum dosyası görüle-
cektir. Pip komutu yerine bu dosya çalıştırılarak paket kurulumu yapılabilir. Kurulum dosyasını çalıştır-
mak için de şu komut çalıştırılmalıdır:
Burada dikkat edilmesi gereken önemli bir nokta da, hangi Python sürümü ile kurulmuşsa, ilgili paket
sadece o sürüm ile çalışacaktır. Ayrıca paketin kurulumunu yapabilmek için install parametresi de ilave
edilmesi gerekmektedir. Başarılı bir kurulum yapıldığının testi için de şu kodu kullanabiliriz:
Bu komuttan sonra herhangi bir çıktı vermezse, django paketi başarılı bir şekilde kurulmuştur diyebiliriz.
Paket Oluşturma
Python dilinde ihtiyaca uygun paketlerin kullanılmasının yanında, kendi hazırladığınız kodları başka-
larının da kullanımına açabilirsiniz. Paket oluşturmak için, Python kodlarını içeren .py uzantılı dosyaları
bir klasör altında toplanması yeterlidir. Böylece klasör adını taşıyan bir paket elde edilecektir. Muhasebe
isimli bir paket oluşturduğumuzu farzedelim. İlk önce muhasebe adında bir klasör oluşturarak başlamalı-
yız. Sonra bu klasörün içine maas_hesaplama.py, [Link] ve [Link] modül dosyalarını ekleme-
liyiz. Klasör yapısı da şu şekilde olacaktır:
+ muhasebe
|_ maas_hesaplama.py
|_ [Link]
|_ [Link]
87
3
Fonksiyonlar
Paket klasörünü içeri aktardıktan sonra eklediğimiz klasörün gerçekten bir paket olup olmadığını __
path__ ve __package__ niteliklerini kullanarak test edebiliriz. __path__ niteliği sadece paketlerde mev-
cuttur. __package__ niteliği de eğer bir pakette test edilirse paket ismini, bir modülde test edilirse de boş
bir metin döndürecektir.
Yaşamla İlişkilendir
88
3
Programlama II
Öğrenme Çıktısı
6 Paket yükleyicisinin çalışmasını ve kullanımını ifade edebilme
89
3
Fonksiyonlar
Python Fonksiyonları
Fonksiyonlar, belirli bir görevi yerine getiren kod bloklarına verilen isimdir. Fonksiyonlar, programları daha
küçük ve modüler parçalara ayırmaya yardımcı olur. Program büyüdükçe fonksiyonlar, yazılan kodun daha
düzenli ve yönetilebilir hale gelmesinde büyük rol oynamaktadır. Kod tekrarını önleyerek, kodun yeniden kul-
lanılabilir hale getirilmesini sağlar.
Bir fonksiyon tanımladıktan sonra, fonksiyon başka bir fonksiyondan, programdan ve hatta Python komut
isteminden çağrılabilir. Bir fonksiyonu çağırmak için, uygun parametrelerle birlikte fonksiyon adının yazılması
yeterlidir.
Bir değişkenin kapsamı, bir programın değişkenin değer ataması yapılabildiği, yani yorumlayıcı tarafından
tanındığı kısmıdır. Bir değişkenin ömrü, değişkenin tanındığı, bellekte bulunduğu süreye denir. Bir fonksiyon
içindeki değişkenlerin ömrü, fonksiyonun yürütüldüğü süre kadardır.
Python programlama dilinde fonksiyonlar en basit şekilde Kullanıcı tanımlı ve dahili fonksiyonlar olarak ikiye
ayrılırlar.
Python, sabit sayılı, varsayılan argümanlı, anahtar kelimeli ve isteğe bağlı olacak şekilde fonksiyon parametre-
lerini desteklemektedir.
Modül, python koduna sahip bir dosyadır. Kod, değişkenler, işlevler veya tanımlanmış sınıf biçiminde olabilir.
Yani bir kod kütüphanesidir. Uygulamada kullanılacak fonksiyonları içerir. Dosya adı modül adı olarak kullanılır.
Büyük programları küçük yönetilebilir ve düzenlenmiş dosyalara bölmek için modüller kullanılmaktadır. Ayrı-
ca, modüller kodun yeniden kullanılabilirliğini sağlamaktadır. İçeriklerini farklı programlara kopyalamak yerine
en çok kullanılan fonksiyonlar bir modül içerisinde tanımlanabilir. Bu modülleri kullanabilmek için import
anahtar kelimesi ile koda dahil edilirler.
90
3
Programlama II
Bilgisayar ortamında, benzer nesneler daha hızlı erişim ve kategorizasyon için genellikle aynı isimli klasör yapı-
ları içerisinde saklanır. Python programlama dilinde de, bir dizin yapısı altında toplanmış, birbiri ile bağlantılı,
alakalı modüllere paket adı verilmektedir. Dolayısıyla, paket modüllerden oluşan bir yapıdır.
Python dilinde uygulama geliştirenler, kendi hazırladıkları paketleri diğer kullanıcılarının da erişimine açabil-
mektedir. Bu paylaşılan Python paketlerinin yüklenebilmesi amacıyla ortak bir yükleyici oluşturulmuştur. Bu
paket yükleme ortamına “pip” adı verilmektedir.
Standart paketler, Python kurulumu sırasında gelen, standart kütüphanesinde bulunan paketlere verilen isim-
dir. Bu paketlere erişebilmek için ilave olarak herhangi bir kurulum yapmaya gerek yoktur.
Üçüncü şahıs paketleri, Python geliştiricileri dışında hazırlanmış ve kullanıcıların hizmetine sunulmuş araçlardır.
Bu paketler, standart paketler gibi gelmediğinden, kullanabilmek için kurulumlarının yapılması gerekmektedir.
Python dilinde kendi hazırladığınız kodları başkalarının da kullanımına açabilirsiniz. Paket oluşturmak için,
Python kodlarını içeren .py uzantılı dosyaları bir klasör altında toplanması yeterlidir. Böylece klasör adını taşı-
yan bir paket elde edilecektir.
91
3
Fonksiyonlar
1 .... pozitifmi(sayı)....
if sayı >= 0 :
neler öğrendik?
return True
....:
return False
Yukarıda verilen örnek Python kodunda, boş bırakılan yerlere sırasıyla aşağıdaki seçeneklerden hangisi gel-
melidir?
A. def, :, else B. var, :, elif C. def, ;, else D. func, {, } E. var, def, if
3 import egitim_modulu
print( .... )
Yukarıda verilen örnek Python kodunda, egitim_modulu modülünün bütün değişken ve fonksiyonların
isimlerinin ekrana yazdırılması için boş bırakılan yere aşağıdaki seçeneklerden hangisi gelmelidir?
A. dir( egitim_modulu ) B. egitim_modulu.__package__ C. egitim_modulu
D. egitim_modulu.__path__ E. egitim_modulu.__init__
4 …. egitim …. ogrenciler
Yukarıda verilen örnek Python kodunda, egitim modülünden sadece ogrenciler fonksiyonunu almak için
boş bırakılan yerlere sırasıyla aşağıdaki seçeneklerden hangisi gelmelidir?
A. import, as B. from, as C. import, from D. from, import E. import, from
5 import math as m
pi = [Link]
Yukarıda verilen örnek Python kodunda hata veren yer aşağıdaki şıklardan hangisinde doğru verilmiştir?
A. import math as m B. pi = [Link] C. format(pi, “1.7f ”) D. float(pi) E. [Link]
92
3
Programlama II
neler öğrendik?
III. Paket yapısında en az 3 adet dosya bulunmalıdır
Python programlama dilindeki paket yapısı için yukarıdaki maddelerden hangileri doğrudur?
A. Yalnız I
B. Yalnız II
C. I ve II
D. II ve III
E. I ve III
7 I. Bir oturum sırasında bir modül yalnızca bir kez içe aktarılır
II. Program sırasında değişen modülün çalışması için tekrar yüklenmesi gerekir
III. Bir modülü yeniden yüklemek için imp modülünün içindeki reload() işlevi kullanılabilir
Python programlama dilindeki modüllerin içe aktarımı için yukarıdaki maddelerden hangileri doğrudur?
A. Yalnız I
B. Yalnız II
C. I ve II
D. II ve III
E. I,II ve III
9 Python programlama dilinde, bir dizin yapısı altında toplanmış, birbiri ile bağlantılı, alakalı modül-
lerden oluşan bir yapıdır.
Yukarıda tanımı verilen yapı aşağıdakilerden hangisidir?
A. Fonksiyon
B. Modül
C. Paket
D. Sözlük
E. Klasör
93
3
Fonksiyonlar
1. A Yanıtınız yanlış ise “Python Fonksiyonları” 6. C Yanıtınız yanlış ise “Paket Yapısı (Package)”
konusunu yeniden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
neler öğrendik yanıt anahtarı
2. E Yanıtınız yanlış ise “Python Fonksiyonları” 7. E Yanıtınız yanlış ise “Modül Yapısı (Module)”
konusunu yeniden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
3. A Yanıtınız yanlış ise “Python Fonksiyonları” 8. D Yanıtınız yanlış ise “Paket Yöneticisi (PIP)”
konusunu yeniden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
4. D Yanıtınız yanlış ise “Modül Yapısı (Module)” 9. C Yanıtınız yanlış ise “Paket Yapısı (Package)”
konusunu yeniden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
5. B Yanıtınız yanlış ise “Modül Yapısı (Module)” 10. E Yanıtınız yanlış ise “Paket Yöneticisi (PIP)”
konusunu yeniden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
Araştır Yanıt
3 Anahtarı
Araştır 1
Örnek kodda, verilen bir taban sayısının istenilen üs değeri hesaplanmaktadır. Üs değeri sıfıra eşit olana
kadar döngüsel bir şekilde taban değeri çarpılmaktadır.
94
3
Programlama II
Araştır Yanıt
3 Anahtarı
Araştır 2
[Link]
def alan(yaricap):
return 3.14 * float( yaricap ) * float( yaricap )
def cevre(yaricap):
return 2 * 3.14 * float( yaricap )
[Link]
import daire
print([Link](yaricap))
print(d [Link](yaricap))
Ekran Çıktısı
Dairenin yarıçapını giriniz:5
78.5
31.400000000000002
Araştır 3
Kod
import numpy as np
Ekran Çıktısı
[982 824 206 773 346 416 956]
95
3
Fonksiyonlar
Araştır Yanıt
3 Anahtarı
Araştır 4
+ egitim
|_ ders_atama.py
|_ [Link]
|_ [Link]
|_ [Link]
|_ devam_takip.py
Daha sonra egitim klasörünün olduğu klasöre girerek aşağıdaki komutları yazıyoruz.
Kaynakça
Campbell, S., (2022), Import module in Python with Examples, (2022, Mart 22). [Link]
[Link].
Eliçalışkan, M., (2021), Python Modüller, (2022, Mart 22). [Link]
html.
Öksüz, M., (2015), Python Paket Yükleyicisi PIP, (2022, Mart 25). [Link]
yukleyicisi-pip-c401fba200e9.
Özgül, F., (2022), Paketler, (2022, Mart 29). [Link]
Python Function Arguments, (2022, Mart 17). [Link]
argument.
Simple statements, (2022, Mart 21). [Link]
96
Bölüm 4
Veri Tipleri
Sayılar (Numbers)
1 2
1 Python dilinin desteklediği sayı türlerini
öğrenme çıktıları
3 4
Demet (Tuple) 4 Metin dizilerinin birleştirilmesi,
3 Demet (Tuple) veri yapısının özelliklerini ve parçalanması, biçimlendirilmesi gibi sık
kullanım alanlarını ifade edebilme kullanılan metotları ifade edebilme
Küme (Set)
5 6
5 Küme veri türü ile gerçekleştirilebilecek Sözlük (Dictionary)
işlemleri ifade edebilme ve desteklediği 6 Sözlük veri türü ile ilgili özellikleri ve diğer
fonksiyonları kavrayabilme veri türleri ile farklarını ifade edebilme
Anahtar Sözcükler: • Veri Türleri • Sayılar • Matematiksel Fonksiyonlar • Liste • Demet • Metin Dizisi
• Metin Fonksiyonları • Küme • Sözlük
98
4
Programlama II
GİRİŞ
Veri türleri, python programlama dilinde önemli bir kavramdır. Python’da her değerin kendi veri tipi
vardır. Veri öğelerinin sınıflandırılmasına veya veri değerini bir tür veri kategorisine koymaya Veri Tipleri
denir. Bir değer üzerinde ne tür işlemlerin yapılabileceğini anlamaya yardımcı olur.
Python Programlama Dilinde her şey bir nesnedir. Python’daki veri türleri, sınıfları temsil eder. Bu
sınıfların nesnelerine veya örneklerine değişkenler denmektedir.
Python’da yerleşik olarak bulunan birkaç temel sayısal, dize, liste ve demet veri türleri inceleyeceğiz. Bu
ünitenin sonunda, bu tür nesnelerin neye benzediğini ve nasıl temsil edileceğini öğreneceksiniz.
Ayrıca Python’un yerleşik işlevlerine ilişkin bir genel bakış elde edeceksiniz. Bunlar, faydalı şeyler yap-
mak için arayabileceğiniz önceden yazılmış kod parçalarıdır. Yerleşik print() işlevine benzeyen başka me-
totlar da bulunmaktadır.
SAYILAR (NUMBERS)
Sayılar, ilk ünitede temel kavramlar başlığında veri tipleri bölümünde detaylı şekilde bahsedilmişti.
Temel olarak sayı türlerini şu şekilde listeleyebiliriz:
1. Integer: Pozitif ve negatif işaretli tam sayılardır. Float ile ayrıldıkları yer sayının içinde “.” işaretinin
olup olmadığıdır.
2. Long Integer: Uzun tam sayıları ifade etmektedir. Sekizli ve onaltılı olarak da gösterilebilir. Long
veri türü, Integer veri türünün yetersiz kaldığı durumlarda kullanılır.
3. Float: Kayan noktalı yani ondalıklı sayıları ifade etmektedir.
4. Complex: Gerçek (real) ve hayali (imaginary) olmak üzere iki kısımdan oluşan sayı türüdür. x + yj
formatında gösterilmektedir. Gerçek kısmı x, hayali kısmı ise y göstermektedir.
Bir değişkenin veya bir değerin hangi sınıfa ait olduğunu öğrenmek için type() fonksiyonu ve belirli bir
sınıfa ait olup olmadığını kontrol etmek için isinstance() fonksiyonu kullanılabilir.
Kod:
x = 82
y = 7 + 5j
print(y + 3)
print(isinstance(y, complex))
print(type(x))
print(type(86.0))
Kod Çıktısı:
(10+5j)
True
<class 'int'>
<class 'float'>
Tamsayılar herhangi bir uzunlukta olabilirken, bir kayan noktalı sayı yalnızca 15 ondalık basamağa
kadar değer alabilir.
99
4
Veri Tipleri
Gündelik hayattaki sayılarda ondalık (10 tabanında) sayı sistemi kullanılır. Bundan farklı olarak, ge-
nellikle gömülü yazılımlar üzerinde çalışan bilgisayar programcılarının ikili (2 lik taban), onaltılık (16 lık
taban) ve sekizli (8 lik taban) sayı sistemleriyle çalışması gerekir. Python’da, bu sayıların önüne uygun bir
şekilde bir önek konularak bu sayılar temsil edilebilmektedir.
Kod:
#Çıktı: 171
print(0b10101011)
# Çıktı: 21
print(0o25)
Kod Çıktısı:
171
256
21
Tür Dönüştürme
Python dilinde, bir sayı türü diğer bir sayı türüne dönüştürülebilir. Bu işleme aynı zamanda zorlama
da denilmektedir. Toplama, çıkarma gibi işlemlerde, işlenenlerden biri kayan noktalı ise, tam sayıyı örtük
yani otomatik olarak kayan noktalı bir sayıya dönüştürmeye zorlar.
Kod:
>>> 2+7.0
9.0
Örnek dönüşüm kodunda, 2’nin (tamsayı) toplama için 2.0’a (kayan) zorlandığını ve sonucun da bir
kayan noktalı sayı olduğu görülmektedir Ayrıca türler arasında açık bir şekilde dönüştürme yapmak için
int(), float() ve complex() gibi hazır fonksiyonlar da kullanılabilir. Bu fonksiyonlar yardımıyla, karakter
dizeleri de sayıya dönüştürülebilir.
100
4
Programlama II
Kod:
>>> int(12.26)
12
>>> int(-9.82)
-9
>>> float(76)
76.0
>>> complex('5+71j')
(5+71j)
Float veri tipinden tam sayıya dönüştürürken sayı kırpılır, yani ondalık kısımlar kaldırılır.
Kod:
>>> 1.1 + 2.2
3.3000000000000003
>>> (1.1 + 2.2) == 3.3
False
Bilgisayarın yalnızca iki tabanındaki sayıları (0 ve 1) anlaması nedeniyle, kayan noktalı sayıların bilgi-
sayar donanımında ikili tabanda kesirler olarak uygulandığı görülmektedir. Bu nedenle bildiğimiz ondalık
kesirlerin çoğu bilgisayara tam olarak kaydedilemez.
Örnek verecek olursak; 1/3 kesri ondalık sayı olarak gösterilemez. Bu kesrin değeri sonsuz uzunlukta
olan 0.33333333 değeridir ve ancak yaklaşık olarak tahmin edilebilir.
0.1’in ondalık kesrinin de yine sonsuz uzunlukta bir ikili kesir olan 0.000110011001100110011 de-
ğerine karşılık geldiği görülmektedir. Fakat bilgisayar bunun sadece sonlu bir sayısını depolayabilmektedir.
Bu değer yaklaşık 0,1 olacak, ancak asla eşit olmayacaktır. Bu nedenle, bu durum Python’da bir hata değil-
dir, sadece bilgisayar donanım sınırlamasıdır.
Bu sorunu aşmak için Python ile birlikte gelen ondalık modülü yani “decimal” kullanılabilir. Kayan
noktalı sayıların 15 ondalık basamağa kadar hassasiyeti varken, ondalık modülün kullanıcı tarafından
ayarlanabilen hassasiyeti vardır.
Kod:
import decimal
print(0.2)
print([Link](0.2))
Kod Çıktısı:
0.2
0.200000000000000011102230246251565404236316680908203125
Decimal modülü, ondalık hesaplama yapmak istendiğinde kullanılır. Sonunda iki basamak içerdiği
için, 12,5 yerine 12,50 kullanmak daha kesin sonuç alınmasını sağlamaktadır.
101
4
Veri Tipleri
Kod:
from decimal import Decimal as D
print(D('2.1') + D('3.2'))
print(D('2.2') * D('2.50'))
Kod Çıktısı:
5.3
5.500
Python kod örneğinde sondaki sıfırlara dikkat edecek olursak, çarpma işleminde noktadan sonraki
basamak sayısı kadar 0 eklenerek kayıp önlenmiştir.
Kayan nokta (float) işlemleri, ondalık (decimal) işlemlerinden çok daha hızlı gerçekleşmektedir. Bu
yüzden daha verimli olduğu için float işlemler tercih edilmektedir. Fakat kimi durumlarda float yerine
decimal kullanılmaktadır. Bu durumları listeleyecek olursak:
• Tam ondalık gösterim gerektiren finansal uygulamalar yaparken
• Gerekli hassasiyet seviyesi kontrol edilmek istendiğinde
• Önemli ondalık basamak vurgulanmak istendiğinde
Kesirler
Python, fractions (kesirler) modülü aracılığıyla kesirli sayılar içeren işlemleri desteklemektedir. Bu mo-
dül rasyonel sayı aritmetiği desteğine sahiptir. Bir kesrin, her ikisi de tam sayı olan bir payı ve bir paydası
bulunmaktadır.
Fraction (kesir) nesneleri çeşitli şekillerde oluşturulabilir. Onlara bir göz atalım.
Kod:
import fractions as F
print([Link](2.5))
print([Link](5))
print([Link](4,3))
Kod Çıktısı:
5/2
5
4/3
Float yani kayan noktalı veri türünden kesir oluştururken bazı olağandışı sonuçlarla karşılaşılabilir. Bu
sonuçların sebebi de, ikilik tabanda kayan noktalı sayı gösteriminden kaynaklanmaktadır.
Fraction, string ile somutlaştırma yapılmasına da izin vermektedir. Ondalık sayılar kullanılırken tercih
edilen bir seçenek olarak karşımıza çıkmaktadır.
102
4
Programlama II
Kod:
import fractions as F
Kod Çıktısı:
2476979795053773/1125899906842624
11/5
Kesir (Fraction) veri türü, tüm temel işlemleri desteklemektedir. Bir kaç örnek üzerinde inceleyelim.
Kod:
from fractions import Fraction as F
Kod Çıktısı:
5/3
7/3
False
True
Matematik İşlemleri
Python, trigonometri, logaritma, olasılık ve istatistik gibi matematiğin farklı konularında çalışabilmek
amacıyla, math ve random gibi modüller sunmaktadır.
Kod:
import math
103
4
Veri Tipleri
Kod Çıktısı:
Pi: 3.141592653589793
6!: 720
Sin(1) : 0.8414709848078965
Sinh(1): 1.1752011936438014
Cos(Pi): -1.0
e^100: 2.6881171418161356e+43
Log(10000): 4.0
Kod:
import random
dizi = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
Kod Çıktısı:
11
i
['h', 'g', 'f', 'i', 'c', 'b', 'a', 'd', 'e']
0.931785416127745
104
4
Programlama II
Öğrenme Çıktısı
1 Python dilinin desteklediği sayı türlerini ve sayılar üzerinde yapılabilen işlemleri kavrayabilme
LİSTE (LIST)
Listeler, farklı Python nesneleri (sayı, metin vs.) için tanımlanmış, homojen nesnelerin koleksiyonlarını
depolamak için kullanılan değişken dizilerdir. Bu dizilerin sıralanabilir ve değiştirilebilir (mutable) bir
yapısı vardır. Aynı anda birden fazla nesne ile çalışmaya izin veren bir veri türüdür. Liste tanımı yapılırken
nesneler köşeli parantez içerisine yazılır.
Kod:
# Programlama dillerini içeren bir liste
programlama_dilleri = ['Python', 'C#', 'Java', 'C++', 'JavaScript']
Bir liste herhangi bir sayıda öğeye sahip olabilir. Ayrıca bu nesneler farklı türlerde de olabilir (tamsayı,
kayan nokta, dize vb.).
Kod:
# Tamsayı içeren liste
tamsayi_liste = [ 1, 2, 3, 4, 5, 6, 7 ]
105
4
Veri Tipleri
Kod:
liste = ['a', 'n', 'a', 'd', 'o', 'l', 'u']
# ilk eleman
print(liste [0]) # a
# 3. eleman
print(liste [2]) # a
# 5. eleman
print(liste [4]) # o
print(n_list[1][3])
Kod Çıktısı:
a
a
o
e
3
Traceback (most recent call last):
File "[Link]", line 21, in <module>
print(liste[4.0])
TypeError: list indices must be integers or slices, not float
Python, diziler için negatif indekslemeye izin vermektedir. -1 indeksi son öğeye, -2 ikinci son öğeye vb.
işaret etmektedir. Burada dikkat edilmesi gereken nokta, 0 indeksinin pozitif indekslerde kullanılmasıdır.
Eksi birinci indeks, listenin son elemanına denk gelmektedir.
106
4
Programlama II
Kod:
# Python dilinde, liste üzerinde negatif indeks
liste = ['a', 'n', 'a', 'd', 'o', 'l', 'u']
# Son eleman
print(liste[-1])
# Sondan 4. eleman
print( liste[-4] )
Kod Çıktısı:
u
d
Listenin uzunluğu 7
a n a d o l u
İndeks 0 1 2 3 4 5 6
Negatif İndeks -7 -6 -5 -4 -3 -2 -1
Liste Dilimleme/Bölme
Python dilinde, dilimleme operatörü olarak “:” kullanılmaktadır. Bu operatör sayesinde bir listenin
istenilen aralıktaki parçalarına erişilebilir.
Kod:
# Python da liste dilimleme
Kod Çıktısı:
['a', 'd', 'o']
['l', 'u']
['a', 'n', 'a', 'd', 'o', 'l', 'u']
107
4
Veri Tipleri
Listeleri dilimlediğimizde, başlangıç dizini kapsayıcıdır, ancak bitiş dizini özeldir. Örneğin, liste[2: 5],
2, 3 ve 4 indekslerindeki nesneleri içeren bir liste döndürür, fakat 5 indeksindeki nesneyi içermez.
Kod:
# Listedeki hatalı verilerin düzeltilmesi
cift = [1, 3, 5, 7, 9]
print(cift)
cift[-1] = 10
print(cift)
Kod Çıktısı:
[2, 3, 5, 7, 9]
[2, 4, 6, 8, 10]
Listeye yeni bir eleman eklemek için append() yöntemi kullanılabilir. Bunun yanında extend() yöntemi
yardımıyla da birkaç eleman eklenebilir.
Kod:
# Python da listeye tek eleman ve liste ekleme
tek = [1, 3, 5]
[Link](7)
print(tek)
Kod Çıktısı:
[1, 3, 5, 7]
[1, 3, 5, 7, 9, 11, 13]
İki listeyi birleştirmek için “+” operatörü de kullanılabilir. Bu işleme birleştirme de denilmektedir. Ay-
rıca “*” operatörü de, bir listeyi verilen sayı kadar tekrar eder.
108
4
Programlama II
Kod:
# Liste birleştirme ve tekrar etme
liste = [2, 4, 6]
Kod Çıktısı:
[2, 4, 6, 5, 3, 1]
['müdür', 'müdür', 'müdür']
Ayrıca, insert() yöntemini kullanarak istenen bir konuma bir öğe eklenebilir veya boş bir liste aralığına
sıkıştırarak birden fazla öğe eklenebilir.
Kod:
tek = [5, 11]
[Link](0, 3)
print(tek)
tek[2:2] = [7, 9]
print(tek)
Kod Çıktısı:
[3, 5, 11]
[3, 5, 7, 9, 11]
Kod:
# Liste elemanlarını silme
liste = ['i', 'ç', 'e', 'r', 'i', 'k' ]
109
4
Veri Tipleri
Kod Çıktısı:
['i', 'ç', 'r', 'i', 'k']
['i', 'i', 'k']
Traceback (most recent call last):
File "[Link]", line 18, in <module>
print(liste)
NameError: name 'liste' is not defined
İçeriği verilen elemanı listeden kaldırmak için remove() metodunu kullanılabilir. Ayrıca verilen indekse
göre bir elemanı kaldırmak için de pop() metodunu kullanılabilir.
pop() metodu, liste indeksi sağlanmazsa son öğeyi döndürür ve listeden kaldırır. Bu metod, listelerin
yığın (stack - ilk giren, son çıkan veri yapısı) olarak kullanılmasına yardımcı olur. Tüm listenin boşaltılması
gerektiğinde ise clear() metodu kullanılabilir.
Kod:
liste = ['a', 'n', 'a', 'd', 'o', 'l', 'u' ]
[Link]('n')
# Çıktı: 'a'
print([Link](1))
[Link]()
# Çıktı: []
print(liste)
110
4
Programlama II
Kod Çıktısı:
['a', 'a', 'd', 'o', 'l', 'u']
a
['a', 'd', 'o', 'l', 'u']
u
['a', 'd', 'o', 'l']
[]
Son olarak, bir eleman dilimine boş bir liste atayarak listedeki elemanlar da silinebilir.
Kod:
liste = ['a', 'n', 'a', 'd', 'o', 'l', 'u' ]
liste[2:3] = []
print(liste)
liste[2:5] = []
print(liste)
Kod Çıktısı:
['a', 'n', 'd', 'o', 'l', 'u']
['a', 'n', 'u']
111
4
Veri Tipleri
Kod:
liste = [3, 3, 5, 0, 5, 8, 0]
Kod Çıktısı:
[3, 3, 5, 0, 5, 8, 0, 'a']
2
2
Liste Üreteçleri
Liste üreteçleri, Python’da mevcut bir listeden yeni bir liste oluşturmanın zarif ve kısa bir yoludur. Bir
liste üreteci, köşeli parantez içindeki for döngüsü ifadesinin ardından gelen bir ifadeden oluşur. Daha iyi
anlaşılması amacıya, her bir elemanı 2’nin bir kuvveti olan bir liste oluşturan üreteci inceleyelim.
Kod:
ikinin_kuvvetleri = [2 ** x for x in range(10)]
print(ikinin_kuvvetleri)
Kod Çıktısı:
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
Örnekte verilen liste üretecinin oluşturduğu liste, kod ile şu şekilde de üretilebilir.
Kod:
ikinin_kuvvetleri = []
for x in range(10):
ikinin_kuvvetleri.append(2 ** x)
Bir liste üreteci, isteğe bağlı olarak daha fazla for veya if ifadeleri içerebilir. İsteğe bağlı bir if ifadesi
yardımıyla, yeni liste için elemanlar filtrelenebilir.
112
4
Programlama II
Kod:
kuvvet = [2 ** x for x in range(10) if x > 5]
print(kuvvet )
# [64, 128, 256, 512]
tekler = [x for x in range(20) if x % 2 == 1]
print(tekler )
# [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
progDil= [x+y for x in ['Python ','C '] for y in ['Language','Programming']]
print(progDil)
#['Python Language', 'Python Programming', 'C Language', 'C Programming']
Kod Çıktısı:
[64, 128, 256, 512]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
['Python Language', 'Python Programming', 'C Language', 'C Programming']
Kod:
liste = ['a', 'n', 'a', 'd', 'o', 'l', 'u' ]
# Çıktı: True
print('o' in liste)
# Çıktı: False
print('z' in liste)
# Çıktı: True
print('k' not in liste)
Kod Çıktısı:
True
False
True
Kod:
for fruit in ['muz', 'elma', 'karpuz', 'çilek', 'erik']:
print(fruit, 'severim')
Kod Çıktısı:
muz severim
elma severim
karpuz severim
çilek severim
erik severim
113
4
Veri Tipleri
Öğrenme Çıktısı
2 Liste yapısını ve özelliklerini açıklayabilme
DEMET (TUPLE)
Python programlama dilinde demet (tuple) yapısı ile liste birbirlerine benzer yapılardır. Demetler de,
listeler gibi farklı veri türlerini içerisinde barındıran bir veri yapısıdır. İkisi arasındaki fark ise, bir demet
(Tuple) verileri atandıktan sonra elemanlar değiştirilemez, ancak bir listenin elemanları değiştirilebilir.
Demetlerde silme, ekleme, indeks değiştirme gibi işlemlere izin verilmez.
Bir demet oluşturmak için, bütün elemanlar (öğeler) virgülle ayrılmış olarak parantez () içine yerleş-
tirilerek bir tanımlama grubu oluşturulur. Parantezler isteğe bağlı olsa da, kullanılması tavsiye edilir. Bir
demet herhangi bir sayıda elemana sahip olabilir ve bu elemanlar farklı türlerde tanımlanabilir (tamsayı,
kayan nokta, liste, dize, vb.).
Kod:
# Farklı Tuple türleri
# Boş demet-tuple
demet = ()
print(demet)
114
4
Programlama II
Kod Çıktısı:
()
(9, 2, 5)
(8, 17, 'Merhaba Dünya!', 3.4)
([4, 9, 13], 'Hava Sıcaklıkları', (-4, 1, 8, 17))
Parantez kullanmadan da bir demet oluşturulabilir. Bu tanımlama işlemine demet paketleme de denil-
mektedir.
Kod:
demet = "şeker portakalı", 82.12, 9
print(demet)
Kod Çıktısı:
('şeker portakalı', 82.12, 9)
şeker portakalı
82.12
9
dikkat
Paketten çıkarma işlemi yapılırken, atama yapılan eleman sayısı ile demetteki eleman sayısının aynı olması
gerekmektedir. Aksi durumda derleyici hata verecektir.
Tek elemanlı bir demet oluşturmak biraz zordur. Sadece parantez içinde bir eleman olması yeterli değil-
dir. Bu yapının bir demet olduğunu belirtmek için sonunda bir virgül eklenmesine ihtiyaç duyulmaktadır.
Kod:
demet = ("Merhaba!")
print(type(demet)) # <class 'str'>
115
4
Veri Tipleri
Kod Çıktısı:
<class 'str'>
<class 'tuple'>
<class 'tuple'>
İndeksleme
İndeksin 0’dan başladığı demetteki bir öğeye erişmek için indeks (dizin) operatörünü [ ] kullanabiliriz.
6 elemanlı bir demet yapısı, 0’dan 5’e kadar indekslere sahip olacaktır. Tanımlanmış demetin indeks
aralığının (bu örnekte 6, 7, ...) dışında bir indekse erişmeye çalışmak IndexError’a neden olacaktır.
İndeks bir tamsayı olmalıdır, bu nedenle kayan nokta veya diğer türleri kullanılamaz. Böyle bir durum
da TypeError ile sonuçlanacaktır.
Benzer şekilde, kod örneğinde incelendiği gibi, iç içe dizilere iç içe indeks oluşturma kullanılarak eri-
şilebilir.
Kod:
# Demet elemanlarına indeks kullanarak erişim
demet = ('E','s','k','i','ş','e','h','i','r')
print(demet[0]) # 'E'
print(demet[5]) # 'e'
116
4
Programlama II
Kod Çıktısı:
E
e
5
i
Negatif İndeksleme
Python, dizileri için negatif indekslemeye izin verir. Negatif indekslemede -1 indeksi son elemana, -2
indeksi ise sondan ikinci elemana işaret etmektedir.
Kod:
# Demet elemanlarına indeks kullanarak erişim
demet = ('E','s','k','i','ş','e','h','i','r')
print(demet[-2]) # 'i'
print(demet[-7]) # 'k'
Kod Çıktısı:
i
k
Dilimleme
Dilimleme operatörü iki nokta üst üste “:” kullanarak bir tanımlama grubundaki bir dizi öğeye erişe-
biliriz.
Kod:
# Dilimleme ile demet elemanlarına erişim
demet = ('E','s','k','i','ş','e','h','i','r')
117
4
Veri Tipleri
Kod Çıktısı:
('s', 'k', 'i')
('k', 'i', 'ş', 'e', 'h')
('E', 's')
('i', 'r')
('E', 's', 'k', 'i', 'ş', 'e', 'h', 'i', 'r')
Dilimleme, indeksin hangi aralıklar arasında olduğu düşünülerek en iyi şekilde görselleştirilebilir. Bir
aralığa erişmek isteniyorsa, demetten bu bölümü dilimleyecek indeks aralığı bilgisine ihtiyaç duyulacaktır.
Demetin uzunluğu 9
e s k i ş e h i r
İndeks Aralıkları 0 1 2 3 4 5 6 7 8 9
Negatif İndeks -9 -8 -7 -6 -5 -4 -3 -2 -1
Aralıkları
Kod:
# Tuple değerlerini değiştirme
demet = (63, 5, [4, 0], 71)
# Çıktı: ('E','s','k','i','ş','e','h','i','r')
print(demet)
118
4
Programlama II
Kod Çıktısı:
(63, 5, [7, 0], 71)
('E', 's', 'k', 'i', 'ş', 'e', 'h', 'i', 'r')
İki demeti (tuple) birleştirmek için “+” operatörünü kullanabiliriz. Bu işleme birleştirme denmektedir.
Ayrıca “*” operatörü kullanılarak bir demet içindeki elemanlar belirli bir sayıda tekrarlanabilir. Hem “+”
hem de “*” işlemleri yeni bir Tuple ile sonuçlanmaktadır.
Kod:
# Birleştirme (Concatenation)
# Çıktı: (6, 5, 4, 3 ,2 ,1)
print((6, 5, 4) + (3 ,2 ,1))
# Tekrar
# Çıktı: ('Müdür', 'Müdür', 'Müdür')
print(("Müdür",) * 3)
Kod Çıktısı:
(6, 5, 4, 3, 2, 1)
('Müdür', 'Müdür', 'Müdür')
Kod:
# Demet silme
demet = ('E','s','k','i','ş','e','h','i','r')
Kod Çıktısı:
Traceback (most recent call last):
File "[Link]", line 12, in <module>
print(demet)
NameError: name 'demet' is not defined
119
4
Veri Tipleri
Kod:
demet = ('E','s','k','i','ş','e','h','i','r')
print([Link]('i')) # Output: 2
print([Link]('e')) # Output: 5
Kod Çıktısı:
2
5
Demet (Tuple) yapısının sahip olduğu metotlar yanında, demet yapısının desteklediği başka özellikler
de bulunmaktadır.
Kod:
# Demet grup üyelik testi
demet = ('E','s','k','i','ş','e','h','i','r')
# In kontrolü
print('a' in demet)
print('e' in demet)
# Not in kontrolü
print('t' not in demet)
Kod Çıktısı:
False
True
True
Kod:
# Bir demet içinde yineleme yapmak için for döngüsü kullanımı
for isim in ('Zeynep', 'Kamil') :
print("Merhaba", isim)
120
4
Programlama II
Kod Çıktısı:
Merhaba Zeynep
Merhaba Kamil
Öğrenme Çıktısı
3 Demet (Tuple) veri yapısının özelliklerini ve kullanım alanlarını ifade edebilme
121
4
Veri Tipleri
Kod:
# Python'da string tanımlama
# Aşağıdaki tanımlamaların hepsi eşdeğerdir
metin_dizisi = 'Merhaba'
print(metin_dizisi)
metin_dizisi = "Merhaba"
print(metin_dizisi)
metin_dizisi = '''Merhaba'''
print(metin_dizisi)
Kod Çıktısı:
Merhaba
Merhaba
Merhaba
Merhaba, Python dünyasına
hoş geldiniz
122
4
Programlama II
Kod:
#Python'da dize karakterlerine erişim
str = 'Anadolu Üniversitesi'
print('str = ', str)
#ilk karakter
print('str[0] = ', str[0])
#son karakter
print('str[-1] = ', str[-1])
Kod Çıktısı:
str = Anadolu Üniversitesi
str[0] = A
str[-1] = i
str[3:7] = dolu
str[7:-2] = Üniversite
Aralık dışındaki bir dizine erişmeye çalışılır veya indeks olarak tam sayı dışında sayılar kullanılırsa hata
alınacaktır.
Kod:
# dizin aralık içinde olmalıdır
>>> str[29]
...
IndexError: string index out of range
Dilimleme, indeksin şekilde gösterildiği gibi öğeler arasında olduğu düşünülerek en iyi şekilde gör-
selleştirilebilir. Bir aralığa erişmek istiyorsak, diziden bölümü kesecek dizin aralıklarına ihtiyaç olacaktır.
123
4
Veri Tipleri
Dizenin uzunluğu 7
A n a d o l u
İndeks Aralıkları 0 1 2 3 4 5 6 7
Negatif İndeks -7 -6 -5 -4 -3 -2 -1
Aralıkları
Kod:
>>> str = 'Anadolu Üniversitesi'
>>> str[2] = 'A'
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> str = 'Eskişehir'
>>> str
'Eskişehir'
Bir dizeden karakterler silinemez veya kaldırılamaz. Ancak, “del” anahtar sözcüğü kullanılarak dizeyi
tamamen silmek mümkündür.
Kod:
>>> dize = "Açıköğretim"
>>> del dize[4]
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: 'str' object doesn't support item deletion
>>> del dize
>>> dize
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
NameError: name 'dize' is not defined
124
4
Programlama II
Kod:
# Python String İşlemleri
str1 = 'Merhaba '
str2 ='Python!'
# + operatörü kullanılarak
print('str1 + str2 = ', str1 + str2)
# * operatörü kullanılarak
print('str1 * 3 =', str1 * 3)
Kod Çıktısı:
str1 + str2 = Merhaba Python!
Merhaba Python!
Merhaba Python!
str1 * 3 = Merhaba Merhaba Merhaba
Kod:
# dize üzerinde yineleme
sayac = 0
for harf in 'Açıköğretim Fakültesi':
if(harf == 'i'):
sayac += 1
print(sayac,'tane i harfi bulundu')
Kod Çıktısı:
2 tane i harfi bulundu
125
4
Veri Tipleri
Kod:
>>> 'a' in 'Osmangazi'
True
>>> 'un' not in 'Orhun'
False
>>> 'ancak' in 'Sancaktepe'
True
Kod:
metin = 'Programlama'
# enumerate()
list_enumerate = list(enumerate(metin))
print('list(enumerate(metin) = ', list_enumerate)
# karakter sayısı
print('len(metin) = ', len(metin))
Kod Çıktısı:
list(enumerate(metin) = [(0, 'P'), (1, 'r'), (2, 'o'), (3, 'g'), (4, 'r'), (5, 'a'),
(6, 'm'), (7, 'l'), (8, 'a'), (9, 'm'), (10, 'a')]
len(metin) = 11
Ani bastıran kar fırtınasının ortasında kalan Atlas, eşine “Toprak’ın elini sakın bırakma!” diye seslendi.
Bu metnin içinde hem tek tırnak hem de çift tırnak karakteri olduğu için yazdırmak istediğimizde
SyntaxError yani yazım hatası alırız.
126
4
Programlama II
Kod:
print("Ani bastıran kar fırtınasının ortasında kalan Atlas, eşine "Toprak'ın elini
sakın bırakma!" diye seslendi.")
Kod Çıktısı:
Traceback (most recent call last):
File "[Link]", line 1
print("Ani bastıran kar fırtınasının ortasında kalan Atlas, eşine "Toprak'ın
elini sakın bırakma!" diye seslendi.")
^
SyntaxError: invalid syntax
Bu sorunu aşmanın bir yolu, üçlü tırnak kullanmaktır. Alternatif olarak kaçış dizileri de kullanılabi-
lir. Bir kaçış dizisi ters eğik çizgi, ters bölü işareti “\” ile başlar ve Python yorumlayıcısı tarafından farklı
yorumlanır. Bir dizeyi temsil etmek için tek bir alıntı kullanırsak, dize içindeki tüm tek tırnaklardan ka-
çınılmalıdır. Çift tırnak için de benzer bir durum söz konusudur. Yukarıdaki metnin düzgün şekilde nasıl
yazdırılabileceğini inceleyelim.
Kod:
print('''Ani bastıran kar fırtınasının ortasında kalan Atlas, eşine "Toprak'ın
elini sakın bırakma!" diye seslendi.''')
Kod Çıktısı:
Ani bastıran kar fırtınasının ortasında kalan Atlas, eşine "Toprak'ın elini sakın
bırakma!" diye seslendi.
Ani bastıran kar fırtınasının ortasında kalan Atlas, eşine "Toprak'ın elini sakın
bırakma!" diye seslendi.
Ani bastıran kar fırtınasının ortasında kalan Atlas, eşine "Toprak'ın elini sakın
bırakma!" diye seslendi.
127
4
Veri Tipleri
Kod:
print("C:\\Program Files\\Python")
print("Bu metin\nüç satır\nşeklinde ekrana yazılacak")
print("Bu bir \x48\x45\x58 gösterimdir")
Kod Çıktısı:
C:\Program Files\Python
Bu metin
üç satır
şeklinde ekrana yazılacak
Bu bir HEX gösterimdir
Kimi zaman bir dizenin içindeki kaçış dizilerini yok saymak gerekebilir. Bunu yapmak için dizgenin
önüne r veya R harfi eklenmelidir. Bu, ham bir dize/metin olduğu manasına gelir ve içerisinde herhangi
bir kaçış dizisi içeriyorsa bunlar yok sayılır.
Kod:
print("Bu, kaçış dizileri için \nçok farklı \x62\x69\x72 örnek olacak")
print(r"Bu, kaçış dizileri için \nçok farklı \x62\x69\x72 örnek olacak")
Kod Çıktısı:
Bu, kaçış dizileri için
çok farklı bir örnek olacak
Bu, kaçış dizileri için \nçok farklı \x62\x69\x72 örnek olacak
Bu örnekte dikkat edilmesi gereken nokta, başında x karakteri olan sayıların karşılık geldiği ASCII
karakterlerinin 16 tabanındaki karşılıklarıdır.
128
4
Programlama II
Dizeleri Biçimlendirme
Dize nesnesiyle kullanılabilen format() metodu, dizeleri biçimlendirmede çok yönlü ve güçlü bir araç-
tır. Dize biçimlendiricileri, küme parantezleri {} ile yer tutucular veya değiştirme alanlarını belirtmektedir.
Sıranın belirtilmesi için konum argümanları veya anahtar kelime argümanları kullanılabilir.
Kod:
# Python dize format() yöntemi
Kod Çıktısı:
--- Varsayılan Sıra ---
Fahri, Emin ve Musa
format() metodu, isteğe bağlı biçimlendirmeleri desteklemektedir. İki nokta üst üste kullanılarak alan
adından ayrılırlar. Örneğin, verilen boşlukta bir dizeyi sola hizala <, sağa hizala > veya ortala ^ yapılabilir.
Tamsayıları ikili, onaltılık vb. olarak da biçimlendirebiliriz ve kayan değerler yuvarlanabilir veya üs biçi-
minde görüntülenebilir. format() yöntemiyle kullanılabilecek onlarca biçimlendirme mevcuttur.
129
4
Veri Tipleri
Kod:
# tam sayıları biçimlendirme
print("{0} öğesinin ikili gösterimi {0:b} şeklindedir".format(97))
# yuvarlama
print( "Üçte biri: {0:.3f}".format(1/3) )
# dize hizalama
print( "|{:<10}|{:^10}|{:>10}|".format('peynir', 'tereyağı','ekmek') )
Kod Çıktısı:
97 öğesinin ikili gösterimi 1100001 şeklindedir
Üs temsili: 1.040567e+03
Üçte biri: 0.333
|peynir | tereyağı | ekmek|
Kod:
x = 987.654321
print('x değeri %3.2f' %x)
print('x değeri %3.4f' %x)
Kod Çıktısı:
x değeri 987.65
x değeri 987.6543
Kod:
print( "EsKiŞeHiR".lower())
print( "EsKiŞeHiR".upper())
print( "Bu, tüm kelimeleri bir listeye böler".split())
print( ['Bu', 'ifade', 'tüm', 'kelimeleri', 'içine', 'alan', 'metindir.'])
print( ' '.join(['Bu', 'ifade', 'tüm', 'kelimeleri', 'içine', 'alan', 'metindir.']))
print( 'Hayırlı Bayramlar'.find('ram') )
print( 'Hayırlı Bayramlar'.replace('Mutlu','Parlak') )
130
4
Programlama II
Kod Çıktısı:
eskişehir
ESKIŞEHIR
['Bu,', 'tüm', 'kelimeleri', 'bir', 'listeye', 'böler']
['Bu', 'ifade', 'tüm', 'kelimeleri', 'içine', 'alan', 'metindir.']
Bu ifade tüm kelimeleri içine alan metindir.
11
Hayırlı Bayramlar
Öğrenme Çıktısı
4 Metin dizilerinin birleştirilmesi, parçalanması, biçimlendirilmesi gibi sık kullanılan
metotları ifade edebilme
KÜME (SET)
Bu kısımda, Python programlama dilindeki küme kavramını inceleyeceğiz. Kümelerin oluşturulması,
eleman ekleme ve çıkarma işlemleri gibi kümelerle yapılabilecek tüm işlemler açıklanacaktır.
Bir küme, sıralanmamış bir öğeler topluluğudur. Her küme elemanı benzersizdir yani tekrar etmemeli
ve değiştirilemez olmalıdır. Ancak, bir kümenin kendisi değişkendir. Ona eleman eklenebilir veya çıkarı-
labilir. Kümeler aynı zamanda birleşim, kesişim, simetrik fark gibi matematiksel küme işlemlerini gerçek-
leştirmek için de kullanılabilir.
Küme Oluşturma
Tüm elemanlar (öğeler), virgülle ayrılmış küme parantezleri { } içine yerleştirilerek veya yerleşik set()
işlevi kullanılarak bir küme oluşturulabilir. Kümeler, herhangi bir sayıda elemana sahip olabilir ve bu
elemanlar farklı türlerde tanımlanabilir (integer, float, tuple, string vb.). Ancak bir küme, eleman olarak
listeler, kümeler veya sözlükler gibi değiştirilebilir öğelere sahip olamaz.
131
4
Veri Tipleri
Kod:
# Python'da farklı küme türleri
# tam sayılar kümesi
kume = {1, 2, 3}
print(kume)
Kod Çıktısı:
{1, 2, 3}
{'Merhaba', (9, 8, 2), 2.6}
Kod:
# kümenin kopyaları olamaz
# Çıktı: {2, 0, 8, 1, 7}
kume = {2, 0, 0, 8, 1, 7}
print(kume)
Kod Çıktısı:
{0, 1, 2, 7, 8}
{1, 4, 5}
Traceback (most recent call last):
File "[Link]", line 14, in <module>
kume = { [9, 8], 6, 2}
TypeError: unhashable type: 'list'
Python dilinde, boş bir küme oluşturmak biraz farklıdır. Boş küme parantezleri { } Python’da boş bir
sözlük oluşturacaktır. Elemansız bir küme oluşturmak için set() fonksiyonu herhangi bir argüman olma-
dan kullanılmalıdır.
132
4
Programlama II
Kod:
# Boş küme oluştururken küme ve sözlüğün farklarını inceleyelim
Kod Çıktısı:
<class 'dict'>
<class 'set'>
Kümeyi Değiştirme
Kümeler değişkendir fakat sırasız oldukları için indeks kullanmanın bir anlamı yoktur. Dizinleme veya
dilimleme kullanarak bir kümenin elemanına erişilemez veya eleman değiştirilemez. Küme veri türü böyle
bir olayı desteklemez.
add() yöntemini kullanarak tek bir eleman veya update() yöntemi kullanılarak birden çok eleman
eklenebilir. update() yöntemi, değişken olarak demetler, listeler, dizeler veya diğer kümeleri alabilir. Her
durumda, tekrar eden elemanlardan kaçınılmaktadır.
Kod:
# kume'yi başlat
kume = {2, 0, 8}
print(kume)
# kume[0]
# yukarıdaki satırın yorumunu kaldırırsanız hata alacaksınız
# TypeError: 'set' nesnesi indekslemeyi desteklemiyor
# eleman ekle
# Çıktı: {0, 8, 2, 6}
[Link](6)
print(kume)
133
4
Veri Tipleri
Kod Çıktısı:
{0, 8, 2}
{0, 8, 2, 6}
{0, 1, 2, 3, 4, 6, 8}
{0, 1, 2, 3, 4, 5, 6, 7, 8}
Kod:
# discard() ve remove() arasındaki fark
# kume'yi tanımlama
kume = {1, 3, 4, 5, 6}
print(kume)
[Link](2)
134
4
Programlama II
Kod Çıktısı:
{1, 3, 4, 5, 6}
{1, 3, 5, 6}
{1, 3, 5}
{1, 3, 5}
Traceback (most recent call last):
File "[Link]", line 28, in <module>
[Link](2)
KeyError: 2
Benzer şekilde, pop() yöntemi kullanılarak bir öğe kaldırılabilir ve döndürülebilir. Küme sırasız bir veri
türü olduğundan, hangi elemanın atılacağını belirlemenin bir yolu yoktur. Seçim tamamen isteğe bağlı
olarak gerçekleşir. Ayrıca clear() yöntemi kullanılarak bir kümedeki tüm öğeler kaldırılabilir.
Kod:
# kume'yi başlat
# Çıktı: benzersiz öğeler kümesi
kume = set("MerhabaDünya")
print(kume)
# kume'yi temizle
# Çıktı: set()
[Link]()
print(kume)
Kod Çıktısı:
{'n', 'h', 'r', 'e', 'M', 'b', 'a', 'ü', 'D', 'y'}
n
{'r', 'e', 'M', 'b', 'a', 'ü', 'D', 'y'}
set()
Küme Yöntemleri
Bazılarından örneklerde de bahsettiğimiz birçok küme yöntemi vardır. Küme nesneleri ile kullanılabi-
len tüm yöntemlerin listesini şu şekilde bir araya toplayabiliriz:
135
4
Veri Tipleri
Kod:
# kümede in ve not in kullanımı
# kume'ye ilk değer atama
kume = set("Bilgisayar")
Kod Çıktısı:
True
False
136
4
Programlama II
Kod:
for harf in set("bilgisayar"):
print(harf)
Kod Çıktısı:
b
g
y
l
s
i
a
r
137
4
Veri Tipleri
Kod:
# Frozensets
# A ve B'nin oluşturulması ve ilk değer ataması
A = frozenset([9, 7, 5, 3])
B = frozenset([2, 4, 6, 8])
print([Link](B))
print([Link](B))
print(A | B)
# A kümesine eleman ekleyemeyiz, hata verecektir
[Link](1)
Kod Çıktısı:
True
frozenset({9, 3, 5, 7})
frozenset({2, 3, 4, 5, 6, 7, 8, 9})
Traceback (most recent call last):
File "[Link]", line 10, in <module>
[Link](1)
AttributeError: 'frozenset' object has no attribute 'add'
Öğrenme Çıktısı
5 Küme veri türü ile gerçekleştirilebilecek işlemleri ifade edebilme ve desteklediği
fonksiyonları kavrayabilme
138
4
Programlama II
SÖZLÜK (DICTIONARY)
Python programlama dilinde sözlük, sırasız bir eleman koleksiyonudur. Bir sözlüğün her öğesinin bir
anahtar/değer çifti vardır. Sözlükler, anahtar bilindiğinde değerleri almak için optimize edilmiş bir veri
türüdür. Sözlük, içerisinde farklı veri türleri barındırabilen ve değiştirilebilir (mutable) bir veri türüdür.
Sözlük veri türü, günlük hayatta kullanılan sözlük ile benzer bir kullanım şekline sahiptir. Sözlükte
anahtar bir kelimeye karşılık gelen bir tanımlama karşımıza çıkmaktadır. Aynı zamanda sözlük veri türün-
de de anahtar bir kavrama karşılık gelen değere erişilebilmektedir.
Sözlük Oluşturma
Bir sözlük oluşturmak, öğeleri virgülle ayırarak küme parantezleri { } içine yerleştirmek kadar basittir.
Bir elemanın, bir çift olarak ifade edilen, bir anahtarı ve buna karşılık gelen bir değeri vardır (anahtar:
değer). Ayrıca yerleşik dict() fonksiyonu kullanılarak da bir sözlük oluşturulabilir.
Değerler herhangi bir veri türünden ve tekrarlanabilir şekilde tanımlanabilir. Fakat, anahtarlar değiş-
mez tipte (karakter dizesi, sayı veya değişmez öğeler içeren demet) ve benzersiz olmalıdır.
Kod:
# boş sözlük
sozluk = {}
# dict() kullanarak
sozluk = dict({1:'ağaç', 2:'kitap'})
139
4
Veri Tipleri
Kod:
# Elemanları almak için get ve [] kullanımı
sozluk = {'isim': 'Sadri', 'yaş': 17}
# Çıktı: Sadri
print(sozluk['isim'])
# Çıktı: 17
print([Link]('yaş'))
# Anahtar Hatası
print(sozluk['adres'])
Kod Çıktısı:
Sadri
17
None
Traceback (most recent call last):
File "[Link]", line 15, in <module>
print(sozluk['adres'])
KeyError: 'adres'
Kod:
# Sözlük Öğelerini Değiştirme ve Ekleme
sozluk = {'isim': 'Sadri', 'yaş': 17}
# değer güncelleme
sozluk['isim'] = 'İbrahim'
# Eleman ekleme
sozluk['adres'] = 'Konya'
140
4
Programlama II
Kod Çıktısı:
{'isim': 'İbrahim', 'yaş': 17}
{'isim': 'İbrahim', 'yaş': 17, 'adres': 'Konya'}
Kod:
# Sözlükten öğelerin çıkarılması
# sözlük oluştur
kareler = {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36}
# Çıktı: {}
print(kareler)
# Hata verir
print(kareler)
141
4
Veri Tipleri
Kod Çıktısı:
16
{1: 1, 2: 4, 3: 9, 5: 25, 6: 36}
(6, 36)
{1: 1, 2: 4, 3: 9, 5: 25}
{}
Traceback (most recent call last):
File "[Link]", line 30, in <module>
print(kareler)
NameError: name 'kareler' is not defined
items() (anahtar, değer) biçiminde sözlük elemanlarının yeni bir nesnesini döndürür
142
4
Programlama II
Kod:
# Sözlük Yöntemleri
notlar = {}.fromkeys(['Matematik', 'Türkçe', 'Coğrafya'], 0)
Kod Çıktısı:
{'Matematik': 0, 'Türkçe': 0, 'Coğrafya': 0}
('Matematik', 0)
('Türkçe', 0)
('Coğrafya', 0)
['Coğrafya', 'Matematik', 'Türkçe']
Kod:
# Sözlük Oluşturma - Comprehension
kareler = {x: x*x for x in range(5)}
print(kareler)
Kod Çıktısı:
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Kod:
kareler = {}
for x in range(5):
kareler[x] = x*x
print(kareler)
143
4
Veri Tipleri
Kod Çıktısı:
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Bir sözlük oluştururken, isteğe bağlı olarak daha fazla for veya if ifadeleri kullanılabilir. İsteğe bağlı bir
if ifadesi ile, yeni sözlüğü oluşturmak için elemanlar filtrelenebilir. Örnek kodda, 0 ile 20 arasındaki sayı-
lardan tek olanların karelerinden oluşan bir sözlük oluşturulmaktadır.
Kod:
# if koşullu Sözlük Oluşturma
tek_kareler = {x: x*x for x in range(20) if x % 2 == 1}
print(tek_kareler)
Kod Çıktısı:
{1: 1, 3: 9, 5: 25, 7: 49, 9: 81, 11: 121, 13: 169, 15: 225, 17: 289, 19: 361}
Kod:
# Sözlük Anahtarları için Üyelik Testi
kareler = {1: 1, 3: 9, 5: 25, 7: 49, 9: 81}
# Çıktı: Doğru
print(1 in kareler)
# Çıktı: Doğru
print(2 not in kareler )
Kod Çıktısı:
True
True
False
144
4
Programlama II
Kod:
# Sözlükte yineleme
kareler = {1: 1, 3: 9, 5: 25, 7: 49, 9: 81}
for x in kareler:
print(kareler[x])
Kod Çıktısı:
1
9
25
49
81
Kod:
# Sözlük Yerleşik Fonksiyonları
kareler = {0: 0, 1: 1, 3: 9, 5: 25, 7: 49, 9: 81, 10: 100}
# Çıktı: False
print(all(kareler))
# Çıktı: True
print(any(kareler))
# Çıktı: 7
print(len(kareler))
145
4
Veri Tipleri
Kod Çıktısı:
False
True
7
[0, 1, 3, 5, 7, 9, 10]
Yaşamla İlişkilendir
Kaynak: Kılınç, D., (2018, Ekim 1), Python ile Veri Bilimine Dalış, [Link]
ning-turkiye/python-ile-veri-bilimine-dal%C4%B1%C5%9F-3f069260ebda (Erişim Tarihi 2022, 30
Haziran).
Öğrenme Çıktısı
6 Sözlük veri türü ile ilgili özellikleri ve diğer veri türleri ile farklarını ifade edebilme
146
4
Programlama II
Liste (List)
Listeler, farklı Python nesneleri (sayı, metin vs.) için tanımlanmış, homojen nesnelerin koleksiyonlarını depo-
lamak için kullanılan değişken dizilerdir. Bu dizilerin sıralanabilir ve değiştirilebilir (mutable) bir yapısı vardır.
Bir liste herhangi bir sayıda öğeye sahip olabilir. Ayrıca bu nesneler farklı türlerde de olabilir (tamsayı, kayan
nokta, dize vb.). Liste tanımı yapılırken nesneler köşeli parantez içerisine yazılır.
Listedeki bir öğeye erişmek için dizin operatörü [] kullanılabilir. Python’da indeksler 0’dan başlar. Yani, 10
elemanlı bir liste 0’dan 9’e kadar bir indekse (indis) sahip olacaktır.
Python, diziler için negatif indekslemeye izin vermektedir. -1 indeksi son öğeye, -2 ikinci son öğeye vb. işaret
etmektedir. Burada dikkat edilmesi gereken nokta, 0 indeksinin pozitif indekslerde kullanılmasıdır. Eksi bi-
rinci indeks, listenin son elemanına denk gelmektedir.
147
4
Veri Tipleri
Demet (Tuple)
Python programlama dilinde demet (tuple) yapısı ile liste birbirlerine benzer yapılardır. Demetler de, listeler
gibi farklı veri türlerini içerisinde barındıran bir veri yapısıdır. İkisi arasındaki fark ise, bir demet (Tuple) veri-
leri atandıktan sonra elemanlar değiştirilemez, ancak bir listenin elemanları değiştirilebilir. Demetlerde silme,
ekleme, indeks değiştirme gibi işlemlere izin verilmez.
Bir demet oluşturmak için, bütün elemanlar (öğeler) virgülle ayrılmış olarak parantez () içine yerleştirilerek bir
tanımlama grubu oluşturulur. Parantezler isteğe bağlı olsa da, kullanılması tavsiye edilir. Bir demet herhangi bir
sayıda elemana sahip olabilir ve bu elemanlar farklı türlerde tanımlanabilir (tamsayı, kayan nokta, liste, dize, vb.).
İndeksin 0’dan başladığı demetteki bir öğeye erişmek için indeks (dizin) operatörünü [ ] kullanabiliriz.
Bir demet içindeki öğeler değiştirilemez. Bu, bir demetten elemanlarının silenemeyeceği veya kaldırılamaya-
cağı anlamına gelmektedir. Bununla birlikte, bir demeti tamamen silmek, “del” anahtar sözcüğünü kullanarak
gerçekleştirilebilir.
Bir dize (string), bir karakter dizisidir. Bir karakter sadece bir semboldür. Örneğin, Türkçe dilinde 29 karakter
vardır. Bilgisayarlar karakterlerle ilgilenmezler, sayılarla (ikili tabandaki) ilgilenirler. Ekranınızda karakterler
görseniz bile, arka planda bu karakterler 0 ve 1 lerden oluşan kombinasyon olarak saklanır ve işlenir. Bu ka-
rakterlerin bir sayıya dönüştürülmesine kodlama, şifreleme gibi anlamlara gelen “encoding” denir. Bunun tersi
işleme ise kod çözme, çözümleme anlamlarına gelen “decoding” denmektedir. ASCII ve Unicode, kullanılan
popüler kodlamalardan bazılarıdır.
Dizeler, karakterleri tek tırnak veya çift tırnak içine alarak oluşturulabilir. Python’da üçlü tırnak işaretleri de
kullanılabilir, ancak genellikle çok satırlı dizeleri ve belge dizilerini (docstring) temsil etmek amacıyla kullanılır.
Dizi elemanlarına erişebilmek için indeksleme kullanarak erişilebilir. Ayrıca dilimleme kullanılarak da bir dizi
karaktere erişilebilir. İndeks 0’dan başlar ve bir tamsayı olmalıdır. Float veya diğer türleri kullanılamaz, böyle
bir erişim isteği TypeError ile sonuçlanacaktır. İndeks aralığının dışındaki bir karaktere erişmeye çalışmak
istendiğinde IndexError almamıza neden olacaktır.
Python, diziler için negatif indekslemeye izin verir. -1 dizini son elemana, -2 ikinci son elemana şeklinde
erişim için kullanılabilir. Dilimleme operatörü : (iki nokta üst üste) kullanılarak bir dizideki bir dizi elemana
erişilebilir.
148
4
Programlama II
Küme, sıralanmamış bir öğeler topluluğudur. Her küme elemanı benzersizdir yani tekrar etmemeli ve değişti-
rilemez olmalıdır. Ancak, bir kümenin kendisi değişkendir. Ona eleman eklenebilir veya çıkarılabilir. Kümeler
aynı zamanda birleşim, kesişim, simetrik fark gibi matematiksel küme işlemlerini gerçekleştirmek için de
kullanılabilir.
Küme oluşturmak için, tüm elemanlar (öğeler), virgülle ayrılmış küme parantezleri { } içine yerleştirilerek veya
yerleşik set() işlevi kullanılarak bir küme oluşturulabilir. Kümeler, herhangi bir sayıda elemana sahip olabilir
ve bu elemanlar farklı türlerde tanımlanabilir (integer, float, tuple, string vb.). Ancak bir küme, eleman olarak
listeler, kümeler veya sözlükler gibi değiştirilebilir öğelere sahip olamaz.
Kümeler değişkendir fakat sırasız oldukları için indeks kullanmanın bir anlamı yoktur. Dizinleme veya di-
limleme kullanarak bir kümenin elemanına erişilemez veya eleman değiştirilemez. Küme veri türü böyle bir
olayı desteklemez.
add() yöntemini kullanarak tek bir eleman veya update() yöntemi kullanılarak birden çok eleman eklenebilir.
update() yöntemi, değişken olarak demetler, listeler, dizeler veya diğer kümeleri alabilir. Her durumda, tekrar
eden elemanlardan kaçınılmaktadır. Belirli bir eleman, discard() ve remove() yöntemleri kullanılarak bir kü-
meden çıkarılabilir.
Sözlük (Dictionary)
Sözlük, sırasız bir eleman koleksiyonudur. Bir sözlüğün her öğesinin bir anahtar/değer çifti vardır. Sözlükler,
anahtar bilindiğinde değerleri almak için optimize edilmiş bir veri türüdür. Sözlük, içerisinde farklı veri türleri
barındırabilen ve değiştirilebilir (mutable) bir veri türüdür.
Sözlük veri türü, günlük hayatta kullanılan sözlük ile benzer bir kullanım şekline sahiptir. Sözlükte anahtar bir
kelimeye karşılık gelen bir tanımlama karşımıza çıkmaktadır. Aynı zamanda sözlük veri türünde de anahtar bir
kavrama karşılık gelen değere erişilebilmektedir.
Bir sözlük oluşturmak için, öğeler virgülle ayrılarak küme parantezleri { } içine yerleştirilmelidir. Bir elemanın,
bir çift olarak ifade edilen, bir anahtarı ve buna karşılık gelen bir değeri vardır (anahtar: değer). Ayrıca yerleşik
dict() fonksiyonu kullanılarak da bir sözlük oluşturulabilir.
Değerler herhangi bir veri türünden ve tekrarlanabilir şekilde tanımlanabilir. Fakat, anahtarlar değişmez tipte
(karakter dizesi, sayı veya değişmez öğeler içeren demet) ve benzersiz olmalıdır.
Sözlükteki değerlere erişmek için diğer veri türlerinde indeksleme kullanılırken, sözlük veri türünde anahtarlar
kullanır. Anahtarlar, köşeli parantez [ ] içinde veya get() yöntemiyle kullanılabilir.
149
4
Veri Tipleri
1 x = 10
neler öğrendik?
x = float(x)
print(x, " - ", type(x))
Yukarıda verilen örnek Python kodunun ekran çıktısı, aşağıdaki seçeneklerden hangisinde doğru olarak
verilmiştir?
A. 10 - <class ‘int’> B. 10 - <class ‘float’> C. 10.0 - <class ‘float’>
D. 10.0 - <class ‘int’> E. 10.0 - <class ‘double’>
2 pi = 3.14
r = float(input("yarı çap: "))
alan = pi * (r ** 2)
Yukarıda verilen örnek Python kodunda yarıçap olarak “10” değeri girildiğinde alınacak ekran çıktısı aşağı-
daki seçeneklerden hangisinde doğru olarak verilmiştir?
A. alan: 314.0 - tipi: <class ‘float’> B. alan: 314.0 - tipi: <class ‘double’>
C. alan: 314 - tipi: <class ‘int’> D. alan: 314 - tipi: <class ‘float’>
E. alan: 314 - tipi: <class ‘double’>
Yukarıda verilen örnek Python kodunun ekran çıktısı, aşağıdaki seçeneklerden hangisinde doğru olarak
verilmiştir?
A. [‘Python’, ‘öğrenmekten’, ‘keyif ’, ‘alıyorum!’] B. {‘Python’, ‘öğrenmekten’, ‘keyif ’, ‘alıyorum!’}
C. [‘Python’, ‘öğrenmekten’, ‘keyif ’, ‘alıyorum’, ‘!’] D. (‘Python’, ‘öğrenmekten’, ‘keyif ’, ‘alıyorum!’)
E. (‘Python, öğrenmekten, keyif, alıyorum!’)
5 I. Genellikle heterojen (farklı) veri türleri için kullanılır
II. Demet elemanları değiştirilemez ve silinemez
III. Demet yapısı yinelemeyi desteklemez
Python demet (tuple) veri tipi için yukarıda verilen maddelerden hangileri doğrudur?
A. Yalnız I B. Yalnız II C. I ve II D. II ve III E. I, II ve III
150
4
Programlama II
6 Python programlama dilinde metin dizileri (string) ile yapılan aşağıdaki işlemlerden hangisi yanlıştır?
neler öğrendik?
A. mesaj = “Programcılığı seviyorum” + “ ve herkese “ + “tavsiye ediyorum :)”
B. mesaj = “Üniversitede okuyorum ve “ + str(20) + “ yaşındayım”
C. mesaj = ‘Anadolu Üniversitesi’nde okuyorum’
D. mesaj = “””Hepiniz yazılım dünyasına hoş geldiniz!”””
E. mesaj = ‘’’Açıköğretim ile kendimi geliştiriyorum’’’
[Link]("Python")
[Link](3.10)
[Link]("Python")
[Link]("Öğrenmeye devam...")
[Link]("Python")
[Link](2.6)
print(kume)
Yukarıda verilen örnek Python kodunun ekran çıktısı, aşağıdaki seçeneklerden hangisinde doğru olarak
verilmiştir?
A. {(9, 8, 2), 2.6, 3.1, ‘Python’, ‘Merhaba’, ‘Öğrenmeye devam...’}
B. {(9, 8, 2), 3.1, ‘Merhaba’, ‘Öğrenmeye devam...’}
C. {(9, 8, 2), 2.6, 3.1, ‘Python’, ‘Python’, ‘Python’, ‘Merhaba’, ‘Öğrenmeye devam...’}
D. {(9, 8, 2), 3.1, ‘Python’, ‘Python’, ‘Python’, ‘Merhaba’, ‘Öğrenmeye devam...’}
E. {(9, 8, 2), 3.1, ‘Python’, ‘Merhaba’, ‘Öğrenmeye devam...’}
151
4
Veri Tipleri
10 fibo = {1:1, 2:1, 3:2, 4:3, 5:5, 6:8, 7:13, 8:21, 9:34, 10:55}
neler öğrendik?
[Link](7)
fibo["Son"] = 89
[Link](5)
fibo["Kredi"] = 4
[Link]()
print(fibo)
Yukarıda verilen örnek Python kodunun ekran çıktısı, aşağıdaki seçeneklerden hangisinde doğru olarak
verilmiştir?
A. {1: 1, 2: 1, 3: 2, 4: 3, 6: 8, 7:13, 8: 21, 9: 34, 10: 55, ‘Son’: 89}
B. {1: 1, 2: 1, 3: 2, 4: 3, 6: 8, 8: 21, 9: 34, 10: 55, ‘Son’: 89, ‘Kredi’: 4 }
C. {1: 1, 2: 1, 3: 2, 4: 3, 5:5, 6: 8, 8: 21, 9: 34, 10: 55, ‘Son’: 89}
D. {1: 1, 2: 1, 3: 2, 4: 3, 6: 8, 8: 21, 9: 34, 10: 55, ‘Son’: 89}
E. {1: 1, 2: 1, 3: 2, 4: 3, 6: 8, 8: 21, 9: 34, 10: 55, ‘Kredi’: 4}
152
4
Programlama II
1. C Yanıtınız yanlış ise “Sayılar (Numbers)” ko- 6. C Yanıtınız yanlış ise “Metin Dizisi (String)”
nusunu yeniden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
3. E Yanıtınız yanlış ise “Liste (List)” konusunu 8. E Yanıtınız yanlış ise “Küme (Set)” konusunu
yeniden gözden geçiriniz. yeniden gözden geçiriniz.
4. A Yanıtınız yanlış ise “Liste (List)” konusunu 9. B Yanıtınız yanlış ise “Küme (Set)” konusunu
yeniden gözden geçiriniz. yeniden gözden geçiriniz.
5. C Yanıtınız yanlış ise “Demet (Tuple)” konusu- 10. D Yanıtınız yanlış ise “Sözlük (Dictionary)”
nu yeniden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
Araştır Yanıt
4 Anahtarı
Python içinde standart olarak gelen Random modülü, rastgele sayı üretmeyi
Araştır 1 sağlayan bir modüldür. Python 1.4 ve üzerinde kullanılabiliyor ve mersenne
twister algoritmasını baz alarak çalışıyor.
Araştır 2
for o in ogrenciler:
print( "İsim: " + o[0] + " \tNot:" + o[1] )
Kod Çıktısı:
İsim: AYTEKİN SÜRÜM Not:76
İsim: ASLIHAN SÜNER Not:34
İsim: ALİRIZA YURDSEVEN Not:65
İsim: ORHAN UYGAR ÇETEMEN Not:88
İsim: GONCA SUNGURTEKİN Not:93
İsim: TUBA HANIM TURP Not:57
İsim: SARE ATBAŞ Not:87
İsim: ERSAGUN BUDUNOĞLU Not:23
İsim: ALPEREN SONAY Not:75
İsim: AYCAN ÖZDEN ALTINOK Not:81
153
4
Veri Tipleri
Araştır Yanıt
4 Anahtarı
Araştır 3
alfabe = "abcçdefgğhıijklmnoöprsştuüvyz"
demet = tuple(alfabe)
print(demet)
Kod Çıktısı:
('a', 'b', 'c', 'ç', 'd', 'e', 'f', 'g', 'ğ', 'h', 'ı', 'i', 'j', 'k',
'l', 'm', 'n', 'o', 'ö', 'p', 'r', 's', 'ş', 't', 'u', 'ü', 'v', 'y', 'z')
Araştır 4
metin = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a
augue faucibus, condimentum mauris et, blandit odio. Praesent mollis nisl
augue, vitae convallis felis fringilla eu."
metin_liste = [Link](" ")
for m in metin_liste:
print( "|{:<12}|".format( m ) )
Kod Çıktısı:
|Lorem | |mauris |
|ipsum | |et, |
|dolor | |blandit |
|sit | |odio. |
|amet, | |Praesent |
|consectetur | |mollis |
|adipiscing | |nisl |
|elit. | |augue, |
|Donec | |vitae |
|a | |convallis |
|augue | |felis |
|faucibus, | |fringilla |
|condimentum | |eu. |
154
4
Programlama II
Araştır Yanıt
4 Anahtarı
Araştır 5
#birleşimleri
print( "\nİngilizce + Matematik:", [Link]( matematik ) )
print( "İngilizce + Fizik:", [Link]( fizik ) )
print( "Matematik + Fizik:", [Link]( fizik ) )
#kesişimleri
print( "\nİngilizce * Matematik:", [Link]( matematik ) )
print( "İngilizce * Fizik:", [Link]( fizik ) )
print( "Matematik * Fizik:", [Link]( fizik ) )
# farkları
print( "\nİngilizce - Matematik:", [Link]( matematik ) )
print( "İngilizce - Fizik:", [Link]( fizik ) )
print( "Matematik - Fizik:", [Link]( fizik ) )
Kod Çıktısı:
İngilizce + Matematik: {'SEVCAN ÖZZEYBEK', 'DUÇEM BÖLÜK', 'SEVGİ TINAZ',
'KEMAL ATASOY', 'ZEKERİYA SENEMTAŞI', 'RABİA BAYHAN', 'CİHAT SARICANBAZ'}
İngilizce + Fizik: {'SEVCAN ÖZZEYBEK', 'DUÇEM BÖLÜK', 'FEVZİYE KÜPELİ',
'ZELİHA SAMSA', 'SEVGİ TINAZ', 'SAMİ EGEHAN', 'RABİA BAYHAN', 'CİHAT
SARICANBAZ'}
Matematik + Fizik: {'SEVCAN ÖZZEYBEK', 'FEVZİYE KÜPELİ', 'ZELİHA SAMSA',
'SEVGİ TINAZ', 'KEMAL ATASOY', 'ZEKERİYA SENEMTAŞI', 'SAMİ EGEHAN', 'RA-
BİA BAYHAN', 'CİHAT SARICANBAZ'}
155
4
Veri Tipleri
Araştır Yanıt
4 Anahtarı
Araştır 6
print(yedinin_katlari)
Kod Çıktısı:
{7: 7, 14: 14, 21: 21, 28: 28, 35: 35, 42: 42, 49: 49, 56: 56, 63: 63, 70:
70, 77: 77, 84: 84, 91: 91, 98: 98}
Kaynakça
Built-in Types, (2022, Mart 11). [Link] Priya, B., (2021), Dictionary Comprehension in
org/3/library/[Link]. Python – Explained with Examples, (2022,
Mart 13). [Link]
Eliçalışkan, M., (2021), Python Veri Türleri, (2022,
dictionary-comprehension-in-python-explained-
Mart 12). [Link]
with-examples.
[Link].
Python Numbers, Type Conversion and Mathematics,
Güven, A., (2019), Python Veri Yapılarına Bir Bakış,
(2022, Mart 10). [Link]
(2022, Mart 11). [Link]
python-programming/numbers.
guven/python-veri-yap%C4%B1lar%C4%B1na-
bir-bak%C4%B1%C5%9F-b53f1b46aa2f. String İşlemleri, (2022, Mart 13). [Link]
com/site/egitimbilgileri/home/a---python---
Özgül, F., (2022), Sayılar, (2022, Mart 10). https://
twisted---qt/03---string-islemleri.
[Link]/[Link].
156
Bölüm 5
Dosya İşlemleri ve Hata Yakalama
öğrenme çıktıları
Dosya İşlemleri
1
1 Dosya açma, dosyaya yazma ve dosyadan
2
okuma işlemlerini açıklayabilme Dizinler
2 Dosya için kullanılan özel metotların 3 Klasör/dizin oluşturma, silme ve
kullanımını kavrayabilme içeriklerinin listelenmesini ifade edebilme
İstisnalar (Exceptions)
3
4 Kodlama sırasında karşılaşılan hataları
yönetebilme, hata türleri ve kullanıcı tanımlı
istisnaları ifade edebilme
Anahtar Sözcükler: • Dosya • Dizin • İstisna • TRY Except • I/O • Veri Girişi • Hata Yakalama
• OS Modülü • Python İleri Düzey
158
5
Programlama II
GİRİŞ
Dosyalar günlük hayatımızda sıklıkla kullandığımız bir dijital ortam bileşenidir. Gerek iş hayatındaki
işlemlerin yapıldığı excel dosyaları, gerek yazışmaların ve dokümanların takip edildiği word dosyaları ol-
sun, hepsi bilgisayar için 0 ve 1 sayılarından oluşan verilerdir. Bunun yanında dosyaların kullanımı sadece
görüldüğü alanlarla sınırlı değildir. Bir işletim sisteminin çalışması, veritabanındaki verilerin tutulması,
programların gerekli ayarlarının tutulduğu dosyalar gibi kullanıcıya açık olmayan çok fazla işlem dosyalar
ile gerçekleştirilmektedir.
Dijital ortamda kullanılan tüm bu dosyaların bir şekilde depolanması ve üzerlerinde gerekli işlemlerin
yapılması gerekmektedir. Programlama dillerinde, farklı dosya türlerinde işlem yapabilmek için özelleşmiş
kütüphaneler bulunmaktadır.
Bu bölümde dosya açma, kapama, güncelleme gibi işlemler incelenecektir. Bunun yanında, program
yazarken en çok ihtiyaç duyulan konulardan olan hata yakalama işlemleri de örnekler ile açıklanacaktır.
DOSYA İŞLEMLERİ
Bu bölümde, Python ile dosya işlemleri hakkında detaylı incelemeler yapılacaktır. Dosya açma, dosya-
dan okuma, dosyaya yazma, dosya kapatma gibi işlemlerin yanında, dosya ile ilgili bilinmesi gereken çeşitli
yöntemlerden bahsedilecektir.
Dosyalar
Dosyalar, ilgili bilgileri depolamak için disk üzerindeki isimlendirilmiş konumlardır. Verileri kalıcı ola-
rak sabit disk, hafıza kartı gibi kalıcı bir bellekte depolamak için kullanılırlar. Rastgele Erişimli Bellek
(RAM) geçici bir bellek türüdür, yani bilgisayar kapatıldığında veriler silinir. Bu yüzden verileri kalıcı
olarak depolayarak gelecekte kullanmak üzere dosyalardan faydalanılır.
Bir dosyadan okumak veya bir dosyaya yazmak istendiğinde, ilk önce dosyanın açılması gerekmektedir.
Dosya ile ilgili yapılacak işlemler tamamlandığında, dosyaya bağlı kaynakların serbest kalması için kapatıl-
ması gerekmektedir. Python’da bir dosya işlemi aşağıdaki sırayla gerçekleşmektedir:
• Bir dosya aç
• Okuma veya yazma işlemleri
• Dosyayı kapat
Dosya Açma
Python, bir dosyayı açmak için dahili bir open() fonksiyonuna sahiptir. Bu fonksiyon, dosyayı
uygun şekilde okumak veya değiştirebilmek için tanımlayıcı olarak da adlandırılan bir dosya nesnesi
döndürmektedir.
Kod:
# dosyayı geçerli dizinde oluşturur
dosya = open("ilk_dosyam.txt")
# dosyayı özel olarak verilmiş dizinde oluşturur
dosya = open("D:/dosya_arsivi/python_notları.txt")
Python programlama dilinde, bir dosya açarken mod belirtilebilir. Modda, dosyaya “r” okuma, “w”
yazma veya “a” ekleme durumlarından biri belirtilebilir. Ayrıca dosyanın metin modunda veya ikili (bi-
nary) modda açılması da parametrik olarak belirtilebilir. Dosyanın varsayılan okuma modu ise metin mo-
dudur. Bu modda, dosyadan okurken dizeler (string) alınmaktadır. Bunun yanında, ikili mod bayt değer
159
5
Dosya İşlemleri ve Hata Yakalama
döndürmektedir. Bu mod, resim veya yürütülebilir dosyalar (exe uzantılı) gibi metin olmayan dosyalarla
uğraşırken kullanılacak moddur.
Kod:
# 'r' veya 'rt' ile eşdeğer
dosya = open("metin_dosyası.txt")
# metin modunda yaz
dosya = open("metin_dosyası.txt",'w')
# ikili modda okuma ve yazma
dosya = open("resim_dosyası.bmp",'r+b')
Python programlama dilinde diğer dillerden farklı olarak, a karakteri ASCII kodlaması kullanıla-
rak kodlanana kadar 97 sayısını işaret etmez. Bunun yanında, varsayılan kodlama platforma bağlıdır ve
Linux’ta utf-8 iken Windows’ta cp1252’dir. Bu yüzden, varsayılan kodlamaya dayalı dosya işlemleri sorun
çıkarabilir, hazırlanan kodun farklı platformlarda farklı davranacağı göz önüne alınmalıdır. Böyle hatalara
neden olmaması için, metin modunda dosyalarla çalışırken, kodlama türünün belirtilmesi gerekmektedir.
Kod:
dosya = open("metin_dosyası.txt", mode='r', encoding='utf-8')
Dosya Kapatma
Dosya üzerinde yapılan işlemler bittiğinde dosyanın düzgün bir şekilde kapatılması gerekmektedir.
Bir dosya kapatılarak, dosyaya bağlı olan kaynaklar serbest bırakılmaktadır. Dosya kapatma işlemi close()
yöntemi kullanılarak yapılmaktadır.
Python’da, artık başvurulmayan nesneleri temizlemek için bir çöp toplayıcısı (Garbage Collector) yapısı
bulunmaktadır, fakat dosya kapatma işlemleri için bu yapıya güvenilmemelidir.
Kod:
qdosya = open("metin_dosyası.txt", encoding = 'utf-8')
# Dosya işlemlerinin yapıldığı kod bloğu
[Link]()
Bu yöntem de tamamen güvenli değildir. Dosya ile işlem yaparken bir hata oluştuğunda, kod dosyayı
kapatmadan çıkacaktır. Bu yüzden daha güvenli bir yol olan, hata yakalama amacıyla kullanılan try...
finally bloğu kullanılmalıdır.
160
5
Programlama II
Kod:
try:
dosya = open("metin_dosyası.txt", encoding = 'utf-8')
# Dosya işlemlerinin yapıldığı kod bloğu
finally:
[Link]()
Bu şekilde, program akışının durmasına neden olan bir hata ortaya çıktığı durumda bile dosyanın düz-
gün bir şekilde kapatılması sağlanacaktır.
Bir dosyayı kapatmanın en iyi yolu “with” deyiminin kullanılmasıdır. “with” deyimi sayesinde, with
ifadesinin içindeki bloktan çıkıldığında dosyanın kapatılması sağlanmaktadır. Ayrıca close() fonksiyonu
dahili olarak çağrıldığı için tekrar çağrılmasına gerek duyulmaz.
Kod:
with open("metin_dosyası.txt", encoding = 'utf-8') as dosya:
# Dosya işlemlerinin yapıldığı kod bloğu
Dosyaya Yazma
Python’da bir dosyaya veri yazmak için onu “w” yazma, “a” ekleme veya “x” özel oluşturma modunda
açılması gerekmektedir. Dosya mevcutsa, var olan dosyadaki tüm verileri silerek üzerine yazacağı için “w”
modunun kullanımına dikkat edilmesi gerekmektedir.
Bir metin dizisi veya bayt dizisi yazmak için (ikili dosyalarda) write() metodu kullanılmaktadır. Bu
metot, dosyaya yazılan karakter sayısını döndürmektedir.
Kod:
with open("metin_dosyası.txt",'w',encoding = 'utf-8') as dosya:
[Link]("Python kullanarak yapılan ilk dosya uygulaması\n")
[Link]("Bu dosya rastgele verilerle dolu\n")
[Link]("Dosya test işlemleri\n")
Kod Çıktısı:
Python kullanarak yapılan ilk dosya uygulaması
Bu dosya rastgele verilerle dolu
Dosya test işlemleri
Bu kod parçası, program dosyasının olduğu dizinde yoksa metin_dosyası.txt adlı yeni bir dosya oluştu-
racaktır, dosya varsa üzerine yazarak eski verileri silecektir. Dosya yazma işlemlerinde dikkat edilmesi gere-
ken bir nokta da, farklı satırları ayırt etmek için yeni satır karakterlerinin kod ile eklenmesi gerekmektedir.
Dosya Okuma
Python programlama dilinde bir dosyayı okuyabilmek için, dosya okuma “r” modunda açılmalı-
dır. Dosyadan okuma yapmak için çeşitli yöntemler mevcuttur. Verilerin boyut kadar veri okumak için
read(boyut) yöntemi kullanılabilir. Boyut parametresi belirtilmezse, dosyanın sonuna kadar olan tüm ve-
rileri döndürür.
161
5
Dosya İşlemleri ve Hata Yakalama
Kod:
dosya = open("metin_dosyası.txt",'r',encoding = 'utf-8')
print( [Link](5) ) # ilk 5 karakter verisini okur
print( [Link](5) ) # sonraki 5 karakter verisini okur
print( [Link]() ) # dosya sonuna kadar tüm veriyi okur
print( [Link]() ) # dosyada okunmayan veri kalmadığı için boş döner
Kod Çıktısı:
Pytho
n kul
lanarak yapılan ilk dosya uygulaması
Bu dosya rastgele verilerle dolu
Dosya test işlemleri
Dosya okuma kodunda, read() yönteminin verilen sayı kadar karakter döndürdüğü görülmektedir.
Dosyanın sonuna ulaşıldığında, daha fazla okuma yapılamadığı için boş veri dönmektedir.
Mevcut dosya imleci (konumu) search() yöntemi kullanılarak değiştirilebilir. Benzer şekilde, tell() yön-
temi mevcut imleç konumunu (bayt sayısı olarak) döndürmektedir.
Kod:
print( [Link]() ) # imlecin şu anki konumunu verir
[Link](0) # imleci başlangıç noktasına gönderir
print( [Link]() ) # tüm dosyayı okur
Kod Çıktısı:
109
Python kullanarak yapılan ilk dosya uygulaması
Bu dosya rastgele verilerle dolu
Dosya test işlemleri
Dosya okumak için for döngüsü de kullanılabilir. Dosya içeriği, döngü sayesinde verimli ve hızlı bir
şekilde satır satır okunmaktadır.
Kod:
dosya = open("metin_dosyası.txt",'r',encoding = 'utf-8')
for satır in dosya:
print(satır, end = '')
Kod Çıktısı:
Python kullanarak yapılan ilk dosya uygulaması
Bu dosya rastgele verilerle dolu
Dosya test işlemleri
Alternatif olarak, bir dosyanın tek tek satırlarını okumak için readline() yöntemi kullanılabilir. Bu yön-
tem ile, yeni satır karakteri de dahil olmak üzere dosya satır satır okunarak veri döndürülür.
Kod:
dosya = open("metin_dosyası.txt",'r',encoding = 'utf-8')
print([Link]())
print([Link]())
162
5
Programlama II
Kod Çıktısı:
Python kullanarak yapılan ilk dosya uygulaması
Son olarak da, readlines() fonksiyonu dosyanın tüm kalan satırlarının bir listesini döndürmek için
kullanılır. Tüm bu okuma yöntemleri, dosyanın sonuna (EOF) ulaşıldığında boş değer döndürmektedir.
Kod:
dosya = open("metin_dosyası.txt",'r',encoding = 'utf-8')
print([Link]())
print([Link]())
print([Link]())
Kod Çıktısı:
Python kullanarak yapılan ilk dosya uygulaması
163
5
Dosya İşlemleri ve Hata Yakalama
Öğrenme Çıktısı
1 Dosya açma, dosyaya yazma ve dosyadan okuma işlemlerini açıklayabilme
2 Dosya için kullanılan özel metotların kullanımını kavrayabilme
DİZİNLER
Dizin veya çok kullanılan diğer adıyla klasör, dosyalar ve alt klasörlerden oluşan bir koleksiyon yapı-
sıdır. Hazırlanan programda çok sayıda dosya ile işlem yapılacaksa, operasyonu daha yönetilebilir kılmak
için dizin yapısından faydalanılabilir.
Python programlama dilinin standart modülleri altında gelen “os”, yani işletim sistemi modülü ile di-
zin işlemleri gerçekleştirilmektedir. Bu modül, işletim sistemiyle etkileşim için fonksiyonlar sağlamaktadır.
*os* ve *[Link]* modülleri, dosya sistemiyle etkileşim kurmak için birçok fonksiyon içermektedir.
Kod:
# işletim sistemi modülünü içe aktarma
import os
Kod Çıktısı:
Geçerli çalışma dizini: D:\Project Python\uniteler
164
5
Programlama II
Dizini Değiştirme
Mevcut çalışma dizini (CWD) değiştirmek için [Link]() yöntemi kullanılmaktadır. Bu yöntem,
CWD’yi belirtilen bir dosya yolu ile değiştirir. Yeni bir dizin yolu olarak yalnızca tek bir argüman alır. Yeni
dizin yolu elemanlarını ayırmak için hem ters bölü “\” hem de “/” bölü işareti kullanılabilir.
Kod:
import os
print([Link]())
[Link]('D:\\temp')
print([Link]())
Kod Çıktısı:
D:\Project Python\uniteler
D:\temp
Kod:
import os
print([Link]())
print([Link]())
print([Link]('c:\\program files\\7-zip'))
Kod Çıktısı:
D:\Project Python\uniteler
['[Link]', '[Link]', '[Link]', 'metin_dosyası.txt', 'sabit_degerler.
py', '[Link]', '[Link]', '[Link]', '[Link]', '[Link]']
['[Link]', '[Link]', '[Link]', '[Link]', '[Link]', '[Link]', '7zCon.
sfx', '[Link]', '[Link]', '[Link]', '[Link]', 'Lang', 'License.
txt', '[Link]', '[Link]']
Kod:
import os
165
5
Dosya İşlemleri ve Hata Yakalama
Kod Çıktısı:
['bir alt dizin', '[Link]', '[Link]', '[Link]', 'metin_dosyası.txt',
'sabit_degerler.py', '[Link]', '[Link]', '[Link]', '[Link]',
'[Link]']
Kod:
import os
[Link]('D:\\temp')
[Link]('eski dizin')
print( [Link]() )
Kod Çıktısı:
['eski dizin']
['güncel dizin']
Kod:
import os
[Link]('D:\\temp')
print( [Link]() )
[Link]('yeni_dizin')
dosya = open("metin_dosyası.txt", mode='x', encoding='utf-8')
[Link]()
print([Link]())
[Link]('yeni_dizin')
print([Link]())
[Link]("metin_dosyası.txt")
print([Link]())
Kod Çıktısı:
[ ]
['metin_dosyası.txt', 'yeni_dizin']
['metin_dosyası.txt']
[ ]
166
5
Programlama II
Kod:
import os
[Link]('D:\\temp')
print( [Link]() )
[Link]('yeni_dizin')
[Link]('D:\\temp\\yeni_dizin')
dosya = open("metin_dosyası.txt", mode='x', encoding='utf-8')
[Link]()
print([Link]())
[Link]('D:\\temp')
[Link]('yeni_dizin')
print([Link]())
Kod Çıktısı:
[ ]
['metin_dosyası.txt']
Traceback (most recent call last):
File "D:\Project Python\[Link]", line 13, in <module> [Link]('yeni_dizin')
OSError: [WinError 145] Dizin boş değil: 'yeni_dizin'
Kod örneğimizde yeni bir dizin oluşturduktan sonra bu dizin içine bir dosya oluşturuldu. Daha sonra
bir üst dizine geçerek içinde dosya olan dizinin silme denendi. Fakat dizin dolu oldıuğu için bu silme işle-
mi hata ile sonuçlandı. Bu gibi durumlarda boş olmayan bir dizini kaldırmak için “shutil” modülü içindeki
rmtree() metodu kullanılabilir.
Kod:
import os
import shutil
[Link]('D:\\temp')
print( [Link]() )
[Link]('yeni_dizin')
print( [Link]() )
[Link]('D:\\temp\\yeni_dizin')
dosya = open("metin_dosyası.txt", mode='x', encoding='utf-8')
[Link]()
print([Link]())
[Link]('D:\\temp')
print( [Link]() )
[Link]('yeni_dizin')
print([Link]())
167
5
Dosya İşlemleri ve Hata Yakalama
Kod Çıktısı:
[]
['yeni_dizin']
['metin_dosyası.txt']
['yeni_dizin']
[]
Öğrenme Çıktısı
3 Klasör/dizin oluşturma, silme ve içeriklerinin listelenmesini ifade edebilme
İSTİSNALAR (EXCEPTIONS)
Program yazarken programcıların ve son kullanıcıların karşılaştıkları hatalar vardır. Genel olarak 3
farklı şekilde hataları gruplayabiliriz.
1. Program Hataları (Syntax errors)
2. Mantık Hataları (Bug)
3. İstisnalar (Exceptions)
Bu hataları örnekler ile inceleyelim.
Kod:
# sayı listesi
sayılar = [11, 26, 20, 34, 42, 77, 55, 3, 4, 91]
168
5
Programlama II
Kod Çıktısı:
Traceback (most recent call last):
File "D:\Project Python\[Link]", line 8
for deger in sayılar
^
SyntaxError: invalid syntax
Örnek kodda for döngüsü sonuna “:” eklenmediği için yazım hatası alınacaktır.
Kod:
yari_cap = int(input("Yarıçap Giriniz :"))
PI = 3.14
cevre = PI + yari_cap * 2
print("Dairenin Çevresi :", cevre)
Kod Çıktısı:
Yarıçap Giriniz :5
Dairenin Çevresi : 13.14
Örnek kodda, dairenin çevresinin hesaplanma aşamalarında kod herhangi bir hata vermeden çalışmak-
ta fakat çevre hesaplamasında “çevre = PI * yarıçap * 2” olması gerekirken hata ile “çevre = PI + yarıçap
* 2” yazılmasıyla yanlış bir hesap yapılmış ve mantık hatası olarak karşımıza çıkmaktadır.
İstisnalar (Exceptions)
Söz diziminden başarılı bir şekilde geçtikten sonra oluşan hatalara istisna denilmektedir. Sayının sıfıra
bölünmesi, olmayan bir dosyaya erişim veya içe aktarılmaya çalışılan bir modülün bulunmaması gibi ha-
talar bunlara örnek verilebilir.
Bu şekilde bir çalışma zamanı hatası meydana geldiğinde, Python programlama dili bir istisna nesnesi
oluşturmaktadır. Eğer olası hatalar düzgün bir şekilde ele alınarak kullanıcıyı uyarmazsa, yorumlayıcı ha-
tanın neden olduğu hakkında bir geri bildirimi ekrana yazdıracaktır.
Kod:
sayi1 = int(input("Birinci Sayıyı giriniz :"))
sayi2 = int(input("İkinci Sayıyı giriniz :"))
bolum = sayi1/sayi2
print("Sonuc :", bolum)
Kod Çıktısı:
Birinci Sayıyı giriniz :3
İkinci Sayıyı giriniz
Traceback (most recent call last):
File "D:\Project Python\[Link]", line 4, in <module>
bolum = sayi1/sayi2
ZeroDivisionError: division by zero
169
5
Dosya İşlemleri ve Hata Yakalama
Örnek kodda, ikinci girilen sayı için sıfır kontrolü eklenmedi ve kullanıcı sıfır değerini girdiğinde sıfıra
bölünme hatası verdi.
Kod:
print(dir(locals()['__builtins__']))
170
5
Programlama II
İstisna/Hata Yakalama
Python programlama dili de, diğer yüksek seviyeli diller gibi hata yakalama mekanizmasına sahiptir.
Programda bir hata oluştuğunda, bir şeyler ters gittiğinde hata yakalayabilmek için try, except ve finally
işlevleri kullanılmaktadır.
İstisnai bir durum meydana geldiğinde, Python yorumlayıcısı çalışmakta olan işlemi durdurur ve hatayı
yakalaması için çağıran işleme yönlendirir. Yönlendirilen işlemde bir hata yakalama mekanizması yoksa,
program çökecektir.
Örnek şekilde bir programda metot çağrısı ve alınan bir hata durumunda verilen tepkiyi inceleye-
lim. A fonksiyonundan B fonksiyonu ve sırasıyla C ve D fonksiyonlarının çağrıldığı görülmektedir. D
fonksiyonunda oluşan bir hata başta kendi içerisinde bir hata yakalama mekanizması kontrolü yapılır.
Hata yakalanamazsa, sırasıyla kendisini çağıran tüm metotlara bu hata iletilir. Hiçbir metot içerisinde
bir hata yakalama mekanizması bulunmadığı durumda ise program bir hata mesajı göstererek aniden
sonlanacaktır.
171
5
Dosya İşlemleri ve Hata Yakalama
Hata Yakalama
Hata yakalamak için try ifadesi kullanılmaktadır. Kod içerisinde bir hata/istisna oluşturabilecek du-
rumlar try cümleciği içerisinde yazılır. Kodun üreteceği herhangi bir hata durumunda, except yan cümleci-
ği içerisinde yazılan kod bloğu çalışacaktır. Böylece bir hata durumunda yapılması gereken işlem kullanıcı
tarafından belirlenmiş olacaktır.
Kod:
# istisna türünü alabilmek için sys modülünü içe aktarma
import sys
Kod Çıktısı:
Eleman: 5.7
5.7 tersi: 0.2
Eleman: 0
Hata <class 'ZeroDivisionError'> oldu.
Sonraki eleman
Eleman: R
Hata <class 'ValueError'> oldu.
Sonraki eleman
Eleman: 7
7 tersi: 0.14285714285714285
Eleman: 2
2 tersi: 0.5
Örnek kodda, listenin değerleri arasında yapılan işlemlerde bir istisna/hataya neden olabileceği düşü-
nülen kısım, try bloğu içerisinde yerleştirilmiştir. Herhangi bir hata oluşmazsa, “except” bloğu atlanarak
işlemlere devam edilir. Hata olduğunda ise “except” bloğu içerisindeki kod çalıştırılır ve for döngüsünün
işlemine devam edilir.
Hatalı kodun yakalandığı “except” bloğunda exc_info() işlevi kullanılarak alınan hatanın türü yazdırıl-
mıştır. 0 değerinin “ZeroDivisionError” hatasına ve R değerinin de “ValueError” hatasına neden olduğu
görülmektedir.
Python programlama dilinde tüm hatalar temel Exception sınıfından türetildiği için, örnek kodu tekrar
şu şekilde yazabiliriz:
172
5
Programlama II
Kod:
# istisna türünü alabilmek için sys modülünü içe aktarma
import sys
Kod Çıktısı:
Eleman: 5.7
5.7 tersi: 0.2
Eleman: 0
Hata <class 'ZeroDivisionError'> oldu.
Sonraki eleman
Eleman: R
Hata <class 'ValueError'> oldu.
Sonraki eleman
Eleman: 7
7 tersi: 0.14285714285714285
Eleman: 2
2 tersi: 0.5
Kod:
try:
# kod bloğu
pass
except ValueError:
# ValueError hatasının yakalanması
pass
173
5
Dosya İşlemleri ve Hata Yakalama
except:
# kalan diğer tüm hataların yakalanması
pass
Kod:
>>> raise MemoryError("This is an argument")
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
MemoryError: This is an argument
try:
sayi = int(input("Sıfırdan büyük bir tamsayı giriniz: "))
if sayi <= 0:
raise ValueError("Girdiğiniz sayı sıfırdan büyük değil!")
if sayi % 2 == 0:
print("Girdiğiniz sayı Çift")
else:
print("Girdiğiniz sayı Tek")
except ValueError as hata:
print(hata)
Kod Çıktısı:
Sıfırdan büyük bir tamsayı giriniz: 44
Girdiğiniz sayı Çift
174
5
Programlama II
Kod:
# çift sayıların tersini alan program
try:
sayi = int(input("Lütfen bir sayı giriniz: "))
assert sayi % 2 == 0
except:
print("Girilen değer bir Çift sayı değil!")
else:
ters = 1/sayi
print(ters)
Kod Çıktısı:
Lütfen bir sayı giriniz: 50
0.02
Kod örneğinde girilen çift sayı değerleri için, sayının tersi yani 1’e bölümünden elde edilen bölüm
değeri yazdırılmaktadır. Girilen tek sayı değerleri için ise kod hata üretmektedir. Bunun yanında sıfır de-
ğerinin girilmesiyle de işlem sırasında bu hatayı yakalayacak kod bloğu olmadığı için “ZeroDivisionError”
hatası alınacaktır.
try...finally Bloğu
Hata yakalama koduna isteğe bağlı olarak “finally” bloğu eklenebilir. Bu kod bloğu, ister hata olsun
ister olmasın çalıştırılır. Genellikle kodda kullanılan dış kaynakların serbest bırakılması amacıyla kullanılır.
Örneğin bir dosya, veritabanı veya network üzerinden yapılan bir işlemde, yapılan işlem başarılı olsun
olmasın kullanılan kaynakların serbest bırakılması veya temizlenmesi, bağlantının kapatılması gibi işlemler
gerekmektedir. finally bloğu ile tüm bu işlemler gerçekleştirilebilir.
Kod:
try:
dosya = open("metin_dosyası.txt", encoding = 'utf-8')
# dosya işlemleri kod bloğu
finally:
print("Bu kod bloğu her zaman çalışacaktır")
[Link]()
Kod Çıktısı:
Bu kod bloğu her zaman çalışacaktır
Kod örneğinde, dosya işlemleri sırasında herhangi bir hata alınsa dahi, finally bloğunun çalıştırılması
ile dosya kapatılacaktır.
175
5
Dosya İşlemleri ve Hata Yakalama
Kod:
class OzelHata(Exception):
print("ÖzelHata - Kullanıcı tanımlı bir istisna yakalandı!")
pass
try:
raise OzelHata("Hata oluşturuldu!!!")
except OzelHata as hata:
print( hata )
Kod Çıktısı:
ÖzelHata - Kullanıcı tanımlı bir istisna yakalandı!
Hata oluşturuldu!!!
Örnek kodda, OzelHata ismiyle kullanıcı tanımlı bir istisna oluşturulmuştur. Ayrıca diğer istisnalara
benzer şekilde, isteğe bağlı olarak oluşturulmuş bir hata mesajı görüntülemektedir.
Benzer şekilde, büyük bir projede kullanıcı tanımlı istisnalar tek bir dosya altında toplanarak kontrol
edilmesi de tavsiye edilen bir kodlama uygulamasıdır. Standart modüllerin çoğunda genellikle istisnalar
“[Link]” veya “[Link]” şeklinde isimlendirilen dosyalarda tanımlanmaktadır.
Kullanıcı tanımlı istisna sınıfları da diğer sınıfların sahip olduğu özelliklere sahiptir ve normal bir sınıf
ile yapılabilecek her şey bu sınıf yardımıyla da yapılabilir. Bu sınıfların daha sade ve anlaşılır şekilde kulla-
nılması da tavsiye edilmektedir.
Kod:
import random
class KucukDegerHatasi(OzelHata):
"""Girilen sayı değeri, tutulan sayıdan küçük olduğunda bu hata oluşturulur"""
pass
class BuyukDegerHatasi(OzelHata):
"""Girilen sayı değeri, tutulan sayıdan büyük olduğunda bu hata oluşturulur"""
pass
176
5
Programlama II
Kod Çıktısı:
Bir sayı giriniz: 50
Daha büyük bir değer deneyin!
OzelHata adında istisnalar için bir temel sınıf tanımı yapılmıştır. Program tarafından oluşturulan diğer
iki (KucukDegerHatasi ve BuyukDegerHatasi) istisnaları da yine bu temel sınıftan türetilmiştir. Python
programlama dilinde standart olarak kullanıcı tanımlı istisnalar bu şekilde tanımlanmaktadır, ancak farklı
yöntemler de kullanılabilir.
177
5
Dosya İşlemleri ve Hata Yakalama
Yaşamla İlişkilendir
….
Kaynak: Hale, J., (2019, Şubat 15). 10 Python File System Methods You Should Know, (2022, Mart 20).
[Link]
Öğrenme Çıktısı
4 Kodlama sırasında karşılaşılan hataları yönetebilme, hata türleri ve kullanıcı tanımlı
istisnaları ifade edebilme
178
5
Programlama II
Dosya İşlemleri
Dosyalar, ilgili bilgileri depolamak için disk üzerindeki isimlendirilmiş konumlardır. Verileri kalıcı olarak
sabit disk, hafıza kartı gibi kalıcı bir bellekte depolamak için kullanılırlar. Rastgele Erişimli Bellek (RAM)
geçici bir bellek türüdür, yani bilgisayar kapatıldığında veriler silinir. Bu yüzden verileri kalıcı olarak depo-
layarak gelecekte kullanmak üzere dosyalardan faydalanılır.
Bir dosyadan okumak veya bir dosyaya yazmak istendiğinde, ilk önce dosyanın açılması gerekmektedir.
Dosya ile ilgili yapılacak işlemler tamamlandığında, dosyaya bağlı kaynakların serbest kalması için kapatıl-
ması gerekmektedir. Python’da bir dosya işlemi aşağıdaki sırayla gerçekleşmektedir:
• Bir dosya aç
• Okuma veya yazma işlemleri
• Dosyayı kapat
Dizinler
Dizin veya çok kullanılan diğer adıyla klasör, dosyalar ve alt klasörlerden oluşan bir koleksiyon yapısıdır.
Hazırlanan programda çok sayıda dosya ile işlem yapılacaksa, operasyonu daha yönetilebilir kılmak için
dizin yapısından faydalanılabilir.
Python programlama dilinin standart modülleri altında gelen “os”, yani işletim sistemi modülü ile dizin
işlemleri gerçekleştirilmektedir. Bu modül, işletim sistemiyle etkileşim için fonksiyonlar sağlamaktadır. *os*
ve *[Link]* modülleri, dosya sistemiyle etkileşim kurmak için birçok fonksiyon içermektedir.
Bir dizindeki tüm dosya ve alt dizinlere listdir() fonksiyonu kullanılarak elde edilebilir. Bu fonksiyon para-
metre olarak bir dosya yolu alır ve bu dosya yolundaki alt dizinlerin ve dosyaların bir listesini döndürür. Yol
belirtilmezse, geçerli çalışma dizinindeki alt dizinlerin ve dosyaların listesini döndürür.
Yeni bir dizin oluşturmak için os modülünün desteklediği [Link]() fonksiyonu bulunmaktadır. Bu fonk-
siyona parametre olarak verilen, “dosya yolu” isimli bir dizin oluşturmak için kullanılır.
Bir dizini veya dosyayı yeniden adlandırmak için rename() fonksiyonu kullanılmaktadır. Bir dosyayı kaldır-
mak, silmek için remove() yöntemi kullanılmaktadır. Boş bir dizini kaldırmak da rmdir() metodu yardımı
ile gerçekleştirilmektedir.
179
5
Dosya İşlemleri ve Hata Yakalama
İstisnalar (Exceptions)
Program yazarken programcıların ve son kullanıcıların karşılaştıkları hatalar vardır. Genel olarak hatalar 3
farklı şekilde gruplanabilir:
a. Program Hataları (Syntax errors)
b. Mantık Hataları (Bug)
c. İstisnalar (Exceptions)
Programlama dilinin izin vermediği işlemler istisnalar oluşturabilir. Python dilinde, ilgili hatalar oluştuğun-
da ortaya çıkan, birçok dahili tanımlanmış istisna mevcuttur. Yerleşik local() işlevini kullanarak tüm yerleşik
istisnalara ulaşılabilir.
Python programlama dili de, diğer yüksek seviyeli diller gibi hata yakalama mekanizmasına sahiptir. Prog-
ramda bir hata oluştuğunda, bir şeyler ters gittiğinde hata yakalayabilmek için try, except ve finally işlevleri
kullanılmaktadır.
İstisnai bir durum meydana geldiğinde, Python yorumlayıcısı çalışmakta olan işlemi durdurur ve hatayı
yakalaması için çağıran işleme yönlendirir. Yönlendirilen işlemde bir hata yakalama mekanizması yoksa,
program çökecektir.
İstisnalar çalışma zamanında hatalar meydana geldiğinde ortaya çıkmaktadır. Ayrıca, “raise” anahtar sözcü-
ğü kullanılarak istisnalar kod tarafında da kullanıcı tarafından oluşturulabilir.
Python programlama dilinde yerleşik olarak gelen çok sayıda hata yakalama durumları mevcuttur. An-
cak kimi durumlarda kullanıcılar, programın akışına özel olarak tasarlanmış kendi istisnai durumlarını
oluşturabilirler.
180
5
Programlama II
neler öğrendik?
2 Dosya üzerinde yapılan işlemler bittiğinde dosyanın düzgün bir şekilde kapatılması gerekmektedir.
Bir dosya kapatılarak, dosyaya bağlı olan kaynaklar serbest bırakılmaktadır.
Yukarıdaki tanımda bahsedilen dosya kapatma yöntemi aşağıdaki seçeneklerden hangisinde doğru olarak
verilmiştir?
A. exit B. close C. return D. garbage collector E. quit
4 import os
print([Link]())
print([Link]())
Yukarıda verilen örnek Python kodu ile yapılan işlem, aşağıdaki seçeneklerden hangisinde doğru olarak verilmiştir?
A. Geçerli klasörü değiştirir ve klasör içindeki dosyaları listeler
B. Geçerli klasörü yazdırır ve içindeki dosya ile klasörleri listeler
C. İşletim sisteminin kurulu olduğu klasörü yazdırır ve klasörleri listeler
D. İşletim sisteminin kurulu olduğu klasörü yazdırır ve dosyaları listeler
E. Geçerli klasör altındaki tüm dosyaları listeler
5 Python programlama dilinde, yeni bir dizin oluşturmak için aşağıdaki metotlardan hangisi
kullanılmalıdır?
A. createdir B. newdir C. listdir D. mkdir E. chdir
6 import os
[Link]('D:\\temp')
[Link]('yeni_dizin')
[Link]('D:\\temp\\yeni_dizin')
dosya = open("metin_dosyası.txt", mode='x', encoding='utf-8')
[Link]()
print([Link]())
Aşağıdaki seçeneklerden hangisi, yukarıda verilen örnek Python kodu ile yapılan işlem adımlarından biri
değildir?
A. Geçerli klasörü değiştirme B. Geçerli klasörü listeleme C. Yeni dosya oluşturma
D. Yeni dosyaya metin ekleme E. Yeni bir dizin oluşturma
181
5
Dosya İşlemleri ve Hata Yakalama
7 I. Program hataları
II. Mantık hataları
neler öğrendik?
10
def fnk( a ):
try:
print(7 / a)
except:
print("Hata oluştu!")
fnk(0)
Yukarıda verilen örnek Python kodunun çıktısı, aşağıdaki seçeneklerden hangisinde doğru olarak
verilmiştir?
A. 7
B. 0
C. Hata oluştu!
D. ZeroDivisionError: division by zero
E. SyntaxError
182
5
Programlama II
1. D Yanıtınız yanlış ise “Dosya İşlemleri” konu- 6. D Yanıtınız yanlış ise “Dizinler” konusunu ye-
sunu yeniden gözden geçiriniz. niden gözden geçiriniz.
3. E Yanıtınız yanlış ise “Dosya İşlemleri” konu- 8. D Yanıtınız yanlış ise “İstisnalar (Exceptions)”
sunu yeniden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
4. B Yanıtınız yanlış ise “Dizinler” konusunu ye- 9. E Yanıtınız yanlış ise “İstisnalar (Exceptions)”
niden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
5. D Yanıtınız yanlış ise “Dizinler” konusunu ye- 10. C Yanıtınız yanlış ise “İstisnalar (Exceptions)”
niden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
Araştır Yanıt
5 Anahtarı
Araştır 1
# metin modunda aç
dosya = open(dosya_adı + ".txt",'w', encoding = 'utf-8')
# dosya içeriği yaz
[Link]( icerik )
# dosyayı kapat
[Link]()
Araştır 2
import os
183
5
Dosya İşlemleri ve Hata Yakalama
Araştır Yanıt
5 Anahtarı
Araştır 3
import os
try:
# metin modunda yaz
dosya = open("d:\temp\[Link]",'x', encoding = 'utf-8')
[Link]( "sma hastalarına duyarsız kalmayalım!" )
[Link]()
# dosya açma ve yazma sırasında bir hata alınırsa
# bu kod bloğu çalışacak
except Exception as e:
print("Hata ", e.__class__, "oldu.")
Kaynakça
Eliçalışkan, M., Python Dosya İşlemleri, (2022, Mart 16). [Link]
İşleyen, C., (2019), Python Hata Yakalama ve İstisnalar, (2022, Mart 18). [Link]
python-hata-yakalama-ve-istisnalar.
Özgül, F., (2022), os Modülü, (2022, Mart 17). [Link]
Python File I/O, (2022, Mart 15). [Link]
Python Dosya I/O İşlemleri, (2022, Mart 15). [Link]
python-dosyasi-i-o-islemleri.
Rai, A., OS Module in Python with Examples, (2022, Mart 16). [Link]
python-examples.
184
Bölüm 6
Nesne ve Sınıf
Nesne Yönelimli Programlama (OOP -
2
Object Oriented Programming)
1
Sınıf ve Nesne (Class & Object)
öğrenme çıktıları
3 4
3 Nesne tabanlı programlamada kalıtım, Veri Gizleme (Data Encapsulation)
çoklu kalıtım, geçersiz kılma ve aşırı 4 Veri gizlemenin kullanımını ve önemini
yükleme konularını ifade edebilme ifade edebilme
5
Çöp Toplama (Garbage Collection)
5 Hafızada yer ayırma ve yer açma işlemlerini
açıklayabilme
Anahtar Sözcükler: • Nesne • OOP • YYP • Sınıf • Kalıtım • Çöp Toplama • Veri Gizleme • Overloading
• Overriding
186
6
Programlama II
GİRİŞ
Nesne yönelimli programlama, günümüz yazılım geliştirme uygulamalarında sıklıkla tercih edilen bir
programlama dili modelidir. Yazılım tasarımını nesneler ve sınıflar üzerinde düzenleyen bir modeldir. Yaşa-
nan teknolojik sorunlar ve ihtiyaçlar neticesinde 1960’lı yılların başında ortaya çıkmıştır.
Nesne yönelimli programlamada, her birinin kendi özellik ve davranışa sahip olduğu veri yapıları ve
nesneler tanımlanmaktadır. Birbirleriyle etkileşime geçen nesneler kullanılarak yazılımlar tasarlanmıştır.
Bu nesnelerin her biri de kendi özel metot ve prosedürlerini içerebilmektedir.
Nesne yönelimli programlama, Doğal, güvenilir, yeniden kullanılabilir, sürdürülebilir, genişletilebilir
ve zamandan tasarruf sağlamak olmak üzere toplam 6 öncelikli hedefe odaklanmıştır.
Bu bölümde, nesne yönelimli programlamada kullanılan bileşenleri ve detaylarını inceleyeceğiz. Tüm
konular ile ilgili kod örnekleri hazırlanmış ve incelemeleri de dahil edilmiştir.
Sınıf (Class)
Sınıf, nesne için bir tasarım, şablon veya ayrıntılı plandır diyebiliriz. Sınıf, bir örnek verecek olursak,
araç için bir tasarım şablonu olduğunu düşünebiliriz. Rengi, boyutları, parça bilgileri, tesisat bağlantıları
gibi tüm detaylı özellikleri içermektedir. Tüm bu özelliklere göre yeni bir araç üretimi için gerekli çalışma-
ların yapılabilmesine yardımcı olmaktadır.
Örnekte, sınıf bir şablonu, araç ise bir nesneyi temsil etmektedir.
Kod:
class Araç:
pass
187
6
Nesne ve Sınıf
Örnek kodda, boş bir Araç sınıfı tanımlamak için class anahtar sözcüğü kullanılmıştır. Sınıftan oluştu-
rulan örnekler (instance) belirli birer nesnedir.
Nesne (Object)
Bir nesne, bir sınıfın somutlaştırılmış haline verilen isimdir. Sınıf oluşturulduğunda sadece nesnenin
tanımı yapılmış olur. Bu tanım bellekte veya depolama alanında bir yer işgal etmez.
Kod:
araç = Araç()
Örnek kodda, araç isimli nesne, Araç sınıfından oluşturulmuş bir nesnedir. Şimdi de araç sınıfının ve
nesnelerinin nasıl oluşturulduğunu inceleyelim.
Kod:
class Araç:
# sınıf özelliği
tür = "binek"
# örnek özellikleri
def __init__(self, renk, yakıt):
[Link] = renk
[Link]ıt = yakıt
Kod Çıktısı:
Spor araç binek
SUV araç da binek
Kırmızı aracın yakıtı Benzin
Beyaz aracın yakıtı ise Dizel
Örnek programda Araç adında bir sınıf oluşturularak nesnenin özellikleri olan öznitelikleri tanımlan-
mıştır. Bu nitelikler, sınıfın __init__ metodu içinde tanımlanmaktadır. Bu metot başlatıcı metot olarak
adlandırılır. Yani nesne oluşturulur oluşturulmaz ilk çalıştırılan metottur.
Ardından Araç sınıfından spor ve suv isimli nesneler oluşturulmuştur. Sınıfların özelliklerine de __
class__.tür metodu kullanılarak erişilmektedir.
Sınıf nitelikleri, bir sınıfın tüm örnekleri için aynıdır. Benzer şekilde, [Link] ve [Link]ıt kullanarak
sınıf örneğinin niteliklerine erişilebilir. Ancak, bir sınıfın her örneği için atanan değerler farklıdır.
188
6
Programlama II
Metotlar (Methods)
Metotlar, sınıfın içerisinde tanımlanmış fonksiyonlardır. Bir nesnenin davranışlarını tanımlamak için kul-
lanılırlar. Metotlar, parametre alabilir, geri değer döndürebilir ve sadece çağrıldığında çalışan kod bloklarıdır.
Kod:
class Selamlama:
merhaba = Selamlama()
[Link]("Harun Kerem")
Kod Çıktısı:
Merhaba Harun Kerem
Örnek kodda, Selamlama isminde bir sınıf tanımlanmış ve bu sınıfta da “selam” isminde bir metot
oluşturulmuştur. Bu metoda da sınıftan türetilen bir nesne üzerinden erişilebildiği için bu metotlara örnek
metotları (instance methods) denilmektedir.
Kalıtım - Miras
Kalıtım ile mevcut bir sınıfın nitelikleri ve davranışları değiştirilmeden, bu özelliklerin tekrar düzen-
lenebileceği yeni bir sınıf oluşturulabilir. Yeni oluşturulan sınıf, türetilmiş bir sınıftır ve alt sınıf olarak da
isimlendirilir. Benzer şekilde, mevcut sınıf bir temel sınıftır ve ana sınıf olarak da isimlendirilir.
Kod:
#!/usr/bin/python
def anasınıfMethod(self):
print( "Anasınıf metodu çağrıldı" )
def getDeger(self):
print( "Ana sınıf özelliği: ", AnaSını[Link]ınıfDeger)
def altsınıfMethod(self):
print( 'Altsınıf metodu çağrıldı')
189
6
Nesne ve Sınıf
Kod Çıktısı:
Alt sınıfın yapıcı metodu çağrıldı
Altsınıf metodu çağrıldı
Anasınıf metodu çağrıldı
Ana sınıf özelliği: 629
Örnek kodda, bir AnaSınıf ve bu sınıftan türetilmiş bir AltSınıf sınıfları oluşturulmuştur. Alt sınıf, ana sınıfın
tüm işlevlerini devralmıştır. Bu kalıtım işlevi, “anasınıfMethod” metodunun çağrılması ile de görülmektedir.
Kapsülleme (Encapsulation)
Python programlama dilinde nesne yönelimli prog-
ramlama kullanılarak, değişken ve metotlara erişim kısıt- dikkat
lanabilmektedir. Bu kısıtlama işlemine kapsülleme adı ve- “_” tek altçizgi ile tanımlanan değişkenlere sınıf
rilmektedir ve verilerin doğrudan erişilip değiştirilmesini içerisinden ve alt sınıflardan erişilebilir. “__” çift
önlemek amacıyla kullanılmaktadır. Özel nitelikler tek ‘_’ altçizgi ile tanımlanan değişkenlere ise sadece sı-
veya çift ‘__’ alt çizgi kullanılarak belirtilmektedir. nıf içerisinden erişilebilir.
Kod:
class Araba:
def __init__(self):
self.__enyuksekfiyat = 2500
def satis(self):
print("Satış Fiyatı: {}".format(self.__enyuksekfiyat))
a = Araba()
[Link]()
# ücreti değiştirme
a.__enyuksekfiyat = 4750
[Link]()
Kod Çıktısı:
Satış Fiyatı: 2500
Satış Fiyatı: 2500
Satış Fiyatı: 1950
190
6
Programlama II
Örnek kodda bir Araba sınıfı tanımı yapılmıştır. Bir aracın satışı için en yüksek fiyatın belirlenebilmesi
amacıyla __init__() metodu kullanılmıştır. Yalnız dikkat edilmesi gereken önemli bir ayrıntı mevcuttur.
a.__enyuksekfiyat = 4750
Kodun bu kısmında en yüksek fiyat değeri, sınıf dışından değiştirilmeye çalışılmıştır. Fakat bu değişken
özel bir değişken olarak tanımlandığı için değeri değişmemekte ve ekran çıktısında bu değişiklik görüntü-
lenememektedir. Bu değer yalnızca, setEnYüksekFiyat metoduna parametre olarak fiyat değeri gönderile-
rek değiştirilebilir.
Kod:
class Şekil:
alan = 0
def alan(self):
en = input("En değerini giriniz:")
boy = input("Boy değerini giriniz:")
[Link] = int(en) * int(boy)
def alanYazdır(self):
print([Link])
class Kare(Şekil):
alan = 0
def alan(self):
en = input("Kenar uzunluğunu giriniz:")
[Link] = int(en) * int(en)
class Daire(Şekil):
alan = 0.0
def alan(self):
yarıçap = input("Yarıçap uzunluğunu giriniz:")
[Link] = float(yarıçap) * 3.14
daire = Daire()
[Link]()
[Link]ır()
kare = Kare()
[Link]()
[Link]ır()
dikdortgen = Şekil()
[Link]()
[Link]ır()
191
6
Nesne ve Sınıf
Kod Çıktısı:
Yarıçap uzunluğunu giriniz:3
9.42
Kenar uzunluğunu giriniz:4
16
En değerini giriniz:5
Boy değerini giriniz:8
40
Nesne Yönelimli Programlamada dikkat edilmesi gereken anahtar noktaları şu şekilde listeleyebiliriz:
• Nesne Yönelimli Programlama, programların daha verimli çalışmasının yanında programcıların
daha rahat anlamasına yardımcı olur.
• Veri soyutlama ile program daha güvenli bir hale gelmektedir
• Paylaşıma açık olan sınıflar ile kodların tekrar kullanılabilirliği sağlanmaktadır
• Çok biçimlilik sayesinde, farklı nesnelerde aynı özelliklerin desteklendiği arayüzler ile daha verimli
kod yazılmasına izin verilmektedir.
Öğrenme Çıktısı
1 Python dilindeki nesne yönelimli programlamada kullanılan kavramları ifade edebilme
192
6
Programlama II
Sınıf Tanımlama
Sınıf tanımlamaları class anahtar kelimesi ile başlamaktadır. Sınıfın içindeki ilk metin dizisine docs-
tring adı verilmektedir. Bu metin, sınıfın kısa bir açıklamasını içermektedir. Bu kısım zorunlu değildir
fakat tanımlanması tavsiye edilmektedir.
Kod:
class AraçFiyatlama:
'''Bu sınıf, piyasadaki araçların ortalama fiyatlarının belirlenmesi için
oluşturulmuştur'''
pass
Bir sınıfın tanımlanmasıyla birlikte, sınıfın tüm niteliklerinin yani veri ve fonksiyonlarının tanımlan-
dığı bir yerel ad alanı (namespace) oluşturulmaktadır. Bunun yanında, yeni bir sınıf tanımlandığında,
sınıf ile aynı isme sahip bir sınıf nesnesi oluşturulmaktadır. Bu oluşturulan sınıf nesnesi yardımıyla farklı
niteliklere erişilebilmekte ve o sınıftan yeni nesneler üretilmesine izin verilmektedir.
Kod:
class Personel:
def __init__(self, isim, soyisim, birim, yaş):
[Link] = isim
[Link] = soyisim
[Link] = birim
[Link]ş = yaş
Kod Çıktısı:
Memurun ismi: İsmet Kaplan
Oktay Müdür, Personel biriminde çalışmakatadır ve 51 yaşındadır.
Tüm Python sınıflarının yerleşik özellikleri vardır. Bu özelliklere diğer özelliklere erişildiği gibi (.) nokta
operatörü kullanılarak erişilebilmektedir. Sınıfların yerleşik özellikleri de şu şekilde listeleyebiliriz:
• __doc__ : Sınıf oluşturulurken tanımlanmışsa, sınıfa ait açıklama metnini döndürür
• __dict__ : Sınıfın niteliklerini içeren sözlük değerini döndürür
• __name__ : Sınıfın adını döndürür
• __module__ : Çağrıldığı nesne veya fonksiyonun adını, yoksa None değeri döndürür
• __ bases__ : Bir sınıf nesnesinin temel sınıflarının, türetildiği sınıfların demetini (tuple) döndürür
Kod:
class Personel:
'''Personel bilgilerinin tutulduğu sınıftır'''
def __init__(self, isim, soyisim, birim, yaş):
[Link] = isim
193
6
Nesne ve Sınıf
[Link] = soyisim
[Link] = birim
[Link]ş = yaş
print(memur.__dict__)
print(memur.__module__)
print(Personel.__bases__)
print(Personel.__name__)
print(Personel.__doc__)
Kod Çıktısı:
{'isim': 'İsmet', 'soyisim': 'Kaplan', 'birim': 'Muhasebe', 'yaş': 46}
__main__
(<class 'object'>,)
Personel
Personel bilgilerinin tutulduğu sınıftır
Nesne Oluşturma
Sınıf nesnesi üzerinden sınıfın çeşitli özelliklerine erişilebilmektedir. Bunun yanında, o sınıftan yeni bir
nesne oluşturmak için de kullanılmaktadır. Bu işlem, bir fonksiyon çağırmaya benzemektedir.
operatör = Personel()
Örnek kodda, operatör adıyla, Personel sınıfından yeni bir nesne örneği tanımlanmıştır. Nesne adı
üzerinden nesneye ait niteliklere ulaşılabilmektedir. Bu nitelikler, nesneye ait veri veya sınıfta tanımlanmış
fonksiyonlar olabilir.
Kod:
class Personel:
"Personel tanımlarının yapıldığı sınıf"
birim = "Bilgi İşlem"
def selam(self):
print('Aramıza hoş geldiniz!')
194
6
Programlama II
Kod Çıktısı:
<function [Link] at 0x04060078>
<bound method [Link] of <__main__.Personel object at 0x04055710>>
Aramıza hoş geldiniz!
Örnek kodda Personel isimli bir sınıf oluşturulmuş ve selam isimli bir fonksiyon tanımlanmıştır. Selam
fonksiyonu oluşturulurken parametre olarak sadece self anahtar kelimesini almıştır. Dikkat edilirse, tanım-
lanan fonksiyon herhangi bir parametre olmadan [Link]() şeklinde çağrılmış ve hata alınmamıştır.
Sınıf içinde tanımlanan tüm fonksiyonlar, diğer normal fonksiyonlardan farklı olarak, ilk parametreleri
self anahtar kelimesi olması gerekmektedir. Bu anahtar kelime, sınıfın kendisine verilen bir referanstır ve
sınıfa ait tüm özelliklere erişmek için kullanılmaktadır. Bu anahtar kelime “self” olarak isimlendirilmesi
gerekmez, fakat genel kullanım bu yöndedir. Bu şekilde kullanıldığında programı okuyan başka kişiler de
zorlanmayacaktır. Ayrıca fonksiyon çağrıldığında bu parametreye değer atanmaz, Python yorumlayıcısı
arka planda bunu yapmaktadır.
Örnek koddaki Personel sınıfında tanımlanmış selam fonk-
siyonu çağrılırken [Link]() şeklinde parametre almadan
çağrılmıştır. Bu fonksiyon çağrılması arka planda Python yo- dikkat
rumlayıcısı tarafından [Link]( Alper ) şekline dönüştü- Python programlama dilindeki self anahtar ke-
rülmektedir. Yani, sınıfa ait fonksiyon çağrılırken, self paramet- limesi, Java dilindeki referansa ve C++ dilindeki
resi olarak o sınıftan oluşturulan nesne gönderilmektedir. pointer yapıları ile eşdeğerdir.
Benzer şekilde, Python yorumlayıcının yapacağı işlem
kod ile de yapılabilmektedir.
Kod:
class Personel:
"Personel tanımlarının yapıldığı sınıf"
birim = "Bilgi İşlem"
def selam(self):
print('Aramıza hoş geldiniz!')
Kod Çıktısı:
Aramıza hoş geldiniz!
Aramıza hoş geldiniz!
Kod örneğinde de görüldüğü gibi, [Link]() ve [Link]( uzman ) metot çağrıları eşittir ve
aynı sonucu vermektedir.
195
6
Nesne ve Sınıf
Bu metot, sınıfın ilk metodu olmalıdır. İlgili sınıftan türetilecek olan nesnelere ilk değer atamaları bu
metot ile yapılmaktadır.
Kod:
class Araç():
def __init__(self, marka, model, renk, yakıt, vites):
[Link] = marka
[Link] = model
[Link] = renk
[Link]ıt = yakıt
[Link] = vites
arac_3 = Araç( )
print( arac_3 )
Kod Çıktısı:
<__main__.Araç object at 0x03A35ED0>
{'marka': 'Fiat', 'model': 'Egea', 'renk': 'Mavi', 'yakıt': 'Benzin', 'vites':
'Manuel'}
Traceback (most recent call last):
File "[Link]", line 16, in <module>
arac_3 = Araç( )
TypeError: __init__() missing 5 required positional arguments: 'marka', 'mod-
el', 'renk', 'yakıt', and 'vites'
extra = sınıf()
extra.yeni_alan = "Bu alana istediğim veriyi girebilirim!"
print( extra.__dict__ )
Kod Çıktısı:
{'yeni_alan': 'Bu alana istediğim veriyi girebilirim!'}
196
6
Programlama II
Kod:
class Araç():
def __init__(self, marka, model, renk, yakıt, vites):
[Link] = marka
[Link] = model
[Link] = renk
[Link]ıt = yakıt
[Link] = vites
def özetBilgi(self):
print("{0} marka araç {1} renkli ve {2} viteslidir.".
format([Link], [Link], [Link]))
Kod Çıktısı:
Hyundai marka araç Kırmızı renkli ve Otomatik viteslidir.
{'marka': 'Fiat', 'model': 'Egea', 'yakıt': 'Benzin', 'vites': 'Manuel'}
Traceback (most recent call last):
File "[Link]", line 19, in <module>
arac_2.özetBilgi()
File "[Link]", line 11, in özetBilgi
format([Link], [Link], [Link]))
AttributeError: 'Araç' object has no attribute 'renk'
Kod:
…
araç = Araç( "Hyundai", "Tucson", "Kırmızı", "Dizel", "Otomatik" )
del(araç)
araç.özetBilgi()
Kod Çıktısı:
Traceback (most recent call last):
File "[Link]", line 22, in <module>
araç.özetBilgi()
NameError: name 'araç' is not defined
Nesne oluşturma işleminin arka planında, araç = Araç(“Hyundai”, “Tucson”, “Kırmızı”, “Dizel”, “Oto-
matik”) kodu ile hafızada yeni bir Araç nesnesi oluşturulur ve araç ismine bu hafızadaki adres eşleştirilir.
197
6
Nesne ve Sınıf
Şekil 6.1’den de görülebileceği gibi, del( araç ) komutu ile, oluşturulan nesneye verilen araç ismi siline-
rek hafızadaki bu ilişki kaldırılmış olacaktır. Fakat Araç nesnesi halen daha hafızada durmaktadır. Eğer bu
nesneye başka bir isim eşleştirilmezse, bir müddet sonra hafıza temizleyici (Garbage Collector) tarafından
otomatik olarak hafızadan silinecektir.
araç araç
Araç Araç
Nesnesi Nesnesi
marka = “Hyundai”, marka = “Hyundai”,
model = “Tucson”, model = “Tucson”,
renk = “Kırmızı”, renk = “Kırmızı”,
yakıt = “Dizel”, yakıt = “Dizel”,
vites = “Otomatik” vites = “Otomatik”
Öğrenme Çıktısı
2 Sınıf oluşturma ve bu sınıfa ait nesnelerin oluşturulmasını açıklayabilme
198
6
Programlama II
Kod:
class Personel():
def __init__(self, isim, soyisim):
[Link] = isim
[Link] = soyisim
def isimYazdır(self):
print("{0} {1}".format([Link], [Link]))
class AkademikPersonel(Personel):
def __init__(self, isim, soyisim, fakülte):
Personel.__init__(self, isim, soyisim)
[Link]ülte = fakülte
def personelDetay(self):
print("{0} {1}, Birimi: {2}".format([Link], [Link], self.
fakülte))
Kod Çıktısı:
Selami Atik
Zihni Sinir, Birimi: Araştırma Geliştirme - Sanat ve Tasarım Fakültesi
199
6
Nesne ve Sınıf
Örnek kodda, Personel sınıfı tanımlanmış ve bu sınıfa ait isim ve soyisim özelliklerinin ilk değerleri ya-
pıcı/kurucu metot üzerinden alınması sağlanmıştır. Daha sonra isimYazdır metodu ile personelin isminin
yazdırılması sağlanmıştır.
Personel sınıfından türetilen AkademikPersonel sınıfı
ise, yapıcı metodunda türetildiği Personel sınıfının yapıcı
metodunu çağırmıştır. Böylece kalıtım yoluyla kendisi- dikkat
nin de kullanabildiği isim ve soyisim özelliklerine değer Eğer bir metot veya özellik bir sınıf içerisinde
ataması yapılabilmesini sağlamıştır. Yapıcı metot içinde bulunmuyorsa, türetildiği sınıfta aranır. Özellik
fazladan fakülte özelliği de eklenmiştir. Ayrıca isimYazdır bulunamazsa ve temel sınıfta başka bir sınıftan
metodu kendisine üst sınıfından kalıtım ile aktarılmıştır. türetilmiş ise, bu şekilde yinelemeli olarak özel-
Fakat aynı isimde yeni bir metot hazırlandığı için, üst me- lik bir üst sınıfında aranır.
todun isimYazdır metodu geçersiz kılınmıştır ve Akade-
mikPersonel sınıfından üretilen nesnelerde kullanılamaz.
Örnek kodda, __init__() metodunun her iki sınıfta da tanımlandığı görülmekedir. Böyle bir durumda,
türetilmiş sınıftaki metot, temel sınıftaki metodu geçersiz kılarak kendi tanımladığı metodu çağırır.
Yine kurucu metot içerisinde, temel sınıfın kurucu metodu çağırılmıştır. Bu çağırma işlemi Per-
sonel.__init__(self, isim, soyisim) şeklinde gerçekleştirilmiştir. Bunun yerine eşdeğeri olan super().__
init__(isim, soyisim) şeklinde de çağrılabilmektedir. Buradaki super() fonksiyonu, sınıfın türetilediği
temel sınıfı göstermektedir.
Python programlama dilinde, İki tane öntanımlı isinstance() ve issubclass() metotları ile ilgili nesnenin
kalıtımı kontrol edilebilmektedir.
isinstance() fonksiyonu ile, oluşturulan nesne sınıfın veya o sınıftan türetilen bir sınıfın örneği ise True
(doğru) değeri döndürmektedir. Ayrıca Python programlama dilinde her sınıf, “object” temel sınıfından
türetilmiştir.
Örnek kodumuz üzerinden isinstance() fonksiyonu kullanımını inceleyelim.
Kod:
>>> isinstance(personel, Personel)
True
>>> isinstance(personel, AkademikPersonel)
False
>>> isinstance(akademik, AkademikPersonel)
True
>>> isinstance(akademik, Personel)
True
>>> isinstance(akademik, object)
True
Benzer şekilde, issubclass() metodu da, kalıtım kontrolü için kullanılmaktadır. İlk parametre olarak
verilen sınıf, diğer sınıftan türetilmiş ise True (doğru), türetilmemiş ise False (yanlış) değeri vermektedir.
Kod:
>>> issubclass(AkademikPersonel, Personel)
True
>>> issubclass(Personel, AkademikPersonel)
False
>>> issubclass(int, float)
False
200
6
Programlama II
Çoklu Kalıtım
Python programlama dilinde de, C++ dilinde olduğu gibi, bir sınıf birden fazla temel sınıftan türeti-
lebilmektedir. Bu türetilme işlemine çoklu kalıtım adı verilmektedir. Çoklu kalıtımla türetilen bir sınıf,
türetildiği tüm temel sınıfların özelliklerini miras olarak almaktadır. Çoklu kalıtımın sözdimi de tekli
kalıtımda kullanılana benzemektedir.
class AnaSınıf2:
# ana sınıfın kod bloğu
AnaSınıf1 AnaSınıf2
AnaSınıf1Özellikleri AnaSınıf2Özellikleri
AltSınıf
AnaSınıf1 + AnaSınıf2
+ AltSınıf
Özellikleri
Örnek şekilde söz dizimindeki kalıtım gösterilmiştir. AltSınıf, AnaSınıf1 ve AnaSınıf2 sınıflarından
türetilmiştir.
201
6
Nesne ve Sınıf
AnaSınıf1 +
Metot Ayrıştırma İşlemi TüretilmişSınıf+
Python programlama dilinde unutulmaması gereken bir nokta da, her TüretilmişSınıf2
sınıfın nesne sınıfından türetildiğidir. Nesne (object) sınıfı, en temel tür Özellikleri
olarak da bilinir. İster kullanıcı tarafından oluşturulmuş, ister de yerleşik
bir sınıf olsun, tüm bu sınıflar türetilmiş birer sınıftır ve nesne sınıfının Şekil 6.3 Çok Düzeyli Kalıtım.
birer örneğidir.
Kod:
>>> # Output: True
print(issubclass(tuple,object))
True
>>> # Output: True
print(isinstance(26.2,object))
True
>>> # Output: True
print(isinstance("kimim ben",object))
True
Çoklu kalıtım durumunda, sınıfın sahip olduğu özellik veya metot ilk olarak geçerli sınıf içerisinde
aranmaktadır. Eğer bulunamazsa, üst sınıflarda derinlik öncelikli olarak sol - sağ kalıtım şeklinde aramaya
devam edilmektedir.
Çoklu kalıtım örneğinde arama sırası şu şekilde olacaktır: [ AltSınıf, AnaSınıf1, AnaSınıf2, object ]
Bu sıralamaya, çoklu kalıtım sınıfının doğrusallaştırılması adı verilmektedir. Ayrıca bu sıralama bulu-
nurken kullanılan kural kümesine de Metot Ayrıştırma Sırası ( Method Resolution Order - MRO ) adı
verilmektedir.
MRO, bir sınıfın her zaman türetildiği sınıfların önünde bulunmasını sağlamaktadır. Bir sınıfın MRO
verisi, __mro__ veya mro() fonksiyonları yardımı ile görüntülenebilmektedir. __mro__ bir demet verisi
döndürürken, mro() ise bir liste döndürmektedir.
202
6
Programlama II
Kod:
>>> AltSınıf.__mro__
(<class '__main__.AltSınıf'>, <class '__main__.AnaSınıf1'>, <class '__main__.
AnaSınıf2'>, <class 'object'>)
>>>
>>> AltSını[Link]()
[<class '__main__.AltSınıf'>, <class '__main__.AnaSınıf1'>, <class '__main__.
AnaSınıf2'>, <class 'object'>]
object
W K
A B C
X Y Z
Kod:
class W:
pass
class K:
pass
class A(W):
pass
203
6
Nesne ve Sınıf
class C(K):
pass
print( [Link]() )
Kod Çıktısı:
[<class '__main__.S'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__
main__.A'>, <class '__main__.Z'>, <class '__main__.B'>, <class '__main__.W'>,
<class '__main__.C'>, <class '__main__.K'>, <class 'object'>]
Şekil 6.4’de verilen bir sınıf yapılanmasının kod ile hazırlanmış şeklini incelediğimizde, en son türetilen
sınıf olarak S sınıfını görmekteyiz. S sınıfının türetildiği yapıyı da [Link]() fonksiyonu ile elde edebilmekteyiz.
Kod:
class Personel():
def __init__(self, isim, soyisim):
[Link] = isim
[Link] = soyisim
def personelDetay(self):
print("Personelin adı:", [Link], [Link])
class AkademikPersonel(Personel):
def __init__(self, isim, soyisim, fakülte, branş):
Personel.__init__(self, isim, soyisim)
[Link]ülte = fakülte
[Link]ş = branş
def personelDetay(self):
print("{0} {1}, Birimi: {2}, Branşı: {3}".format([Link], [Link]-
isim, [Link]ülte, [Link]ş))
204
6
Programlama II
Kod Çıktısı:
Personelin adı: Selman Bilaloğlu
Hamdullah Tarık, Birimi: Uzaktan Eğitim, Branşı: Öğrenme Yönetim Sistemleri
Örnek kodda, Personel sınıfından türetilmiş AkademikPersonel sınıfı üzerinde işlem yapılmıştır. Her
iki sınıfın da içerikleri farklı olmak üzere, personelDetay() isimli metodu bulunmaktadır. Türetilen sınıfta
oluşturulan personelDetay metodu, ana sınıftaki aynı isimli metodu iptal ederek üzerine yazdı, geçersiz
kıldı. Yani yeni oluşturulan metot aktif hale gelerek çalıştırılmış oldu.
205
6
Nesne ve Sınıf
Kod:
# + operatörünün aşırı yüklenmesi
class Toplama:
def __init__(self, değer):
[Link]ğer = değer
ob1 = Toplama("Anadolu")
ob2 = Toplama("Üniversitesi")
ob3 = Toplama(26)
ob4 = Toplama(63)
print(ob1 + ob2)
print(ob3 + ob4)
print(41 + 6)
Kod Çıktısı:
AnadoluÜniversitesiÜniversitesi
152
47
Örnek kodda, “+” operatörüne farklı bir görev yüklenerek, daha önceki görevinden farklı bir işlem
gerçekleştirmesi sağlanmıştır. “+” operatöründeki ilk eleman ile ikinci elemanın 2 katı toplanmaktadır.
Burada yapılacak işlem tamamen ihtiyaca yöneliktir. Toplama operatörü aşırı yüklenmeseydi, tip uyum-
suzluğu olacağı için şöyle bir hata verecekti:
Yalnız dikkat edilmesi gereken bir nokta da, bu aşırı yüklenmiş operatörün sadece bu sınıf için yapılan
toplama işlemlerinde geçerli olduğudur. Örnek kodda son satırda yapılan işlem, standart toplama işlemidir
ve aşırı yüklenmiş metot kullanılmamıştır.
206
6
Programlama II
Kod:
# küçüktür operatörünün aşırı yüklemesi
class Alan:
def __init__(self, en=0, boy=0):
[Link] = en
[Link] = boy
def __str__(self):
return "({0},{1})".format([Link], [Link])
a1 = Alan(1,2)
a2 = Alan(2,3)
a3 = Alan(2,4)
print( a3 )
Kod Çıktısı:
True
True
False
(2,4)
Benzer bir şekilde, Tablo 6.1’de verilen diğer karşılaştırma operatörleri için de aşırı yükleme yapılabilir.
Öğrenme Çıktısı
3 Nesne tabanlı programlamada kalıtım, çoklu kalıtım, geçersiz kılma ve aşırı yükleme
konularını ifade edebilme
207
6
Nesne ve Sınıf
Kod:
class Sayac:
__gizliSayac = 0
def say(self):
self.__gizliSayac += 1
def sayacDegeri(self):
print( self.__gizliSayac )
sayac = Sayac()
[Link]()
[Link]()
[Link]()
[Link]()
[Link]()
print( counter.__secretCount)
Kod Çıktısı:
1
2
Traceback (most recent call last):
File "[Link]", line 16, in <module>
print( counter.__secretCount)
NameError: name 'counter' is not defined
Python yorumlayıcısı, dahili olarak değişkenlerin isimlerini sınıf adını da içerecek şekilde değiştirerek
bu üyeleri korumaktadır. Gizli özelliklere şu şekilde ulaşılabilir:
nesne._sınıfAdı__özellikAdı
print( sayac._Sayac__gizliSayac )
208
6
Programlama II
Öğrenme Çıktısı
4 Veri gizlemenin kullanımını ve önemini ifade edebilme
Personellerin maaşlarının
hesaplandığı bir sınıf hazır- Diğer programlama dilleri ile Veri gizlemeye neden ihtiyaç
layanız. Maaş verisini gizle- Python dilinde veri gizleme duyulmaktadır, günlük hayat-
yerek bir metot üzerinden yöntemlerini karşılaştırınız. tan bir örnek ile açıklayınız.
erişimini sağlayınız.
Kod:
# 26 sayısı bir nesnedir
e = 26
209
6
Nesne ve Sınıf
Örnek kodu incelediğimizde, [Link]ırda 26 değeri bir nesne olarak oluşturulmuştur ve referans değeri 1
olarak ayarlanır. [Link]ırda 44 değeri atandığı için 26 değerine referans bir azaltılarak 0 olur ve çöp toplayıcı
tarafından nesne serbest bırakılır.
Farklı bir durum olarak, nesnenin referans sayısına ulaşılamadığı durumlarda referans döngüsü oluş-
maktadır. Liste, demet, sınıf örnekleri, sınıflar, fonksiyon ve sözlükleri içeren referans döngüleri yaygındır.
Bir referans döngüsü oluşturmanın en kolay yolu, kendi kendine başvuran bir nesne oluşturmaktır.
Kod:
def referans_dongusu():
# liste oluşturma
liste = []
referans_dongusu()
Örnek kodda referans_dongusu(), kendisine başvuran bir liste nesnesi oluşturduğundan, fonksiyon çalış-
tırıldığında liste nesnesi referans sayısı sıfır olmayacağı için otomatik olarak serbest bırakılmayacaktır. Böylece
Python çöp toplayıcısı çağrılana kadar, liste nesnesinin kullandığı belleğin tutulmasına sebep olacaktır.
Kod:
# liste oluşturma
liste = []
[Link]( 10 )
[Link]( 20 )
Oluşturulan liste için referans sayısı ikidir. Ancak nesne silindiği için artık Python içinden ulaşılamaz
ve tekrar kullanılamayacağı için çöp olarak kabul edilir.
Kod:
import gc
print(gc.get_threshold())
210
6
Programlama II
Kod Çıktısı:
(700, 10, 10)
Örnek kodda çalıştırılan fonksiyon sonucu elde edilen 700, sistemdeki varsayılan eşik değeridir. Ha-
fızada ayrılan yer sayısı ile serbest bırakma sayısı arasındaki fark 700’den fazla olduğunda, otomatik çöp
toplama işlemi gerçekleştirileceği anlamına gelmektedir.
Kod:
import gc
Kod Çıktısı:
Çöp toplama: 0 nesne için serbest bırakıldı.
Yaşamla İlişkilendir
Günümüzün ileri teknoloji seviyesine sahip rektirir. Bu bilgilerin parçalara ayrılıp sınıflandı-
imalat ortamında rekabetçi olabilmek için par- rılmaları, aralarındaki ilişkilerin belirlenmesi, her
çanın tasarımından çıkartılan bilgiyi kullanarak parçanın kendi bilgisini bağımsız olarak içermesi,
bir otomatik işlem planlama sistemi oluşturmak sistemin diğer parçaları ile iletişim kurabilmesi ve
gereklidir. Özellik modelleme bu konuda Bilgisa- güncellenebilmesi gerekir. Bu durum göz önüne
yar Bütünlüklü Üretim (CIM) sistemleri için bir alındığında özellik-tabanlı modellemenin siste-
anahtar oldu. Özellik tabanlı tanımlama, imalat matik olarak yapılandırılmadığında yetersiz kal-
bilgisinin ve teknolojik bilginin analizini ve ta- dığı görülür. Çünkü o sadece tek tek özellikleri
rifnamesini gerektirir. CAD/CAM sistemlerinin ele alır ve modeller.
kullanım amacı, dizayn ve imalat işlemlerinin çe- Özellik-tabanlı modellemenin nesne-yö-
şitli fonksiyonlarını birleştirmektir. nelimli yaklaşım ile yapılması, son yıllarda tam
Özellik-tabanlı modelleme kullanılarak ya- otomatik işlem planlama sistemlerinin oluştu-
pılan parça modellemesinin, tam otomatik bir rulması için ortaya atılmıştır. Nesne-yönelimli
işlem planlama sisteminde uygulanabilmesi için modelleme, nesneler şeklinde ayrıştırılan bir sis-
belirli bir disiplin içinde yapılandırılması gere- temde bilginin modellenmesini sağlayan bir me-
kir. Çünkü, işlem planlama faaliyeti parça bilgisi, tottur. Bu modelleme tekniğinde, bağımsız ola-
atölye bilgisi, tezgah bilgisi, takım bilgisi, tertibat rak oluşturulan nesneler bir kimlik, bir durum ve
bilgisi, yönetim bilgisi gibi çok geniş bilgiyi ge- bir davranış belirtirler. Buna ek olarak, nesne yö-
211
6
Nesne ve Sınıf
nelimli modelleme; nesnelerin diğer nesnelerden leme sayesinde sistemin her nesnesine diğer nes-
bilgi ve prosedürleri miras alabildiği (kalıtsallık) nelerden bağımsız olarak müdahale edilebilir. Bu
ve her bağımsız nesnenin kendisini aktif kılmak durum nesnelerin güncellenmesine olanak sağlar.
ve uygulamak için gerekli fonksiyonlarının ve Sistemin parçaları olan nesneler arasındaki ileti-
değişkenlerinin tanımlandığı bağımsız nesneler şim ve etkileşim ise “mesajlar” ile yapılır. Siste-
şeklinde bilgi ve prosedürlerinin çerçevelendiği min nesneleri alt sınıf/üst sınıf hiyerarşisi içinde
(kapsülleme) gerçeği tarafından karakterize edilir. kalıtsanarak, bir sınıf şeklinde oluşturulurlar.
Nesne-yönelimli modelleme sistemlerinde,
sistemin parçaları, kendi “bilgilerini (datalar)” ve Kaynak: Çelik, İ., Ünüvar, A., (2004, Ekim),
bu bilgilerin “davranışlarını (metotlar)” içeren, NESNE YÖNELİMLİ YAKLAŞIMLA ÖZEL-
sistem varlıklarına dönüştürülürler. Sistemin bu LİK TABANLI MODELLEME. Mühendis ve
varlıkları nesne olarak adlandırırlar. Her nesne Makina , 45 (537). Retrived from [Link]
kendine ait bilgileri içerir. Her nesnenin kendi [Link]/resimler/dosya_ekler/bd9629fc3ae-
bilgisini diğer nesnelerden bir çerçeve ile ayırması 5e9f_ek.pdf?dergi=67
“kapsülleme” olarak adlandırılmaktadır. Kapsül-
Öğrenme Çıktısı
5 Hafızada yer ayırma ve yer açma işlemlerini açıklayabilme
212
6
Programlama II
Python programlama dili de farklı programlama yaklaşımlarını desteklemesinin yanında nesne yönelimli bir dil
olarak geliştirilmiştir. Python programlama dilindeki OOP, nesneleri ve sınıfları diğer genel programlama dille-
riyle aynı şekilde kullanmaya odaklanan bir programlama yaklaşımı olduğu söylenebilir. Python, geliştiricilerin
kodun yeniden kullanılabilirliğine odaklanan OOP yaklaşımını kullanarak uygulamalar geliştirmelerine olanak
tanımaktadır. Buradaki asıl amaç tekrar kullanılabilir kod yazarak tekrarı önlemektir.
Programlamada kullanılan nesnelerin iki temel özelliği vardır:
• Özellikleri (Attributes)
• Davranışları (Methods)
Bir aracın renk, sunroof, koltuk sayısı gibi nitelikler özelliklerini gösterirken; korna, sürüş, hızlanma, fren gibi
bir bir görevi yerine getiren işlemlere de davranış denmektedir.
Nesne yönelimli programlamada kullanılan belli başlı terimler mevcuttur. Python programlama dilinde de
diğer nesne yönelimli programlama dillerinde de bu terimler kullanılmaktadır.
Bu terimleri sınıf, nesne, metot, kalıtım, kapsülleme ve çok biçimlilik olarak listeleyebiliriz.
Sınıf tanımlamaları class anahtar kelimesi ile başlamaktadır. Sınıfın içindeki ilk metin dizisine docstring adı
verilmektedir. Bu metin, sınıfın kısa bir açıklamasını içermektedir.
Sınıf nesnesi üzerinden sınıfın çeşitli özelliklerine erişilebilmektedir. Bunun yanında, o sınıftan yeni bir nesne
oluşturmak için de kullanılmaktadır. Bu işlem, bir fonksiyon çağırmaya benzemektedir.
Python programlama dilinde, sınıflar içerisinde tanımlı fonksiyonlarından çift altçizgi ile başlayan fonksiyon-
lara özel fonksiyonlar denmektedir. Bir sınıftan yeni bir nesne oluşturulacağı zaman __init__() metodu çağ-
rılmaktadır. Bu metoda, nesne yönelimli programlamada sınıfın kurucu metodu adı verilmektedir. Nesne için
bellekte yer ayrıldığı anda bu metot çağrılmaktadır.
213
6
Nesne ve Sınıf
Kalıtım vasıtasıyla, tüm özelliklerini ve metotlarını türetildiği sınıftan alan ve bunlara yeni özellikler eklenmesine izin
verilen bir alt sınıf oluşturulabilir. Oluşturulan sınıf alt sınıf, kalıtım aldığı sınıf da üst sınıf olarak da adlandırılır.
Kalıtım kullanılarak oluşturulan sınıflarda, üst/ana sınıfın tüm özellikleri alt sınıfa aktarılarak kullanılmasına
izin verilir. İhtiyaç duyulması halinde üst sınıfın metotları geçersiz kılınarak (override) tekrar tanımlanabilir.
Python programlama dilinde bir sınıf birden fazla temel sınıftan türetilebilmektedir. Bu türetilme işlemine
çoklu kalıtım adı verilmektedir. Çoklu kalıtımla türetilen bir sınıf, türetildiği tüm temel sınıfların özelliklerini
miras olarak almaktadır. Çoklu kalıtımın sözdimi de tekli kalıtımda kullanılana benzemektedir.
Ana sınıftan kalıtım ile türetilmiş bir alt sınıf, ana sınıfın tüm özelliklerine ve metotlarına sahip olacaktır. Fakat
kimi durumlarda bu metotların yeni oluşturulan sınıfa özel hale getirilmesi gerekmektedir. Ana sınıftan kalıtım
yoluyla geçen metotlar aynı isimle tekrar tanımlandığında, ana sınıftaki metot geçersiz hale gelecektir. Bu işleme
ezme, geçersiz kılma adı verilmektedir.
Temel işlem operatörleri, farklı türler için farklı şekilde davranış sergilemektedir. “+” operatörü kullanılan bir
işlemde, yorumlayıcı arka planda __add__ metodunu otomatik olarak çağırmaktadır. Bu metot üzerinde ih-
tiyaca göre değişiklik yapılabilir. Aynı operatörün işlem yapılan türlere göre farklı davranışlar göstermesine
operatörlerin aşırı yüklenmesi denmektedir
Nesne yönelimli programlamada verilerin kod içerisinde gizlenmesi için kullanılan bir yöntemdir. Nesne bü-
tünlüğü korunarak, sınıfın üyelerine sınırlı bir erişim verilir. Veri gizlemede, sınıf dışından verilere, metot ve
özelliklere doğrudan erişim kısıtlanarak tek bir birim altında toplanmaktadır.
Veri gizleme, bilgi gizleme ya da veri kapsülleme olarak da isimlendirilmektedir. Ayrıca veri kapsülleme uygu-
lama detaylarını kullanıcılardan gizlemek için de kullanılır. Sınıf içerisindeki bir özellik özel “private” olarak
belirtildiğinde, sadece o sınıf içerisinden erişilebilir, sınıf dışından erişilemez.
Python programlama dilinde bellek ayırma ve ayrılan belleği serbest bırakma/temizleme işlemleri otomatik
olarak yapılmaktadır. C ve C++ gibi dillerindeki gibi belleğin ayrılması ve serbest bırakılması işlemlerinin prog-
ramcı tarafından yapılmasına gerek kalmamaktadır.
Python programlama dili, arka planda geliştiriciler için bir dizi düşük seviyeli ayrıntıyı işleyen yüksek seviyeli
bir dildir. Böylece kod geliştiricilerin üretkenlikleri de artmaktadır. Python kodu içerisinde çöp toplayıcı prog-
ramcı tarafından da çağrılabilir. Fakat genel bir kural olarak arka planda gerçekleştirilen işlemlere manuel bir
müdahalede bulunmak gereksizdir ve tavsiye edilmez.
214
6
Programlama II
neler öğrendik?
A. Nesne
B. Sınıf
C. Kalıtım
D. Metot
E. Dictionary
2 Sınıfın içerisinde tanımlanmaktadır. Bir nesnenin davranışlarını tanımlamak için kullanılırlar. Para-
metre alabilir, geri değer döndürebilir ve sadece çağrıldığında çalışan kod bloklarıdır.
Python programalama dili için, yukarıda verilen tanıma karşılık gelen kavram aşağıdakilerden hangisidir?
A. Nesne
B. Sınıf
C. Kalıtım
D. Metot
E. Kalıtım
215
6
Nesne ve Sınıf
5
class Personel:
"Personel tanımlarının yapıldığı sınıf"
neler öğrendik?
def selam(self):
print('Aramıza hoş geldiniz!', [Link])
Hamdi = Personel()
[Link] = "Satınalma"
print( [Link] )
Yukarıda verilen örnek Python kodunun çıktısı, aşağıdaki seçeneklerden hangisi olabilir?
A. Aramıza hoş geldiniz! Bilgi İşlem
B. Aramıza hoş geldiniz! Satınalma
C. Aramıza hoş geldiniz!
D. <bound method [Link] of <__main__.Personel object at 0x03D8D6F0>>
E. Kod hatalı, çalışmaz
6
class Araç:
Yukarıda verilen örnek Python kodunda boş bırakılan yerlere sırasıyla aşağıdaki şıklardan hangisi gelmelidir?
A. __init__, Otobüs, okul_servisi
B. __init__, Araç, okul_servisi
C. self, Otobüs, Araç
D. Araç, Otobüs, okul_servisi
E. class, Araç, okul_servisi
216
6
Programlama II
neler öğrendik?
python programlama dili için yukarıda verilen maddelerden hangisi ya da hangileri yanlıştır?
A. Yalnız I
B. Yalnız II
C. Yalnız III
D. I ve II
E. II ve III
8
def __add__(self, nesne):
return [Link]ğer + 2 * [Link]ğer
Yukarıda verilen Python kod parçası ile ilgili aşağıdakilerden hangisi doğrudur?
A. Verilen iki değerin toplamını döndürür
B. Toplama operatörünün nesneler için aşırı yüklenmiş halidir
C. Verilen değerin iki katını döndürür
D. Nesnelerin çarpım sonucunu döndürür
E. Hatalı bir kod parçasıdır
9 Nesne yönelimli programlamada verilerin kod içerisinde korunması için kullanılan bir yöntemdir.
Nesne bütünlüğü korunarak, sınıfın üyelerine sınırlı bir erişim verilir. Böylece, sınıf dışından verilere,
metot ve özelliklere doğrudan erişim kısıtlanarak tek bir birim altında toplanmaktadır.
Python programalama dilindeki nesne yönelimli programlamada, yukarıda verilen tanıma karşılık gelen
kavram aşağıdakilerden hangisidir?
A. Veri gizleme
B. Kalıtım
C. Üzerine yazma
D. Çok biçimlilik
E. Sınıf
217
6
Nesne ve Sınıf
Araştır Yanıt
6 Anahtarı
Araştır 1
Nesne tabanlı programlama dilleri 1980’li yıllarda C++ ile ortaya çıkmıştır. Nesneye yönelik prog-
ramlama, programcının kendi sınıfını ve nesnesini oluşturup üzerinde işlemler yapmasını sağlar.
Günümüzde yazılımcılar nesneye yönelik olan ve Visual özellikler içeren sürümleri kullanmaktadır.
Visual C++, C++ Builder, Delphi, Java, Visual Basic vb. gibi örnekler sayılabilir.
• Python
• C++
• Objective-C
• Delphi
• Smalltalk
• Java
• Swift
• C#
• Perl
• Ruby
• PHP
218
6
Programlama II
Araştır Yanıt
6 Anahtarı
Araştır 2
class TemelSınıf:
'''kişi bilgilerinin tutulduğu sınıftır'''
def __init__(self, isim, soyisim, yaş):
[Link] = isim
[Link] = soyisim
[Link]ş = yaş
def özellikler(self):
print(self.__dict__)
Kod Çıktısı:
{'isim': 'Mustafa', 'soyisim': 'Neccarzade', 'yaş': 24}
Araştır 3
class Not:
def __init__(self, not1, not2, not3):
self.not1 = not1
self.not2 = not2
self.not3 = not3
def ortalama(self):
return float(self.not1 + self.not2 + self.not3) / 3
print(not_1 == not_2)
Kod Çıktısı:
False
219
6
Nesne ve Sınıf
Araştır Yanıt
6 Anahtarı
Araştır 4
class Çalışan:
__isim = ''
__maaş = 0
__pozisyon = ''
# constructor
def __init__(self, isim, maaş, pozisyon):
# data members
self.__isim = isim
self.__maaş = maaş
self.__pozisyon = pozisyon
Kod Çıktısı:
İsim: Haktan Maaş: 8700
Haktan nin görevi Destek Personeli
220
6
Programlama II
Araştır Yanıt
6 Anahtarı
Araştır 5
import gc
i = 0
collected = [Link]()
Kod Çıktısı:
Garbage collector: 0 nesne hafızadan kaldırıldı.
Veri oluşturuluyor...
{1: {...}}
{2: {...}}
{3: {...}}
{4: {...}}
{5: {...}}
{6: {...}}
{7: {...}}
{8: {...}}
{9: {...}}
{10: {...}}
Garbage collector: 10 nesne hafızadan kaldırıldı.
221
6
Nesne ve Sınıf
Kaynakça
Ansari, A., (2021, Ağustos 24), Garbage Collection Python Object Oriented Programming, (2022,
in Python, (2022, Nisan 6). [Link] Mart 28). [Link]
[Link]/garbage-collection-python. programming/object-oriented-programming.
Campbell, S., (2022), Python OOPs: Class, Object, Sharma, R., (2021, Şubat 5), Data Hiding In Python:
Inheritance and Constructor with Example, (2022, What is, Advantages & Disadvantages [With
Nisan 1). [Link] Coding Example], (2022, Nisan 5). [Link]
objects-object-oriented-programming-oop-s. [Link]/blog/data-hiding-in-python.
html.
Tek, M., (2020, Mayıs 21), Python ile Nesne Tabanlı
Demir, V., (2018, Ağustos 29),Python Sınıfları, (2022, Programlama(Object Oriented Programming),
Nisan 3). [Link] (2022, Mart 25). [Link]
pyClasses. python-ile-nesne-tabanl%C4%B1-programlama-
object-oriented-programming-232134543e7f .
Demirarslan, Ö., (2020, Şubat 17) OOP’ta __init__
ve self Kavramları Nedir?, (2020, Şubat 17). Uzun, E., Nesne Yönelimli Programlama – Python,
[Link] (2022, Nisan 2). [Link]
ve-self-kavramlari-nedir. python/12-nesne-yonelimli-programlama-
python.
Eliçalışkan, M., (2021), Python Sınıflar/Nesneler,
(2022, Mart 26). [Link] Waseem, M., (2021, Temmuz 15), Inheritance In
[Link]. Python With Examples: All You Need To Know,
(2022, Nisan 6). [Link]
Python - Object Oriented, (2022, Mart 27). https://
inheritance-in-python.
[Link]/python/python_classes_
[Link].
222
Bölüm 7
Python ile MySQL Veritabanı İşlemleri
öğrenme çıktıları
1 2
Python - MySQL Başlarken Veritabanı Komutları
1 Veritabanı kurulumu, veritabanı ve tablo 2 Veritabanı ile ilgili komutları ve kod
oluşturma işlemlerini kavrayabilme içerisinde kullanımını kavrayabilme
Anahtar Sözcükler: • Veritabanı • Database • Bağlantı • MySQL • Tablo • Komut • Insert • Select • Join
• Where
224
7
Programlama II
GİRİŞ
Günümüzde teknolojinin uğradığı tüm noktalarda veritabanları ile çalışılmaktadır. Yazılım projeleri-
nin de büyük bir kısmında veritabanlarından yararlanılmaktadır. Veritabanları, sahip olduğumuz verilerin
düzenli bir şekilde tasnif edilerek depolandığı ve ihtiyaç duyulduğunda çeşitli sorgular vasıtasıyla bize geri
veren yapılardır. Ayrıca bu veriler üzerinde güncellemelerin yapıldığı, yenilerinin eklendiği, gerektiğinde
silindiği yapılardır.
Bir yazılım hazırlarken kullanılabilecek çok çeşitli veritabanları bulunmaktadır. Veritabanı, uygula-
mada kullanılacak amaca, bütçeye, çalışacağı ortama kısacası ihtiyaca göre seçilebilir. Oracle, MySQL,
MsSQL, PostgreSQL, SQLite çok kullanılan veritabanı uygulamalarına örnek olarak verilebilir. Bu bö-
lümde MySQL veritabanı kullanılacak ve örnekler bu veritabanı kullanılarak verilecektir.
Python geliştirme ortamı olarak Thonny editörünü kullanıyorsanız, Araçlar menüsü altında “Paketleri
Yönet” menüsünü girerek, arama kutucuğuna “mysql connector” yazarak aratabilirsiniz. Ardından gelen
sonuçlar içinden mysql-connector paketini seçerek yükleyebilirsiniz.
MySQL sürücüsünün doğru bir şekilde kurulduğu da şu kod ile kontrol edilebilir.
Kod:
import [Link]
Kod çalıştırıldığında bir hata alınmıyorsa, kurulum başarılı bir şekilde gerçekleşmiş ve MySQL sürü-
cüsü bilgisayarınıza yüklenmiş demektir. Herhangi bir hata ile karşılaşırsanız, kurulumun doğru konuma
ve ortama yapıldığından emin olun.
225
7
Python ile MySQL Veritabanı İşlemleri
1 2
[Link]() Connection request
M
MySQL 3 Y
Python 4 [Link]() connected
Connector S
Application Python Q
5 [Link]() result data 6 L
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="veritabanı_adı"
)
print( veritabani )
Kod Çıktısı:
<[Link] object at 0x03D665D0>
Başarılı bir bağlantı sonucunda kod çıktısına benzer bir çıktı elde edilecektir. Burada veritabanının
mevcut olduğuna dikkat edilmelidir, aksi takdirde hata oluşacaktır. Herhangi bir veritabanı oluşturulma-
dıysa bu satır kaldırılarak da kod çalıştırlabilir.
Veritabanı Oluşturma
MySQL veritabanında kod yazarken kullanılacak bir veritabanı oluşturmak için “CREATE DATA-
BASE” komutu çalıştırılması gerekmektedir. Her adımda üzerinde farklı işlemler yapmak için “Personel”
isimli bir veritabanı oluşturalım.
226
7
Programlama II
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi"
)
cursor = [Link]()
[Link]("CREATE DATABASE personel")
dikkat
Örnek kod çalıştığında herhangi bir hata alınmadıysa, Örnek kodlardaki kullanıcı_adı ve kurulum_şif-
veritabanı başarılı bir şekilde oluşturulmuş demektir. Sis- resi yazılan yerlere, MySQL kurulumu yapılır-
temde oluşturulmuş veritabanlarını da listelenerek yeni ve- ken girilen kullanıcı adı ve şifre bilgilerinizi gir-
ritabanının oluşturulup oluşturulmadığı kontrol edilebilir. melisiniz.
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi"
)
cursor = [Link]()
[Link]("SHOW DATABASES")
for vt in cursor:
print( vt )
Kod Çıktısı:
('information_schema',)
('mydatabase',)
('mysql',)
('performance_schema',)
('personel',)
('sys',)
Tablo Oluşturma
Python ile tablo oluşturmak için, sql komutlarını metin şeklinde yazarak, execute() metoduna paramet-
re olarak gönderilerek çalıştırılması yeterli olmaktadır. Tablo oluşturmak için kullanılacak sql komutlarını
şu şekilde hazırlayabiliriz:
227
7
Python ile MySQL Veritabanı İşlemleri
CREATE TABLE
(
sutun_adı_1 sutun_veri_tipi,
sutun_adı_2 sutun_veri_tipi,
....
sutun_adı_n sutun_veri_tipi,
) ;
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
# tablo oluşturma
calisanTablosu = """CREATE TABLE calisan (
isim VARCHAR(30) NOT NULL,
soyisim VARCHAR(30),
birim VARCHAR(50),
pozisyon INT,
dogum_tarihi DATETIME
)"""
# tablo oluşturuldu
[Link](calisanTablosu)
Örnek kodda, “personel” veritabanı içerisinde, isim, soyisim, birim, pozisyon ve doğum tarihi bilgi-
lerini tutabilecek alanları olan, “calisan” isimli bir tablo oluşturuldu. Kod herhangi bir hata vermeden
çalıştığında, tablonun başarı ile oluşturulduğu söylenebilir. Oluşturulan tabloyu kontrol etmek için, veri-
tabanındaki tüm tabloları listelemeye yarayan “SHOW TABLES” komutu kullanılabilir.
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
228
7
Programlama II
cursor = [Link]()
[Link]("SHOW TABLES")
Kod Çıktısı:
('calisan',)
Veritabanında şu an sadece “calisan” tablosu oluşturulduğu için, karşımıza tek bir sonuç çıkmaktadır.
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
# tablo oluşturma
calisanTablosu = """CREATE TABLE calisan (
id INT AUTO_INCREMENT PRIMARY KEY,
isim VARCHAR(30) NOT NULL,
soyisim VARCHAR(30),
birim VARCHAR(50),
pozisyon INT,
dogum_tarihi DATETIME
)"""
# tablo oluşturuldu
[Link](calisanTablosu)
Eğer tablo zaten oluşturulmuş ise, tabloya yeni bir sütun ilave etmek için ALTER TABLE komutu
kullanılır.
229
7
Python ile MySQL Veritabanı İşlemleri
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
# tablo oluşturuldu
[Link]("ALTER TABLE calisan ADD COLUMN id INT AUTO_INCREMENT PRIMARY
KEY")
Öğrenme Çıktısı
1 Veritabanı kurulumu, veritabanı ve tablo oluşturma işlemlerini kavrayabilme
VERİTABANI KOMUTLARI
MySQL veritabanı ilişkisel veritabanı yönetim sistemidir (RDBMS). Yapılandırılmış sorgu dili yani sql
kullanarak veriler üzerinde işlem yapılmasını sağlar. Veri oluşturma, ekleme, güncelleme ve silme işlem-
lerini desteklemektedir. Sql komutları büyük-küçük harfe duyarlı değildir. Yani SELECT ve select aynı
komuta karşılık gelmektedir.
Insert Komutu
Veritabanındaki tablolara tekli veya çoklu veri kaydı yapılabilir. Veri girişi yapabilmek için insert ko-
mutu kullanılmaktadır.
Söz Dizimi:
INSERT INTO tablo_adı ( sütun1, sütun2, sütun3, ... ) VALUES ( değer1, değer2,
değer3, ... );
230
7
Programlama II
Tek bir kayıt eklemek için bu şekilde kullanılabilir. Çoklu veri girişi için de aynı komut kullanılabilir.
Söz Dizimi:
INSERT INTO tablo_adı ( sütun1, sütun2, sütun3, ... ) VALUES
( değer1, değer2, değer3, ... ),
( değer1, değer2, değer3, ... ),
( değer1, değer2, değer3, ... ),
( değer1, değer2, değer3, ... ),
…
( değer1, değer2, değer3, ... );
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
sql = "INSERT INTO calisan(isim, soyisim, birim) VALUES (%s, %s, %s)"
val = ("Abdullah", "Birisi", "Döner Sermaye")
[Link](sql, val)
[Link]()
Kod Çıktısı:
1 kayıt girildi
Çoklu kayıt girişinde de benzer şekilde veriler oluşturulmakta ve “execute” metodu, “executemany” ile
değiştirilmektedir.
231
7
Python ile MySQL Veritabanı İşlemleri
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
sql = "INSERT INTO calisan(isim, soyisim, birim) VALUES (%s, %s, %s)"
val = [ ("SONER", "YİĞİTER", "İnsan Kaynakları" ),
("NURAY", "ÜNSAL", "İnsan Kaynakları" ),
("SENEM", "YAĞIZ", "İnsan Kaynakları" ),
("BURAK", "GEZER", "Muhasebe" ),
("LEYLA", "CANLI", "Muhasebe" ),
("BERAT", "KESKİN", "Satınalma" ),
("TANER", "TUNÇER", "Satınalma" ),
("SEDAT", "BABAN", "Bilgi İşlem" ),
("ŞAZİYE", "YILDIZ", "Bilgi İşlem" ),
("KEVSER", "URUÇ", "Ulaştırma" ),
("YEMLİHA", "ERTUĞRUL", "Ulaştırma" ),
("EMRE", "TUT", "Ulaştırma" ),
("BETÜL", "KORUM", "Kurumsal İletişim" ),
("NASIR", "ALBAYRAK", "Kurumsal İletişim" ),
("MUSTAFA", "CİN", "Kurumsal İletişim" ) ]
[Link](sql, val)
[Link]()
Kod Çıktısı:
15 kayıt girildi
Select Komutu
Şimdiye kadar, veritabanı oluşturma ve veri girişi ile veritabanının inşası üzerine işlemler gerçekleştiril-
di. Bu bölümde SELECT komutu ile, tablolara girilen verileri okuma işlemi gerçekleştirilecektir.
Diğer veritabanı komutlarının işlenmesi gibi, [Link]() kullanılarak komut çalıştırılacak ve cur-
[Link]() ile tablodan alınan veriler bir liste şeklinde döndürülecektir.
Söz Dizimi:
SELECT sütun_adı1, sütun_adı2, sütun_adı3, ... FROM tablo_adı
232
7
Programlama II
veya tüm sütunların seçilmesi için joker karakteri olarak “*” karakteri kullanılmaktadır.
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
# cursor nesnesi oluşturma
cursor = [Link]()
sql = "SELECT * FROM calisan"
cursor .execute( sql )
sonucListe = [Link]()
Kod Çıktısı:
('Abdullah', 'Birisi', 'Döner Sermaye', None, None, 1)
('SONER', 'YİĞİTER', 'İnsan Kaynakları', None, None, 2)
('NURAY', 'ÜNSAL', 'İnsan Kaynakları', None, None, 3)
('SENEM', 'YAĞIZ', 'İnsan Kaynakları', None, None, 4)
('BURAK', 'GEZER', 'Muhasebe', None, None, 5)
('LEYLA', 'CANLI', 'Muhasebe', None, None, 6)
('BERAT', 'KESKİN', 'Satınalma', None, None, 7)
('TANER', 'TUNÇER', 'Satınalma', None, None, 8)
('SEDAT', 'BABAN', 'Bilgi İşlem', None, None, 9)
('ŞAZİYE', 'YILDIZ', 'Bilgi İşlem', None, None, 10)
('KEVSER', 'URUÇ', 'Ulaştırma', None, None, 11)
('YEMLİHA', 'ERTUĞRUL', 'Ulaştırma', None, None, 12)
('EMRE', 'TUT', 'Ulaştırma', None, None, 13)
('BETÜL', 'KORUM', 'Medya İletişim', None, None, 14)
('NASIR', 'ALBAYRAK', 'Medya İletişim', None, None, 15)
('MUSTAFA', 'CİN', 'Medya İletişim', None, None, 16)
Aynı sorguyu sadece isimler ve kayıt numaraları için düzenleyerek kod çıktısını inceleyelim.
Kod:
sql = "SELECT id, isim, soyisim FROM calisan"
Kod Çıktısı:
(1, 'Abdullah', 'Birisi')
(2, 'SONER', 'YİĞİTER')
(3, 'NURAY', 'ÜNSAL')
233
7
Python ile MySQL Veritabanı İşlemleri
Dikkat edilirse, SELECT komutunda tablodaki sıradan bağımsız şekilde istenildiği gibi bir listeleme
yapılabilmektedir.
Ayrıca [Link]() metodu ile sorgu sonucunda gelen ilk satırın verisi alınabilir.
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
# cursor nesnesi oluşturma
cursor = [Link]()
sql = "SELECT * FROM calisan"
cursor .execute( sql )
sonuc = [Link]()
print( sonuc )
Kod Çıktısı:
(1, 'Abdullah', 'Birisi')
Where Komutu
Veritabanındaki tablolardan veri çekerken kimi zaman bir filtreye ihtiyaç duyulur. Böylece sorgu so-
nucu dönecek veri setinin boyutu küçülerek aranan verinin daha hızlı bulunması sağlanmaktadır. Ayrıca
filtreleme, veri güncellemesi ve verilerin silinmesi işlemlerinde de kullanılmaktadır.
Veritabanı sorgusunda “WHERE” komutu kullanılarak sorgu yapılmaktadır.
Söz Dizimi:
SELECT sütun_adı1, sütun_adı2, sütun_adı3, ... FROM tablo_adı
WHERE sütun_adı1 = değer
234
7
Programlama II
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
# cursor nesnesi oluşturma
cursor = [Link]()
sql = "SELECT id, isim, soyisim FROM calisan WHERE birim = 'Bilgi İşlem'"
[Link]( sql )
sonucListe = [Link]()
Kod Çıktısı:
(9, 'SEDAT', 'BABAN')
(10, 'ŞAZİYE', 'YILDIZ')
Örnek kodda, birimi bilgi işlem olan tüm personelin listesi tablodan bulunmak istenmiştir.
Ayrıca, filtreleme yaparken, aranmak istenen ifade kayıtların başında, içinde veya sonunda olabilir.
Böyle durumlar için de joker karakteri olarak “%” sembolü kullanılmaktadır.
• “%” karakteri aranan ifadenin sadece başına konulduğunda, ifadeden önce ne gelirse gelsin ama bu
ifade ile bitsin anlamına gelmektedir.
• “%” karakteri aranan ifadenin sadece sonuna konulduğunda, ifadeden sonra ne gelirse gelsin ama
bu ifade ile başlasın anlamına gelmektedir.
• “%” karakteri aranan ifadenin hem başına hem de sonuna konulduğunda, ifadeden önce ve sonra
ne gelirse gelsin ama bu ifadeyi içersin anlamına gelmektedir.
Bu gibi bir sorgu yapıldığında artık “=” karşılaştırması yerine, bu filtreye benzer olanları getir diyerek
“LIKE” komutu kullanılmaktadır.
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
# cursor nesnesi oluşturma
cursor = [Link]()
235
7
Python ile MySQL Veritabanı İşlemleri
sql = "SELECT id, isim, soyisim FROM calisan WHERE birim LIKE '%ma%'"
[Link]( sql )
sonucListe = [Link]()
Kod Çıktısı:
(1, 'Abdullah', 'Birisi', 'Döner Sermaye')
(7, 'BERAT', 'KESKİN', 'Satınalma')
(8, 'TANER', 'TUNÇER', 'Satınalma')
(11, 'KEVSER', 'URUÇ', 'Ulaştırma')
(12, 'YEMLİHA', 'ERTUĞRUL', 'Ulaştırma')
(13, 'EMRE', 'TUT', 'Ulaştırma')
Örnek kodda, birim verisinin içinde “ma” geçen kayıtların listesi istenmiş ve gösterilmiştir.
Sorgulama sonucu, kullanıcıdan alınan bir değere bağlı ise, bu değerin zararlı hale gelmesi engellenme-
lidir. SQL Injection denilen kavram, yaygın bir web korsanlığı türüdür ve gerekli önlemlerin alınmadığı
durumlarda, veri kaybı, kullanıcı ele geçirme gibi can sıkıcı sonuçlara neden olabilir.
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
# cursor nesnesi oluşturma
cursor = [Link]()
sql = "SELECT id, isim, soyisim, birim FROM calisan WHERE isim LIKE %s "
arama = ("%ER%",)
[Link]( sql, arama )
sonucListe = [Link]()
Kod Çıktısı:
(2, 'SONER', 'YİĞİTER', 'İnsan Kaynakları')
(7, 'BERAT', 'KESKİN', 'Satınalma')
(8, 'TANER', 'TUNÇER', 'Satınalma')
(11, 'KEVSER', 'URUÇ', 'Ulaştırma')
Örnek kodda, SQL Injection işlemini engellemek amacıyla sorgu ve parametre değerlerini ayrırarak
sorgu yapılmıştır. İsim verileri içerisinden “ER” harfleri bulunan personelin listesi aranmış ve sonuç yaz-
dırılmıştır.
236
7
Programlama II
Order By Komutu
Tablo verilerinde istenilen filtreleme sonucunu, istenilen sütuna göre artan veya azalan düzende sırala-
ma yapmak için ORDER BY ifadesi kullanılmaktadır. ORDER BY ifadesi, varsayılan değer olarak ASC
(ASCENDING) artan şekilde sıralamaktadır. Sonucun azalan şekilde sıralanması için de DESC (DES-
CENDING) anahtar sözcüğü kullanılmaktadır.
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
# cursor nesnesi oluşturma
cursor = [Link]()
sql = "SELECT id, isim, soyisim, birim FROM calisan ORDER BY soyisim "
[Link]( sql )
sonucListe = [Link]()
Kod Çıktısı:
(15, 'NASIR', 'ALBAYRAK', 'Medya İletişim')
(9, 'SEDAT', 'BABAN', 'Bilgi İşlem')
(1, 'Abdullah', 'Birisi', 'Döner Sermaye')
(6, 'LEYLA', 'CANLI', 'Muhasebe')
(16, 'MUSTAFA', 'CİN', 'Medya İletişim')
(12, 'YEMLİHA', 'ERTUĞRUL', 'Ulaştırma')
(5, 'BURAK', 'GEZER', 'Muhasebe')
(7, 'BERAT', 'KESKİN', 'Satınalma')
(14, 'BETÜL', 'KORUM', 'Medya İletişim')
(8, 'TANER', 'TUNÇER', 'Satınalma')
(13, 'EMRE', 'TUT', 'Ulaştırma')
(11, 'KEVSER', 'URUÇ', 'Ulaştırma')
(3, 'NURAY', 'ÜNSAL', 'İnsan Kaynakları')
(4, 'SENEM', 'YAĞIZ', 'İnsan Kaynakları')
(10, 'ŞAZİYE', 'YILDIZ', 'Bilgi İşlem')
(2, 'SONER', 'YİĞİTER', 'İnsan Kaynakları')
Örnek kodda görüldüğü gibi, gelen liste soyisme göre artan şekilde sıralanmıştır. DESC anahtar sözcü-
ğünün kullanıldığı bir örnek kod inceleyelim.
237
7
Python ile MySQL Veritabanı İşlemleri
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
# cursor nesnesi oluşturma
cursor = [Link]()
sql = "SELECT id, isim, soyisim, birim FROM calisan ORDER BY id DESC"
[Link]( sql )
sonucListe = [Link]()
Kod Çıktısı:
(16, 'MUSTAFA', 'CİN', 'Medya İletişim')
(15, 'NASIR', 'ALBAYRAK', 'Medya İletişim')
(14, 'BETÜL', 'KORUM', 'Medya İletişim')
(13, 'EMRE', 'TUT', 'Ulaştırma')
(12, 'YEMLİHA', 'ERTUĞRUL', 'Ulaştırma')
(11, 'KEVSER', 'URUÇ', 'Ulaştırma')
(10, 'ŞAZİYE', 'YILDIZ', 'Bilgi İşlem')
(9, 'SEDAT', 'BABAN', 'Bilgi İşlem')
(8, 'TANER', 'TUNÇER', 'Satınalma')
(7, 'BERAT', 'KESKİN', 'Satınalma')
(6, 'LEYLA', 'CANLI', 'Muhasebe')
(5, 'BURAK', 'GEZER', 'Muhasebe')
(4, 'SENEM', 'YAĞIZ', 'İnsan Kaynakları')
(3, 'NURAY', 'ÜNSAL', 'İnsan Kaynakları')
(2, 'SONER', 'YİĞİTER', 'İnsan Kaynakları')
(1, 'Abdullah', 'Birisi', 'Döner Sermaye')
Örnek kodda, liste id, yani kayıt numarası bilgilerine göre DESC ifadesi ile büyükten küçüğe doğru
sıralanmıştır.
Delete Komutu
dikkat
Tablodan herhangi bir verinin silinmesi için DELETE Tablodaki veriler üzerinde silme veya güncelle-
komutu kullanılmaktadır. Bu komut kullanıldığında sili- me işlemi yapılmadan önce, işlem yapılacak ve-
nen veriyi geri getirmek mümkün olmadığı için dikkatli riyi SELECT ile listelemek tavsiye edilmektedir.
kullanılmalıdır. Böylece hatalı bir sonuç varsa, sorguyu düzenle-
me fırsatı olacaktır.
238
7
Programlama II
Söz Dizimi:
DELETE FROM tablo_adı WHERE koşul
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
cursor = [Link]()
[Link]()
Kod Çıktısı:
1 kayıt silindi
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
cursor = [Link]()
[Link]()
239
7
Python ile MySQL Veritabanı İşlemleri
Kod Çıktısı:
2 kayıt silindi
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
cursor = [Link]()
Örnek kod başarı ile çalıştırıldığı zaman herhangi bir hata uyarısı görüntülenmeyecektir. Olmayan bir
tablo silinmeye çalışıldığında da hata alınacaktır. Böyle bir durumun önüne geçebilmek için IF EXIST
anahtar kelimesi kullanılmaktadır.
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
cursor = [Link]()
Kod hatasız bir şekilde çalıştırıldıysa, tablo başarılı bir şekilde silinmiş demektir.
240
7
Programlama II
Update Komutu
UPDATE yani güncelleme komutu, veritabanında kayıtlı verilerin değerlerini değiştirmek için kulla-
nılmaktadır. Güncelleme ile hatalı veriler düzeltilebilir veya son işlem tarihi gibi değişen veriler güncelle-
nebilir. Bu komut sadece veriler üzerinde etkilidir, tablonun yapısı ile ilgili bir değişiklik yapmaz. Sağladığı
en büyük avantaj ise tabloda sürekli güncel ve doğru verilerin tutulmasına yardımcı olmasıdır.
Söz Dizimi:
UPDATE tablo_adı SET sütun_adı = "yeni_değer"
WHERE koşul
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
cursor = [Link]()
[Link]()
Kod Çıktısı:
dikkat
1 kayıt güncellendi
[Link]() metodu çağırılmadan
Diğer komutlarda olduğu gibi, veritabanını bozarak kulla- tablo üzerinde yapılan işlemler veritabanın-
nılamayacak hale getiren SQL Injection saldırısından korun- da güncellenmeyecektir. Ayrıca WHERE
mak için, UPDATE komutunun aldığı koşul ve güncellene- şartının eklenmediği bir UPDATE komutu
cek değerler için %s yer tutucusu kullanılmalıdır. ile tablodaki tüm veriler güncellenecektir.
Kod 1:
sql = "UPDATE calisan SET dogum_tarihi = '2000-04-17' WHERE id = 3"
[Link]( sql )
Kod 2:
sql = "UPDATE calisan SET dogum_tarihi = %s WHERE id = %s"
veri = ("2000-04-17", "3")
[Link]( sql )
Kod 3:
sonuc = [Link]( "UPDATE calisan SET dogum_tarihi = %s WHERE id = %s",
("2000-04-17", "3") )
Örnek kod 1, kod 2 ve kod 3 farklı şekillerde aynı işlemleri yapmaktadır. Sadece UPDATE komutu
için değil, diğer komutlar için de istenildiği şekilde kullanılabilir.
241
7
Python ile MySQL Veritabanı İşlemleri
Limit Komutu
LIMIT komutu, çalıştırılan sorgudan dönen sonuç kümesindeki verilerin sayısını kontrol etmek veya
sınırlandırmak için kullanılmaktadır. Varsayılan olarak ilk kayıttan itibaren verilen limit değeri kadar veri
getirmektedir. Ayrıca OFFSET anahtar kelimesi ile, özel aralıkların da alınabilmesi sağlanmaktadır.
Söz Dizimi:
SELECT * FROM tablo_adı LIMIT limit;
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
cursor = [Link]()
sql = "SELECT id, isim, soyisim, birim FROM calisan LIMIT 3"
cursor .execute( sql )
sonucListe = [Link]()
Kod Çıktısı:
(1, 'Abdullah', 'Birisi', 'Döner Sermaye')
(2, 'SONER', 'YİĞİTER', 'İnsan Kaynakları')
(3, 'NURAY', 'ÜNSAL', 'İnsan Kaynakları')
Kod:
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
cursor = [Link]()
sql = "SELECT id, isim, soyisim, birim FROM calisan LIMIT 5 OFFSET 3"
cursor .execute( sql )
sonucListe = [Link]()
Kod Çıktısı:
1
(4, 'SENEM', 'YAĞIZ', 'İnsan Kaynakları')
(8, 'TANER', 'TUNÇER', 'Satınalma') 2
(9, 'SEDAT', 'BABAN', 'Bilgi İşlem')
3
(10, 'ŞAZİYE', 'YILDIZ', 'Bilgi İşlem') OFFSET 3
(11, 'KEVSER', 'URUÇ', 'Ulaştırma') 4
8
Join Komutu
JOIN komutu ile iki veya daha fazla tablonun verileri, 9
aralarındaki ilişkili sütunlara göre birleştirilir. 3 çeşit tablo
...
birleştirmesi bulunmaktadır.
Şekil 7.2 Limit ve Offset Kullanımı.
Inner Join: Join ve Inner Join komutları aynı şekilde çalışmaktadır. Tabloların kesişim elemanlarını
döndürür.
Söz Dizimi:
SELECT sütun1, sütun2,...
FROM tablo1
JOIN tablo2 ON koşul;
veya
Left Join: Tablo2 ile ortak olmayan verileri hariç tutarak, Tablo1’deki verileri döndürmektedir.
Söz Dizimi:
SELECT sütun1, sütun2,...
FROM tablo1
LEFT JOIN tablo2 ON koşul;
243
7
Python ile MySQL Veritabanı İşlemleri
Right Join: Tablo1 ile ortak olmayan verileri hariç tutarak, Tablo2’deki verileri döndürmektedir.
Söz Dizimi:
SELECT sütun1, sütun2,...
FROM tablo1
RIGHT JOIN tablo2 ON koşul;
İki farklı içerikli tabloyu birleştirmek için örnek tablo verileri üzerinden işlem yapacağız. Kullanıcı
tablosundaki favori alanı ile ürün tablosundaki id alanı üzerinden eşleştirme yapılacaktır.
kullanici
{"id": 1,"isim": "Abdullah","soyisim": "Birisi","birim": "Döner Sermaye","favori": 1},
{"id": 2,"isim": "SONER","soyisim": "YİĞİTER","birim": "İnsan Kaynakları","favori": 2},
{"id": 3,"isim": "NURAY","soyisim": "ÜNSAL","birim": "İnsan Kaynakları","favori": 3},
{"id": 4,"isim": "SENEM","soyisim": "YAĞIZ","birim": "İnsan Kaynakları","favori": 4},
{"id": 8,"isim": "TANER","soyisim": "TUNÇER","birim": "Satınalma","favori": 4},
{"id": 9,"isim": "SEDAT","soyisim": "BABAN","birim": "Bilgi İşlem","favori": 3},
{"id": 10,"isim": "ŞAZİYE","soyisim": "YILDIZ","birim": "Bilgi İşlem","favori": 2},
{"id": 11,"isim": "KEVSER","soyisim": "URUÇ","birim": "Ulaştırma","favori": 1},
{"id": 12,"isim": "YEMLİHA","soyisim": "ERTUĞRUL","birim": "Ulaştırma","favori": null},
{"id": 13,"isim": "EMRE","soyisim": "TUT","birim": "Ulaştırma","favori": null},
{"id": 14,"isim": "BETÜL","soyisim": "KORUM","birim": "Medya İletişim","favori": null},
{"id": 15,"isim": "NASIR","soyisim": "ALBAYRAK","birim": "Medya İletişim","favori": null},
{"id": 16,"isim": "MUSTAFA","soyisim": "CİN","birim": "Medya İletişim","favori": null}
urun
{id:1, tur: "Çikolata", icerik: "Fındıklı" },
{id:2, tur: "Çikolata", icerik: "Fıstıklı" },
{id:3, tur: "Bisküvi", icerik: "Kremalı" },
{id:4, tur: "Bisküvi", icerik: "Çikolatalı" },
{id:5, tur: "Gofret", icerik: "Çikolatalı" },
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
cursor = [Link]()
sql = "SELECT [Link], [Link], \
[Link], [Link] \
FROM calisan\
INNER JOIN urunler ON [Link] = [Link] "
244
7
Programlama II
sonucListe = [Link]()
Kod Çıktısı:
('Abdullah', 'Birisi', 'Çikolata', 'Fındıklı')
('SONER', 'YİĞİTER', 'Çikolata', 'Fıstıklı')
('NURAY', 'ÜNSAL', 'Bisküvi', 'Kremalı')
('SENEM', 'YAĞIZ', 'Bisküvi', 'Çikolatalı')
('TANER', 'TUNÇER', 'Bisküvi', 'Çikolatalı')
('SEDAT', 'BABAN', 'Bisküvi', 'Kremalı')
('ŞAZİYE', 'YILDIZ', 'Çikolata', 'Fıstıklı')
('KEVSER', 'URUÇ', 'Çikolata', 'Fındıklı')
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
cursor = [Link]()
sql = "SELECT [Link], [Link], \
[Link], [Link] \
FROM calisan\
LEFT JOIN urunler ON [Link] = [Link] "
sonucListe = [Link]()
Kod Çıktısı:
('Abdullah', 'Birisi', 'Çikolata', 'Fındıklı')
('KEVSER', 'URUÇ', 'Çikolata', 'Fındıklı')
('SONER', 'YİĞİTER', 'Çikolata', 'Fıstıklı')
('ŞAZİYE', 'YILDIZ', 'Çikolata', 'Fıstıklı')
('NURAY', 'ÜNSAL', 'Bisküvi', 'Kremalı')
('SEDAT', 'BABAN', 'Bisküvi', 'Kremalı')
('SENEM', 'YAĞIZ', 'Bisküvi', 'Çikolatalı')
('TANER', 'TUNÇER', 'Bisküvi', 'Çikolatalı')
('YEMLİHA', 'ERTUĞRUL', None, None)
('EMRE', 'TUT', None, None)
('BETÜL', 'KORUM', None, None)
('NASIR', 'ALBAYRAK', None, None)
('MUSTAFA', 'CİN', None, None)
245
7
Python ile MySQL Veritabanı İşlemleri
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
cursor = [Link]()
sql = "SELECT [Link], [Link], \
[Link], [Link] \
FROM calisan\
RIGHT JOIN urunler ON [Link] = [Link] "
sonucListe = [Link]()
Kod Çıktısı:
('Abdullah', 'Birisi', 'Çikolata', 'Fındıklı')
('SONER', 'YİĞİTER', 'Çikolata', 'Fıstıklı')
('NURAY', 'ÜNSAL', 'Bisküvi', 'Kremalı')
('SENEM', 'YAĞIZ', 'Bisküvi', 'Çikolatalı')
('TANER', 'TUNÇER', 'Bisküvi', 'Çikolatalı')
('SEDAT', 'BABAN', 'Bisküvi', 'Kremalı')
('ŞAZİYE', 'YILDIZ', 'Çikolata', 'Fıstıklı')
('KEVSER', 'URUÇ', 'Çikolata', 'Fındıklı')
(None, None, 'Gofret', 'Çikolatalı')
Yaşamla İlişkilendir
MySQL’i Diğer SQL Veritabanlarıyla Kar- 1995’teki başlangıcından bu yana açık kaynak
şılaştırma olan MySQL, SQL çözümleri arasında hızla pazar
SQL, Structured Query Language anlamı- lideri haline geldi. MySQL ayrıca Oracle ekosiste-
na gelir ve ilişkisel veritabanlarını yönetmek için minin bir parçasıdır. Temel işlevi tamamen ücret-
yaygın olarak kullanılan bir programlama dilidir. siz olsa da, bazı ücretli eklentiler de vardır. Şu anda
SQL tabanlı DBMS’lerin farklı türlerini duymuş MySQL, Google, LinkedIn, Uber, Netflix, Twitter
olabilirsiniz. En popüler olanları MySQL, Post- ve diğerleri dahil olmak üzere tüm büyük teknoloji
greSQL, SQLite ve SQL Server’dır. Bu veritaban- firmaları tarafından kullanılmaktadır.
larının tümü, SQL standartlarıyla uyumludur, Destek için geniş bir açık kaynak topluluğu-
ancak tek değişen uyumluluk dereceleridir. nun yanı sıra, MySQL’in başarısının birçok başka
nedeni vardır:
246
7
Programlama II
• Kurulum kolaylığı: MySQL, kullanıcı dostu Özellikle bankacılık alanında, düzenli olarak bü-
olacak şekilde tasarlanmıştır. Bir MySQL veri- yük trafik iş yükleriyle uğraşan şirketler tarafından
tabanı kurmak oldukça basittir ve phpMyAd- tercih edilmektedir. Ticari bir çözümdür ve Win-
min gibi yaygın olarak bulunan birkaç üçüncü dows hizmetleriyle en uyumlu sistemlerden biridir.
taraf aracı, kurulum sürecini daha da kolay- 2010 yılında Oracle, Sun Microsystems ve
laştırır. MySQL, Windows, macOS, Linux ve MySQL’i satın aldığında, birçok kişi MySQL’in
Solaris dahil olmak üzere tüm büyük işletim geleceği konusunda endişeliydi. O zamanlar
sistemleri için kullanılabilir. Oracle, MySQL’in en büyük rakibiydi. Geliş-
• Hız: MySQL, son derece hızlı bir veritabanı tiriciler, bunun MySQL’i yok etmek amacıyla
çözümü olarak tanınmaktadır. Nispeten daha Oracle’dan düşmanca bir devralma olduğundan
küçük bir ayak izine sahiptir ve uzun vadede korktular.
son derece ölçeklenebilir. MySQL’in orijinal yazarı Michael Widenius
• Kullanıcı ayrıcalıkları ve güvenlik: MySQL, pa- liderliğindeki birkaç geliştirici, MySQL kod ta-
rola güvenlik düzeyini ayarlamanıza, yönetici pa- banının bir çatalını oluşturdu ve MariaDB’nin
rolaları atamanıza ve kullanıcı hesabı ayrıcalıkları temelini attı. Amaç, MySQL’e erişimi güvence
ekleyip kaldırmanıza olanak tanıyan bir komut altına almak ve sonsuza kadar ücretsiz tutmaktı.
dosyasıyla birlikte gelir. Bu komut dosyası, bir MariaDB bugüne kadar tamamen GPL li-
web barındırma kullanıcı yönetimi portalı için sanslı olarak kaldı ve tamamen kamu malı olarak
yönetici sürecini karmaşıklaştırmaz. PostgreSQL kaldı. MySQL’in bazı özellikleri ise sadece ücretli
gibi diğer DBMS’ler, kullanımı daha karmaşık lisanslarla kullanılabilir. Ayrıca MariaDB, dağı-
olan yapılandırma dosyalarını kullanır. tılmış SQL ve sütunlu depolama gibi MySQL
MySQL hızı ve kullanım kolaylığı ile ünlü olsa sunucusu tarafından desteklenmeyen son derece
da PostgreSQL ile daha gelişmiş özelliklere sahip kullanışlı birkaç özellik sunar. MariaDB’nin web
olabilirsiniz. Ayrıca, MySQL tamamen SQL uyum- sitesinde listelenen MySQL ve MariaDB arasında
lu değildir ve FULL JOIN yan tümceleri için destek daha fazla fark bulabilirsiniz.
olmaması gibi belirli işlevsel sınırlamalara sahiptir. MySQL, Standart SQL’e çok benzer bir söz-
MySQL’de eşzamanlı okuma ve yazma ile dizimi kullanır. Bununla birlikte, resmi belgeler-
ilgili bazı sorunlarla da karşılaşabilirsiniz. Yazılı- de belirtilen bazı dikkate değer farklılıklar vardır.
mınızda aynı anda birçok kullanıcı veri yazıyorsa,
PostgreSQL daha uygun bir seçim olabilir.
Kaynak: Baweja, C., (2022, Aralık 28), Python and
SQL Server ayrıca çok popüler bir DBMS’dir MySQL Database: A Practical Introduction, Retri-
ve güvenilirliği, verimliliği ve güvenliği ile bilinir. ved from [Link]
Öğrenme Çıktısı
2 Veritabanı ile ilgili komutları ve kod içerisinde kullanımını kavrayabilme
247
7
Python ile MySQL Veritabanı İşlemleri
Veritabanı kurulumu,
1 veritabanı ve tablo oluşturma
işlemlerini kavrayabilme
öğrenme çıktıları ve bölüm özeti
Çoğu yazılım veriler üzerinde işlem yapması gerektiği için, Python gibi programlama dilleri bu veri kaynakla-
rına erişmek ve depolamak için araçlar sağlamaktadır.
Python, MySQL veritabanına ulaşabilmek için bir MySQL sürücüsüne ihtiyaç duymaktadır. Bu sürücülerden
biri de “MySQL Connector” ‘dır.
MySQL veritabanı ile bir bağlantı kurarak etkileşime girilmektedir. Bu bağlantıyı gerçekleştirebilmek için
[Link] modülündeki connect() metoduna ihtiyaç duyulmaktadır. Bu metot vasıtasıyla, veritabanı
sunucusu, kullanıcı, şifre ve veritabanı adı gibi bilgileri parametre olarak alarak, MySQLConnection nesnesi
döndürmektedir.
MySQL veritabanında kod yazarken kullanılacak bir veritabanı oluşturmak için “CREATE DATABASE” komu-
tu çalıştırılması gerekmektedir. Yeni bir tablo oluşturmak için de “CREATE TABLE” komutu kullanılmaktadır.
Veritabanı Komutları
MySQL veritabanı ilişkisel veritabanı yönetim sistemidir (RDBMS). Yapılandırılmış sorgu dili yani sql kullanarak
veriler üzerinde işlem yapılmasını sağlar. Veri oluşturma, ekleme, güncelleme ve silme işlemlerini desteklemektedir.
MySQL ile kullanılan komutlar şu şekilde listelenebilir:
• Insert: Veritabanındaki tablolara tekli veya çoklu veri kaydı yapar.
• Select: Tablolara girilen verileri okur.
• Where: Filtreleme yapar, veri listeleme, güncelleme ve verilerin silinmesi işlemlerinde kullanılır.
• Order By: Filtreleme sonucunu, istenilen sütuna göre artan veya azalan düzende sıralama yapar.
• Delete: Tablodan veri siler.
• Drop Table: Var olan bir tabloyu verileri ile birlikte siler.
• Update: Verilerin değerlerini değiştirir.
• Limit: Sorgudan dönen sonuç kümesindeki verilerin sayısını kontrol etmek veya sınırlandırmak için kullanılır.
• Join: İki veya daha fazla tablonun verilerini, aralarındaki ilişkili sütunlara göre birleştirir.
248
7
Programlama II
1 Python programlama dilinde kullanılan, MySQL 4 MySQL de oluşturulmuş bir tabloya birincil
Connector’ın görevi aşağıdakilerden hangisidir? anahtar ve otomatik arttırma özelliklerinin eklen-
neler öğrendik?
A. Dosya işlemleri modülü mesi için yazılması gereken komut aşağıdaki seçe-
B. MySQL sürücüsü neklerden hangisinde doğru olarak verilmiştir?
C. İnternet bağlantı modülü A. ALTER TABLE calisan ADD COLUMN id
D. Bir python modülü INT PRIMARY KEY
E. SQLite veritabanı bağlantı modülü B. ALTER TABLE calisan ADD COLUMN id
INT AUTO_INCREMENT
C. ALTER TABLE calisan ADD COLUMN id
2 Python programlama dili ile MySQL verita- INT AUTO_INCREMENT PRIMARY KEY
banı için kod yazarken kullanılacak bir veritabanı
oluşturmak için aşağıdaki komutlardan hangisi ça- D. ALTER TABLE calisan ADD id INT AUTO_
lıştırılmalıdır? INCREMENT PRIMARY KEY
E. ALTER TABLE calisan ADD AUTO_INC-
A. CREATE TABLE REMENT PRIMARY KEY
B. CREATE DATABASE
C. CREATE VIEW
D. OPEN DATABASE
5 I. Sadece tek tabloya veri girişi yapabilir
E. OPEN TABLE II. Tekli veri girişi yapılabilir
III. Çoklu veri girişine izin verir
3 cursor = [Link]()
INSERT_INTO MySQL komutu için yukarıdaki
calisanTablosu = """CREATE TABLE calisan ( maddelerden hangileri doğrudur?
isim VARCHAR(30) A. Yalnız I
NOT NULL, B. Yalnız II
soyisim C. I ve II
VARCHAR(30),
D. II ve III
birim VARCHAR(50),
maas DOUBLE(10, 2),
E. I, II ve III
dogum_tarihi DATETIME
)""" 6 SELECT * FROM ogrenciler WHERE soyi-
[Link](calisanTablosu) sim like ‘%OĞLU’
[Link]()
Verilen MySQL komutu için aşağıdaki maddeler-
Yukarıda verilen örnek Python kodu için aşağıdaki den hangisi yanlıştır?
seçeneklerden hangisi yanlıştır? A. ogrenciler tablosundan veri sorgular
A. calisan isimli bir tablo oluşturulur B. Tablodaki tüm alanların döndürülmesini ister
B. Tabloda birincil anahtar oluşturulmamıştır C. soyisim alanında ‘OĞLU’ ile biten kayıtları
C. Tabloda 5 tane alan vardır filtreler
D. maas alanı en fazla 8 basamaklı bir sayı girişine D. Soyismi ‘OĞLU’ olan öğrencileri filtreler
izin verir E. Filtreye uyan eleman bulunmazsa boş değer
E. soyisim alanı boş bırakılabilir döndürür
249
7
Python ile MySQL Veritabanı İşlemleri
7 Tablo verilerinde istenilen filtreleme sonucu- 9 ….. calisan ….. dogum_tarihi = ‘2000-04-
nu, istenilen sütuna göre artan veya azalan düzende 17’ WHERE id = 3
sıralama yapmak için kullanılmaktadır.
neler öğrendik?
250
7
Programlama II
1. B Yanıtınız yanlış ise “Python - MySQL Baş- 6. D Yanıtınız yanlış ise “Veritabanı Komutları”
larken” konusunu yeniden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
3. D Yanıtınız yanlış ise “Python - MySQL Baş- 8. E Yanıtınız yanlış ise “Veritabanı Komutları”
larken” konusunu yeniden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
4. C Yanıtınız yanlış ise “Python - MySQL Baş- 9. A Yanıtınız yanlış ise “Veritabanı Komutları”
larken” konusunu yeniden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
5. E Yanıtınız yanlış ise “Veritabanı Komutları” 10. C Yanıtınız yanlış ise “Veritabanı Komutları”
konusunu yeniden gözden geçiriniz. konusunu yeniden gözden geçiriniz.
251
7
Python ile MySQL Veritabanı İşlemleri
Araştır Yanıt
7 Anahtarı
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
# tablo dizaynı
Araştır 1
ogrenciTablosu = """CREATE TABLE ogrenci (
isim VARCHAR(30) NOT NULL,
soyisim VARCHAR(30),
sinif VARCHAR(50),
not_ortalama DOUBLE(10,2),
dogum_tarihi DATETIME
)"""
# tablo oluşturuldması
[Link](ogrenciTablosu )
import [Link]
veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
# cursor nesnesi oluşturma
Araştır 2 cursor = [Link]()
sonucListe = [Link]()
252
7
Programlama II
Kaynakça
Balat, i., (2019, nisan 8), Python İle MySQL Veritabanı Bağlantısı ve SELECT,UPDATE,INSERT,DELETE
İşlemleri, (2022, Nisan 21). [Link]
Baweja, C., (2020), Python and MySQL Database: A Practical Introduction, (2022, Nisan 28). https://
[Link]/python-mysql.
Python ile Veritabanı İşlemleri (MySQL), (2021), (2022, Nisan 25). [Link]
python-programlama/python-ile-veritabani-islemleri-mysql.
Python MySQL, (2022, Nisan 28). [Link]
Singh, R., (2022, Şubat 1), Python MySQL, (2022, Nisan 20). [Link]
mysql/?ref=lbp.
253
Bölüm 8
Django ile Web Sitesi Hazırlama
öğrenme çıktıları
1 2
Django Kurulumu Yönetici Arayüzü
1 Django projesi ve bileşenlerini 2 Yönetici arayüzü ve kullanıcı oluşturmayı
oluşturabilme kavrayabilme
Anahtar Sözcükler: • Django • Web Sitesi • Yönetici Sayfaları • Şablon • Proje Oluşturma
254
8
Programlama II
GİRİŞ
Django, BSD yani özgür yazılım lisansı ile lisanslanmış, açık kaynak kodlu, Python dili için dizayn edil-
miş yüksek seviyeli bir web uygulaması geliştirme platformudur. Adını caz gitaristi Django Reinhardt’dan
almıştır.
Kurulumu ve kullanımı oldukça basit olan Django’nun temel hedefi, karmaşık yapıdaki web uygu-
lamalarının kullanımını daha kolay bir hale getirmektir. Modülerlik, tekrar kullanılabilirlik ve hızlı bir
geliştirme ortamı sunmak üzere tasarlanmıştır.
Django, detaylı hata raporları sunmasının yanında, sunduğu dinamik yönetim paneli ile, projeye özel
kayıt ekleme, düzenleme ve silme metotlarını da içermektedir. Django ayrıca MVT (Model View Templa-
te) mimari yapısını kullanan yüksek seviyeli bir web geliştirme platformudur.
Django, web sitelerinin daha hızlı ve daha kolay geliştirilmesine izin veren bir çok bileşen içermektedir.
Genel web geliştirme için tüm özel paketleri ve ilgili bağımlılıkları yüklemektedir. Bunun yanında kullanı-
cı kimlik doğrulaması ve içerik yönetimi gibi pek çok özelliğe sahiptir.
Python web topluluğu tarafından üzerinde vakit harcandığı için, Django oldukça güvenli bir uygu-
lamadır. Geliştiricilerin siteler arası komut dosyası çalıştırma, csrf ve tıklama hırsızlığının yanında SQL
Injection gibi güvenlik hatalarından korunmasına yardımcı olmaktadır.
Django, bilimsel işlem platformları, içerik yönetim sistemleri ve sosyal ağ yönetimi gibi farklı alanlarda
kullanılmaktadır. Böylece her alanda çok yönlü olduğu söylenebilir.
DJANGO KURULUMU
Django son sürümünün kurulumu için [Link] adresindeki pip
komutu, komut satırına yazılarak gerçekleştirilebilir. Kurulum pip üzerinden gerçekleşecek ve gerekli tüm
paketler de kurulacaktır.
Kod:
pip install Django==4.0.5
Proje Oluşturma
Bir web uygulaması geliştirmek için öncelikle bir proje oluşturulması gerekmektedir. Linux veya Win-
dows ortamı olması farketmeksizin bir komut satırı açılmalıdır. Daha sonra komut satırından projenin
oluşturulması istenilen klasöre girilmelidir. Ardından aşağıdaki komut çalıştırılmalıdır:
dikkat
Komutta geçen proje_adı yerine istediğiniz bir isim verebilirsiniz.
255
8
Django ile Web Sitesi Hazırlama
Komut çalıştırıldığında hata vermiyorsa aşağıdaki yapıda bir proje oluşturulmuş olacaktır.
proje_adı/
[Link]
proje_adı/
__init__.py
[Link]
[Link]
[Link]
Komut çalıştırıldıktan sonra, webapp dizininin içersinde test, model ve veritabanı ile ilgili fazladan
dosyaların eklendiği görülecektir.
Uygulamanızı proje ayarlarında manuel olarak içeri aktarmanız gerekmektedir. Bunun için proje_adı/
[Link] dosyasını açarak içerisine projenizi eklemelisiniz. Yukarıdaki örnek kodda proje adı webapp’dir.
INSTALLED_APPS = (
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'webapp',
)
256
8
Programlama II
Kod:
from [Link] import render
from [Link] import HttpResponse
def hello(request):
text = """<h1>Django sayfamıza hoşgeldiniz!!!</h1>"""
return HttpResponse(text)
Örnek kodda, sayfa içeriği bir metin olarak girilerek, html oluşturmak için HttpResponse kullanılmış-
tır. Bu görünümün bir sayfa olarak görülebilmesi için bir URL ile eşleştirilmesi gerekmektedir.
Proje içerisine kendi oluşturduğunuz webapp klasörü altına [Link] adlı bir dosya oluşturalım. İçeriği-
ni de aşağıdaki şekilde güncelleyelim:
Kod (webapp/[Link]):
from [Link] import path
from . import views
urlpatterns = [
path('', [Link], name='hello'),
]
Kod (proje_adı/[Link]):
from [Link] import include, path
from [Link] import admin
urlpatterns = [
path('admin/', [Link]),
path('webapp', include('[Link]')),
]
dikkat
Oluşturulan her bir proje içinde “[Link]” dosyası oluşturulmalı ve bu dosyanın ana “[Link]” dosyasına eklen-
melidir. Böylece tüm rotaların tek bir dosyada tutulması yerine, her bir proje kendi içinde url yapısını taşıyarak,
taşınabilir bir format oluşturulacaktır.
Django sunucusunun çalıştırılması için, aşağıdaki kodun komut satırında “[Link]” dosyasının bu-
lunduğu klasörde çalıştırılması gerekmektedir.
Kod:
python [Link] runserver
257
8
Django ile Web Sitesi Hazırlama
veya öntanımlı 8000 portundan başka bir porttan sunucuyu çalıştırmak için şu komut kullanılabilir:
Kod (webapp/[Link]):
from [Link] import render
from [Link] import HttpResponse
def html_hello(request):
return render(request, "[Link]", {})
def hello(request):
text = """<h1>Django sayfamıza hoşgeldiniz!!!</h1>"""
return HttpResponse(text)
Kod (webapp/templates/[Link]):
<h1>Template İçerik</h1>
<div>[Link] sayfasının içeriğini görmektesiniz.</div>
Projenin ayarlarının tutulduğu [Link] dosyası içinde tanımlı TEMPLATES ayarlarına da yeni
oluşturulan templates klasörü tanımlanmalıdır. Bu dosya içerisine eklenmesi gereken satır ‘DIRS’: [os.
[Link](BASE_DIR,’templates’)], şeklindedir.
258
8
Programlama II
Kod (proje_adı/[Link]):
import os
...
TEMPLATES = [
{
'BACKEND': '[Link]',
'DIRS': [[Link](BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'[Link].context_processors.debug',
'[Link].context_processors.request',
'[Link].context_processors.auth',
'[Link].context_processors.messages',
],
},
},
]
...
Şablonların oluşturulduğu “templates” klasörü altına bir tane daha “[Link]” isminde dosya
oluşturalım.
Kod (webapps/templates/[Link]):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>
Basit Html Sayfası
</title>
</head>
<body background="../templates/[Link]" style="background-color:#acd9e3;">
<br />
<h3 align="center">
<font face="Lato" size="6"><img
src="[Link]
style="padding-right: 300px;"/></font>
<font face="cinzel" size="4">
<a href="#" style="padding-right: 10px;">ANA SAYFA</a>
<a href="#" style="padding-right: 10px;">VİDEO</a>
<a href="#" style="padding-right: 10px;">PORTFOLYO</a>
<a href="#" style="padding-right: 10px;">BLOG</a>
<a href="#">İLETİŞİM</a>
</font>
</h3>
259
8
Django ile Web Sitesi Hazırlama
<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
<h1 align="center">
<font face="Lato" color="#017bf5" size="7">
ANADOLU ÜNİVERSİTESİ
</font>
</h1>
<h3 align="center">
<font face="Lato" color="#000" size="5">
ESKİŞEHİR
</font>
</h3>
<br />
<h3 align="center">
<a href="#">
<font face="Lato" color="#000">Programlamaya Giriş</font>
</a>
<a href="#">
<font face="Lato" color="#f00">Bizi Takip Edin!</font>
</a>
</h3>
</body>
</html>
Oluşturulan dosya için “webapp/[Link]” dosyasına yeni html dosyasını işleyecek kodu ve “webapp/
[Link]” dosyasına da url yönlendirmesi eklenmesi gerekmektedir.
Kod (webapp/[Link]):
from [Link] import path
from . import views
urlpatterns = [
path('', [Link], name='hello'),
path('html_hello/', views.html_hello, name='html_hello'),
path('mainpage/', [Link], name='mainpage'),
]
Kod (webapp/[Link]):
from [Link] import render
from [Link] import HttpResponse
def html_hello(request):
return render(request, "[Link]", {})
def hello(request):
text = """<h1>Django sayfamıza hoşgeldiniz!!!</h1>"""
return HttpResponse(text)
def mainpage(request):
return render(request, "[Link]", {})
260
8
Programlama II
<slug:veri> Python ile kod yazmaya hoş geldiniz! sayfa=Anadolu Üniversitesi Mezuniyet
=> python-ile-kod-yazmaya-hos- Kutlamaları
geldiniz /hakkinda/anadolu-universitesi-
mezuniyet-kutlamalari
261
8
Django ile Web Sitesi Hazırlama
path(kullanici/<uuid:user_id>/’,...)
16 byte yer kaplayan, UUID
uuid (Universally Unique Identifier)’a Değer olarak Pyhton [Link] veri tipi
karşılık gelmektedir. 8-4-4-4-12 değerlerini alabilir.
<uuid:veri> karakter olmak üzere 36 karakter 5
/kullanici/3458era4-3r5f-e44t-vg54-
grup halinde gösterilmektedir.
ww44mn56q2a3/
path(‘arama/<path:sorgu>/’,...)
[Link] arama/kullanicilar/soyisim/samimi
Boş olmayan, yol ayracı “/” işareti de
dahil olmak üzere herhangi bir metin Parametreyi kullanicilar/soyisim/samimi
verisi içerebilir. şeklinde alacaktır.
<path:veri>
Değer olarak Python str veri tipi
değerlerini alabilir.
Kod (webapp/[Link]):
...
path('sayi_goster/<int:sayi>', views.sayi_goster,
name='sayi_goster'),
path('mesaj_goster/<str:mesaj>', views.mesaj_goster,
name='mesaj_goster'),
...
Kod (webapp/[Link]):
...
def sayi_goster(request, sayi):
return render(request, "sayi_goster.html", {'sayi' : sayi})
Kod (webapp/templates/sayi_goster.html):
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ürünler</title>
</head>
<body>
<h2>Ürün Numarası : {{sayi}}</h2>
</body>
</html>
262
8
Programlama II
Kod (webapp/templates/mesaj_goster.html):
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Talepler</title>
</head>
<body>
<h2>Mesajınız : {{mesaj}}</h2>
</body>
</html>
Oluşturulan html dosyalara parametreler, url üzerinden gönderilmektedir. Sırasıyla iki şablonun para-
metre ile çağrılmasını inceleyelim.
[Link]
[Link]
263
8
Django ile Web Sitesi Hazırlama
Model Oluşturma
Django’da model, veritabanında tablo veya koleksiyonu temsil eden bir sınıftır. Bu sınıfın her özelliği
de tablo veya koleksiyonun bir alanını göstermektedir. Modeller, “[Link]” dosyasında tanımlanmakta-
dır. Örnek kodda “webapp/[Link]” dosyasında tanımlanmıştır.
dikkat
Bu noktadan sonra MySQL veritabanı ile işlem yapılmaya devam edilecektir. Bilgisayarınıza MySQL kurulu
olduğundan emin olun ve üzerinde çalışmak için bir veritabanı oluşturunuz.
Kod (webapp/[Link]):
from [Link] import models
class Kartvizit([Link]):
class Meta:
db_table = "kartvizit"
id = [Link](primary_key=True)
veya
264
8
Programlama II
Kod (proje_adi/[Link]):
…
DATABASES = {
'default': {
'ENGINE': '[Link]',
'NAME': 'veritabanı_adı',
'USER': 'veritabanı_kullanıcı_adı',
'PASSWORD': 'veritabanı_kurulum_şifresi',
'HOST': '[Link]',
'PORT': '3306',
'OPTIONS': {
'sql_mode': 'traditional',
'charset' : 'utf8',
'use_unicode' : True,
}
}
}
…
Proje içerisindeki tüm modelleri tarayarak migration dosyalarını oluşturan komut şu şekildedir:
Oluşturulan migration dosyalarının çalıştırılarak veritabanı ile eşleştirilerek güncellenmesi için çalıştı-
rılan komut şu şekildedir:
dikkat
Models dosyasında yapılan tüm değişiklikler için öncelikle makemigration sonra da migrate komutu çalıştırıla-
rak veritabanı güncellenmelidir. Bunun haricinde başka bir tablo güncelleme komutu yazılmasına gerek yoktur.
Projede herhangi bir problem olup olmadığı aşağıdaki kod yardımıyla kolayca bulunabilir.
265
8
Django ile Web Sitesi Hazırlama
Kullanıcı
URL View
Django
Template Model
Kod (webapp/[Link]):
…
def crud_islemleri(request):
kayit = Kartvizit(
isim = "Hamdullah Suphi", website = "[Link]
eposta = "hsuphi@[Link]", telefon = 5569875412
)
[Link]()
kayit2 = Kartvizit(
isim = "Tuncay Dere",
website = "[Link]
eposta = "deret@[Link]", telefon = 5323451289
)
[Link]()
kayit3 = Kartvizit(
isim = "Elon Musk", website = "[Link]
eposta = "elon@[Link]", telefon = 5411234567
)
[Link]()
266
8
Programlama II
# Kayıt güncelleme
kart = Kartvizit(
isim = "Hamdullah Suphi Tanrıöver",
website = "[Link]
eposta = "hsuphi@[Link]", telefon = 5569875412
)
[Link]()
# Kayıt güncelleme
kart = [Link](eposta = "elon@[Link]")
[Link] = "elon@[Link]"
[Link]()
return HttpResponse(res)
Kod (webapp/[Link]):
...
path('kartvizit/', views.crud_islemleri, name='crud_islemleri'),
...
Yapılan kod değişikliklerinden sonra, yeni eklenen metodun çalışması ve ekranda çıktı görebilmek için
ilgili sayfaya aşağıdaki linkten ulaşılabilir:
[Link]
Kod Çıktısı:
Tüm Kartvizit kayıtları :
Hamdullah Suphi
Tuncay Dere
Elon Musk
Bir kayıt yazdırılıyor
Tuncay Dere
Bir kayıt siliniyor Tuncay Dere
Yeni kayıt yapılıyor... Hamdullah Suphi Tanrıöver
Kayıt güncelleniyor... Elon Musk
267
8
Django ile Web Sitesi Hazırlama
Kodu inceleyecek olursak; öncelikle veritabanına üç adet kayıt girilmektedir. Girilen bu kayıtlar bir
liste ile alınarak, döngü içerisinde isim verileri alınmaktadır. Daha sonra isim verisi ile bir kayıt bulunmak-
tadır. Ardından da bulunan bu kayıt veritabanından silinmektedir. Sonrasında yeni bir kayıt yapılmakta ve
en son olarak da var olan bir kayıt bulunarak güncellenmektedir.
Form İşlemleri
Bir Form sınıfı oluşturulduğunda, en önemli kısım form alanlarının tanımlanmasıdır. Formdaki her
alanın, kendine özel doğrulama mantığı vardır. Formlar temel olarak kullanıcıdan veri alabilmek ve bu
verileri veritabanlarındaki mantıksal işlemler için kullanılır. Örnek olarak bir kullanıcı adı, e-posta adresi,
şifre vb. verilerin girdi olarak kaydedilmesi verilebilir.
Django’da form oluşturmak, bir model oluşturmaya benzemektedir. Form oluştururken Django sını-
fından miras alınması gerekmekte ve sınıf nitelikleri form alanları olacaktır.
Django, Django formlarında tanımlanan alanları HTML veri giriş alanları ile eşleştirir. Django, form-
larla ilgili üç farklı çalışma yapmaktadır:
• Verileri işlemeye hazır hale getirmek için hazırlamak ve yeniden yapılandırmak
• Veriler için HTML formları oluşturma
• İstemciden gönderilen form ile verileri almak ve işlemek
Hatalı boş
form
oluşturma
Kullanıcı Request
Hayır
Veri Veri
doğrulama doğru
mu?
Evet
Veri
Başarı Url’sine
Bitir üzerinde
yönlendirme
işlemler
Django formları ile yapılan her türlü geliştirmenin, gelişmiş HTML öğeleriyle yapılabileceği unutul-
mamalıdır. Django’nun buradaki artısı, geliştirmeyi özellikle doğrulama kısmını daha kolay ve verimli hale
getirmesidir.
Söz dizimi:
alan_adı = [Link]( **özellikler )
268
8
Programlama II
Uygulama formlarını içermesi için “webapp” klasörüne bir “[Link]” dosyası ekleyerek bir giriş formu
oluşturalım.
Kod (webapp/[Link]):
from django import forms
class LoginForm([Link]):
user = [Link](max_length = 100)
password = [Link](widget = [Link]())
Örnek kodda görüldüğü gibi, alan türü html işleme için “widget” argümanını alabilir. Formda şifrenin
gizlenmesi için passwordinput şeklinde düzenlenmiştir. Ayrıca Django’da birçok girdi nesnesi bulunmak-
tadır: Tarihler için DateInput, onay kutuları için CheckboxInput, vb.
Kod (webapp/[Link]):
...
from [Link] import LoginForm
def login(request):
username = "Giriş yapılmadı"
if [Link] == "POST":
#Get the posted form
MyLoginForm = LoginForm([Link])
if MyLoginForm.is_valid():
username = MyLoginForm.cleaned_data['username']
else:
MyLoginForm = Loginform()
Görünüm, [Link] aracılığıyla gönderilen giriş formunun sonucunu gösterecektir. Test etmek için
önce giriş formu şablonuna ihtiyacımız olacaktır. webapp/[Link] dosyasını oluşturalım.
Kod (webapp/[Link]):
<html>
<body>
269
8
Django ile Web Sitesi Hazırlama
<br>
<br>
Kod (webapp/[Link]):
...
path('conn/', TemplateView.as_view(template_name = '[Link]')),
path('giris/', [Link], name='login'),
...
Şablon bir giriş formu gösterecek ve sonucu yukarıdaki “[Link]” görünümüne gönderecektir. Ay-
rıca şablon içerisine, oluşturduğunuz sitede Siteler Arası İstek Sahteciliği (CSRF) saldırısını önlemek için
bir etiket eklenmiştir.
{% csrf_token %}
270
8
Programlama II
Giriş sayfası (login) hazırlandığında, form işleminden sonra yönlendirilecek bir [Link] sayfasına
ihtiyaç duyulacaktır.
Kod (webapp/[Link]):
<html>
<body>
Hoşgeldiniz <strong>{{username}}</strong>
</body>
</html>
En son olarak da, “webapp/[Link]” dosyasına yeni sayfaların yönlendirmeleri ilave edilmelidir.
dikkat
Kodun çalıştırılması sırasında hata oluşursa, verilen hata dikkatli bir şekilde incelenmeli ve çözüm yolu aranmalı-
dır. Özellikle yeni oluşturulan dosyaların doğru klasör yapısı altında olduğuna dikkat edilmelidir.
271
8
Django ile Web Sitesi Hazırlama
Öğrenme Çıktısı
1 Django projesi ve bileşenlerini oluşturabilme
MVT (Model View Temp- MVT ile MVC kavramları- Djangonun tercih edilme
late) yapısını araştırınız nı araştırıp karşılaştırınız nedenlerini araştırınız
YÖNETİCİ ARAYÜZÜ
Django, yönetimsel işlemler için kullanıma hazır bir kullanıcı arabirimi sağlamaktadır. Bir web projesi
için yönetici arayüzü oldukça önemlidir, bu yüzden Django, proje modellerine göre otomatik olarak yö-
netici kullanıcı arayüzü oluşturur.
272
8
Programlama II
Eğer daha önce veritabanı oluşturulamadı ise, Django sunucusunu başlatmadan önce, Yönetici Arayü-
züne erişebilmek için veritabanının başlatılması gerekmektedir.
Veritabanı senkronizasyonu, yönetici arayüzünün çalışması için gerekli olan veritabanı türüne bağlı
olarak gerekli tabloları veya koleksiyonları oluşturacaktır. Yönetici işlemleri için süper kullanıcınız yoksa,
bir tane oluşturmanız istenecektir.
Zaten bir süper kullanıcınız varsa veya bilgilerini unuttuysanız, aşağıdaki kodu kullanarak yeni bir
kullanıcı oluşturabilirsiniz.
Yönetici Arayüzünü başlatmak için, yönetici arayüzümüz için bir URL yapılandırılması gerekmektedir.
“proje_adı/[Link]” dosyasında şu yönlendirme bulunması gerekmektedir:
Kod (proje_adı/[Link]):
from [Link] import include, path
from [Link] import admin
urlpatterns = [
path(r'^admin/', [Link]),
]
273
8
Django ile Web Sitesi Hazırlama
Süper kullanıcı hesabı oluşturularak sisteme giriş yaptıktan sonra şu ekran karşımıza çıkacaktır:
274
8
Programlama II
Yaşamla İlişkilendir
275
8
Django ile Web Sitesi Hazırlama
Verim
Flask, daha küçük ve daha az katmana sahip olduğu için Django’dan biraz daha iyi performans
gösterir. Fark, özellikle G/Ç (Girdi/Çıktı) hesaba katıldığında göz ardı edilebilir.
Sonuç
Peki, hangi çerçeveyi kullanmalısınız? Kesin olmak gerekirse, bu ihtiyaçlarınıza bağlıdır. Belirli bir
platform, dil veya araçla diğerine geçme kararı, neredeyse tamamen mevcut şartlara ve soruna bağlıdır.
Django tam özelliklidir ve bu nedenle sizin veya ekibinizin daha az karar vermesini gerektirir. Muh-
temelen bu şekilde daha hızlı hareket edebilirsiniz. Ancak, Django’nun sizin için yaptığı seçeneklerden
birinden memnun değilseniz veya yararlanabileceğiniz özelliklerin sayısını sınırlayan farklı uygulama
gereksinimleriniz varsa, Flask’a da bakabilirsiniz.
Her zaman için taviz verilmesi gerekecek ve değişim olacaktır. Son olarak, her iki platform da web
uygulamaları oluşturmaya giriş engelini azaltarak, uygulama geliştirmelerini çok daha kolay ve hızlı hale
getirmiştir.
Kaynak: Phulare, A., (2020, Şubat 6), Django vs Flask: Which is the best for your Web Applicati-
on? [Link]
Öğrenme Çıktısı
2 Yönetici arayüzü ve kullanıcı oluşturmayı kavrayabilme
276
8
Programlama II
1 Django projesi ve
bileşenlerini oluşturabilme
Bir web uygulaması geliştirmek için öncelikle bir proje oluşturulması gerekmektedir. Linux veya Windows
ortamı olması farketmeksizin bir komut satırı açılmalıdır. Daha sonra komut satırından projenin oluşturul-
ması istenilen klasöre girilmelidir. Ardından aşağıdaki komut çalıştırılmalıdır:
Yönetici arayüzü ve
2 kullanıcı oluşturmayı
kavrayabilme
Yönetici Arayüzü
Django, yönetimsel işlemler için kullanıma hazır bir kullanıcı arabirimi sağlamaktadır. Bir web projesi için
yönetici arayüzü oldukça önemlidir, bu yüzden Django, proje modellerine göre otomatik olarak yönetici
kullanıcı arayüzü oluşturur.
Eğer daha önce veritabanı oluşturulamadı ise, Django sunucusunu başlatmadan önce, Yönetici Arayüzüne
erişebilmek için veritabanının başlatılması gerekmektedir.
277
8
Django ile Web Sitesi Hazırlama
3
from [Link] import path
from . import views
urlpatterns = [
path('', [Link], name='hello'),
]
Yukarıda verilen “projem/[Link]” örnek kodundaki satırda yapılan işlem, aşağıdaki seçeneklerden hangisin-
de doğru olarak verilmiştir?
A. hello bağlantısından gelen bağlantıları hello arayüzüne yönlendirir
B. Bir üst ”projem” projesinden gelen bağlantıları views altında tanımlı hello metoduna yönlendirir
C. Tüm bağlantılara ‘hello’ metnini döndürür
D. Adres çubuğu boş ise ‘hello’ yazdırır
E. Views dosyası altındaki hello metodunu ‘hello’ parametresi ile çağırır
278
8
Programlama II
5
...
neler öğrendik?
path('arsiv/<str:tarih>', views.arsiv_getir, name='arsiv_getir')
...
279
8
Django ile Web Sitesi Hazırlama
10 Django, yönetimsel işlemler için kullanıma hazır bir kullanıcı arabirimi sağlamaktadır. Django, proje
modellerine göre otomatik olarak bu arayüzü oluşturur.
Yukarıda bahsedilen arayüz aşağıdakilerden hangisidir?
A. View
B. Model
C. Template
D. Admin arayüzü
E. Url
280
8
Programlama II
Yanıtınız yanlış ise “Django Kurulumu / Yanıtınız yanlış ise “Django Kurulumu /
3. B 8. E
Arayüz Oluşturma” konusunu yeniden göz- Form İşlemleri” konusunu yeniden gözden
den geçiriniz. geçiriniz.
Araştır Yanıt
8 Anahtarı
281
8
Django ile Web Sitesi Hazırlama
Kaynakça
Dizdar, M., Python Kurulum. (2022, Mayıs 13). [Link]
django/content.
Django admin. (2022, Mayıs 15). [Link]
Django Tutorial. (2022, Mayıs 12). [Link]
How to connect MySQL to Django. (2022, Mayıs 19). [Link]
to-django.
How to get Django. (2022, Mayıs 16). [Link]
Johari, A., (2020, Eylül 16). Django Tutorial – Web Development with Python Django Framework, (2022,
Mayıs 10). [Link]
Kumar, B., (2021, Kasım 17). Get URL parameters in Django, (2022, Mayıs 17). [Link]
get-url-parameters-in-django.
Rubio, D., Url parameters, extra options & query strings. (2022, Mayıs 17). [Link]
django/[Link].
282