0% found this document useful (0 votes)
118 views290 pages

Programalam2 Pyton

Uploaded by

alieymur
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
118 views290 pages

Programalam2 Pyton

Uploaded by

alieymur
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Ders

Takvim Duyurular Epub Html5


Kitabı (PDF)

Ünite
Video Canlı Ders Sesli Kitap Sesli Özet
Özeti

Sorularla Deneme Etkileşimli


Alıştırma İnfografik
Öğrenelim Sınavı İçerik

Bilgilendirme Çıkmış Sınav Sınav Giriş Sınav Öğrenci


Panosu Soruları Bilgisi Sonuçları Toplulukları

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.

Öğrenme Çıktısı Tablosu


Araştır/İlişkilendir/Anlat-Paylaş
İlgili konuların altında cevaplayacağınız soruları, okuyabileceğiniz
ek kaynakları ve konuyla ilgili yapabileceğiniz ekstra etkinlikleri gösterir.
Yaşamla İlişkilendir
Bölümün içeriğine uygun paylaşılan yaşama dair gerçek kesitler
veya örnekleri gösterir.
Araştırmalarla İlişkilendir
Bölüm içeriği ile ilişkili araştırmaların ve bilimsel çalışmaları gösterir.
Programlama II

Editör

Doç.Dr. Muhammet Recep OKUR

Yazarlar

BÖLÜM 1, 4, 5, 6, 7, 8 Osman Nuri ATAK

BÖLÜM 2, 3 Doç.Dr. Muhammet Recep OKUR


T.C. ANADOLU ÜNİVERSİTESİ YAYINI NO: 4282
AÇIKÖĞRETİM FAKÜLTESİ YAYINI NO: 3049

Bu kitabın basım, yayım ve satış hakları Anadolu Üniversitesine aittir.


“Uzaktan Öğretim” tekniğine uygun olarak hazırlanan bu kitabın bütün hakları saklıdır.
İlgili kuruluştan izin almadan kitabın tümü ya da bölümleri mekanik, elektronik, fotokopi, manyetik kayıt
veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.

Copyright © 2022 by Anadolu University


All rights reserved
No part of this book may be reproduced or stored in a retrieval system, or transmitted
in any form or by any means mechanical, electronic, photocopy, magnetic tape or otherwise, without
permission in writing from the University.

Öğretim Tasarımcısı
Öğr.Gö[Link]. Orkun Şen

Grafik Tasarım ve Kapak Düzeni


[Link]. Halit Turgay Ünalan

Dil ve Yazım Danışmanı


Doç.Dr. Muhammet Recep Okur

Ölçme Değerlendirme Sorumlusu


Doç.Dr. Muhammet Recep Okur

Grafiker
Gülşah Karabulut

Dizgi ve Yayıma Hazırlama


Handan Atman
Gözde Soysever
Süreyya Çelik
Arzu Ercanlar
Nihal Sürücü
Gül Kaya
Burak Arslan
Yasin Özkır

PROGRAMLAMA II

E-ISBN
978-975-06-4315-6

Bu kitabın tüm hakları ANADOLU ÜNİVERSİTESİ’ne aittir.


ESKİŞEHİR, Mayıs 2022
3554-0-0-0-2409-V01
İçindekiler

Python ile
BÖLÜM 1 Programlamaya BÖLÜM 2 Akış Kontrolü
Giriş

Giriş ................................................................. 3 Giriş ................................................................. 39


Başlarken ....................................................... 3 Akış Kontrolü ................................................. 39
Python Özellikleri ................................ 3 if…else Kontrolü ................................... 39
Programlama Ortamının Kurulması .... 4 for Döngüsü ........................................... 43
Kod Yazma Ortamları - Editör ............ 6 while Döngüsü ...................................... 46
Temel Kavramlar ........................................... 8 break ve continue Deyimleri ................ 48
Anahtar Kelimeler ve pass Deyimi ............................................ 50
Tanımlayıcılar ....................................... 8 switch-case Deyimi ............................... 50
Deyimler, Girintileme ve Yorumlar ..... 9 Ad ve Ad Alanı (Namespace) ........................ 51
Değişkenler ........................................... 12 Ad/İsim ................................................... 51
Veri Tipleri ............................................ 14 Ad Alanı (Namespace) .......................... 53
Tür Dönüşümü ..................................... 18 Python Değişken Kapsamı (Scope) ..... 54
Giriş/Çıkış (I/O) ve İçe Aktarma
(Import) ........................................................ 21
Çıkış İşlemleri ........................................ 22
Giriş İşlemleri ........................................ 23
Operatörler .................................................... 25
Aritmetik Operatörler .......................... 25
Karşılaştırma Operatörleri ................... 26
Mantıksal Operatörler ......................... 27
Bitwise (Bitsel) Operatörler ................ 27
Atama Operatörleri ............................... 28
Özel Operatörler .................................. 29

iii
BÖLÜM 3 Fonksiyonlar BÖLÜM 4 Veri Tipleri

Giriş ................................................................. 65 Giriş ................................................................. 99


Python Fonksiyonları .................................... 65 Sayılar (Numbers) ......................................... 99
return İfadesi ......................................... 66 Tür Dönüştürme .................................... 100
Değişkenlerin Kapsamı ve Ömrü ......... 67 Matematik İşlemleri ............................. 103
Fonksiyon Türleri .................................. 67 Liste (List) ..................................................... 105
Fonksiyon Argümanları/Parametreleri ... 68 Liste Elemanlarına Erişim .................... 106
Değişken Sayıda Fonksiyon Liste (List) Yöntemleri .......................... 111
Argümanları ........................................... 69 Demet (Tuple) .............................................. 114
Özyinelemeli Fonksiyonlar Demet Elemanlarına Erişim ................. 116
(Recursive) ........................................... 71 Demet (Tuple) Fonksiyonları .............. 120
Lambda/Anonim Fonksiyonlar ............ 73 Metin Dizisi (String) .................................... 121
global, local ve nonlocal Anahtar Python’da Bir Dize Nasıl Oluşturulur?....  122
Kelimeleri ............................................... 74 Bir Dizedeki Karakterlere Nasıl Erişilir?.... 122
Modül Yapısı (Module) ................................. 79 Bir Dize Nasıl Değiştirilir veya Silinir?..... 124
import Anahtar Kelimesi ...................... 80 Python Dize İşlemleri ........................... 125
Yeniden Yükleme (Reload) İşlevi ......... 81 Kaçış Dizisi (Escape Sequence) ........... 126
Paket Yapısı (Package) .................................. 83 Dizeleri Biçimlendirme.........................   129
Modülü Bir Paketten İçe Aktarma ....... 83 Küme (Set) ..................................................... 131
Paket Yöneticisi (PIP) .................................... 84 Küme Oluşturma .................................. 131
ensurepip ............................................... 84 Kümeyi Değiştirme .............................. 133
[Link] ............................................... 85 Bir Kümeden Eleman Çıkarma ............   134
Standart Paketler .................................. 86 Küme Yöntemleri ................................. 135
Üçüncü Şahıs Paketleri ......................... 87 Kümelerde Yerleşik/Dahili Fonksiyonlar..   137
Paket Oluşturma ................................... 87 Sözlük (Dictionary) ....................................... 139
Sözlük Oluşturma ................................. 139
Sözlükteki Elemanlara Erişmek...........   139
Sözlük Elemanlarını Değiştirme
ve Ekleme .............................................. 140
Öğeleri Sözlükten Kaldırma ................. 141
Python Sözlük Fonksiyonları ..............   142
Sözlük Oluşturma (Dictionary
Comprehension) ................................... 143
Sözlük Üyelik Testi ............................... 144
Sözlük Üzerinden Yineleme
(İterasyon) ............................................ 144
Sözlük Yerleşik Fonksiyonlar...............   145

iv
Dosya İşlemleri ve
BÖLÜM 5 BÖLÜM 6 Nesne ve Sınıf
Hata Yakalama

Giriş ................................................................. 159 Giriş ................................................................. 187


Dosya İşlemleri .............................................. 159 Nesne Yönelimli Programlama
Dosyalar ................................................. 159 (OOP - Object Oriented Programming) ...... 187
Dosya Açma ........................................... 159 Nesne Yönelimli Programlamadaki
Dosya Kapatma ..................................... 160 Terimler .................................................. 187
Dosyaya Yazma ..................................... 161 Sınıf ve Nesne (Class & Object) .................... 192
Dosya Okuma ........................................ 161 Sınıf Tanımlama .................................... 193
Dizinler ........................................................... 164 Nesne Oluşturma .................................. 194
Geçerli Dizini Alma ............................... 164 Kurucu/Yapıcı Metotlar (Constructors) .. 195
Dizini Değiştirme .................................. 165 Sınıf Kalıtımı (Inheritance) ........................... 199
Dizinleri ve Dosyaları Listeleme .......... 165 Çoklu Kalıtım ......................................... 201
Yeni Dizin Oluşturma ........................... 165 Geçersiz Kılma Yöntemleri
Bir Dizini veya Dosyayı Yeniden (Overriding) .......................................... 204
Adlandırma ............................................ 166 Operatör Aşırı Yüklemesi
Dizin veya Dosyayı Kaldırma/Silme .... 166 (Overloading) ........................................ 205
İstisnalar (Exceptions) .................................. 168 Veri Gizleme (Data Encapsulation) ............. 208
Program Hataları (Syntax Errors) ....... 168 Çöp Toplama (Garbage Collection) ............. 209
Mantık Hataları (Bug) .......................... 169 Döngülerde Otomatik Çöp Toplama ... 210
İstisnalar (Exceptions) .......................... 169 Çöp Toplayıcının Elle Tetiklenmesi ...... 211
Python Dilindeki Dahili/Yerleşik
İstisnalar ................................................. 170
İstisna/Hata Yakalama .......................... 171
İstisna Oluşturma / Hata Fırlatma ....... 174
Kullanıcı Tanımlı Hata Yakalama ......... 176

v
Python ile MySQL Django ile Web
BÖLÜM 7 BÖLÜM 8
Veritabanı İşlemleri Sitesi Hazırlama

Giriş ................................................................. 225 Giriş ................................................................. 255


Python - MySQL Başlarken ........................... 225 Django Kurulumu .......................................... 255
MySQL ve Python için MySQL Proje Oluşturma .................................... 255
Connector Kurulumu ............................ 225 Arayüz Oluşturma (View) ................... 256
Veritabanı ile Bağlantı Kurma ............. 226 Şablon Oluşturma (Template) ............ 258
Veritabanı Oluşturma ........................... 226 Model Oluşturma ................................. 264
Tablo Oluşturma ................................... 227 Form İşlemleri ....................................... 268
Veritabanı Komutları .................................... 230 Yönetici Arayüzü ........................................... 272
Insert Komutu ....................................... 230 Yönetici Arayüzünü Başlatma ............. 272
Select Komutu ....................................... 232
Where Komutu ..................................... 234
Order By Komutu .................................. 237
Delete Komutu ...................................... 238
Drop Table Komutu .............................. 240
Update Komutu ..................................... 241
Limit Komutu ........................................ 242
Join Komutu .......................................... 243

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

Giriş/Çıkış (I/O) ve İçe Aktarma (Import)

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.

Programlama Ortamının Kurulması


Python kurulumuna geçmeden önce, işletim sisteminizde bir terminal penceresi açarak kurulu olup
olmadığını ve hangi sürümün kurulu olduğunu öğrenmek için “python” yazın. Bilgisayarınızda kurulu
bir Python sürümü varsa, konsol ekranında güncel sürümünüz ve sürümün yayınlanma tarihi şu şekilde
karşınıza gelecektir:
Terminal penceresi Windows ortamında Başlat düğmesine basıldıktan sonra cmd yazılarak açılmaktadır.

Resim 1.1 Windows komut istemi.

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

Resim 1.2 MacOS terminal ekranı.

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.

C:\Users\Kullanıcı Adı>python merhaba_dunya.py


Merhaba Dünya

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ş

Unix ve Linux Kurulumu


Linux sürümlerinin Ubuntu 16.10 veya daha yenisini kullanıyorsanız Python programlama dilinin son
sürümünü [Link] adresinden aşağıdaki komutlarla kolayca yükleyebilirsiniz:

$ sudo apt-get update


$ sudo apt-get install python3.10.2

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

Yukarıdaki komut, Python 2 yorumlayıcısını başlatmaktadır.

$ python3

Bu komut ise her zaman Python 3 yorumlayıcısını başlatmaktadır.

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.

Kod Yazma Ortamları - Editör


Python yorumlayıcısı işletim sistemine kurulduktan sonra, uygulama geliştirmek için bir arayüze yani
IDE (Integrated Development Environment - Tümleşik Geliştirme Ortamı) ihtiyaç duyulmaktadır. IDE, uy-
gulama geliştirme için programcıya kod ipuçları, sözdizimi vurgulama ve denetleme, dosya gezgini vb. gibi
yararlı özellikler barındıran, kodun daha hızlı ve kolay bir şekilde tamamlanmasını sağlayan bir yazılımdır.
Çeşitli ihtiyaçlara göre geliştirilmiş çok sayıda IDE mevcuttur. Piyasada Netbeans, Komodo, Wing, Eclip-
se, Sublime Text, IDLE gibi Python için kullanabileceğiniz çeşitli arayüzler bulunmaktadır.
Python’a yeni başlayanlar için hem kullanım hem de kurulum kolaylığı açısından uygulamalarımızda
Thonny IDE kullanacağız. Thonny IDE, içinde paketlenmiş en son Python sürümüyle birlikte gelmekte-
dir. Böylece Python’u ayrı olarak kurmanıza gerek kalmayacaktır.
Thonny IDE’yi bilgisayarınızda çalıştırmak için aşağıdaki adımları izleyebilirsiniz:

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.

Resim 1.3 Thonny IDE Arayüzü.

Öğrenme Çıktısı
1 Python programlama dilinin ve kod geliştirme arayüzünün kurulumunu gerçekleştirebilme

Araştır 1 İlişkilendir Anlat/Paylaş

Python programlama dili


Python programlama dili- Kod geliştirme arayüzü
için kullanılan farklı kod
nin 2 ve 3 versiyonları ara- (IDE) ve immediate mode
geliştirme arayüzü (IDE)
sındaki farkı araştırınız. arasındaki farkları belirtiniz.
araştırınız.

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.

Anahtar Kelimeler ve Tanımlayıcılar


Python programlama dilinde anahtar kelimeler değişken adı, işlev/fonksiyon adı veya başka bir tanım-
layıcı olarak kullanılamaz. Python dilinin söz dizimini ve yapısını tanımlamak için kullanılırlar. Python
dilinde anahtar kelimeler büyük/küçük harf duyarlıdır. Python 3.7’de 33 anahtar kelime vardır. Bu sayı
zaman içinde yeni versiyonlar yayınlandıkça bir miktar değişebilir.
True, False ve None dışındaki tüm anahtar kelimeler küçük harflidir ve oldukları gibi yazılmalıdır. Tüm
anahtar kelimelerin listesi aşağıdaki tabloda verilmiştir.

Tablo 1.1 Python Programlama Dili Anahtar Kelimeleri.


False await else import pass
None break except in raise
True class finally is return
and continue for lambda try
as def from nonlocal while
assert del global not with
async elif if or yield

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

• Tanımlayıcı isimlendirilirken !, @, #, $, % vb. gibi özel semboller kullanılamaz. Bu şekilde kulla-


nıldığında, kod yorumlanırken geçersiz sözdizimi hatası verecektir.

a@ = 0

Kod Çıktısı:
File "<interactive input>", line 1
a@ = 0
^
SyntaxError: invalid syntax

• Bir tanımlayıcı herhangi bir uzunlukta isimlendirilebilir.

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.

Deyimler, Girintileme ve Yorumlar


Python yorumlayıcısının yürütebileceği talimatlara deyim adı verilmektedir. Örneğin, a = 1 bir atama
ifadesidir. if deyimi, for deyimi, while deyimi vb. ilerleyen konularda anlatılacak olan diğer ifade türleridir.

Çok Satırlı İfade


Python’da, bir ifadenin sonu yeni satır karakteri ile işaretlenir. Ancak satır devam karakteri “\” ile birden
çok satıra yayılan bir ifade yapabiliriz. Örneğin:

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)

Burada, çevreleyen parantezler ( ) içlerindeki işlemleri satır devamı şeklinde gerçekleştirmektedir. [ ] ve


{ } için de durum aynıdır. Örneğin:

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

Kod Girintileme, Sekmeler


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ı size bağlıdır, ancak bu blok boyunca tutarlı olmalıdır. Genellikle, girinti için dört boşluk veya
sekme (tab) kullanılabilir. Örneğin:

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

Yukarıdaki kodun tek satır şeklinde yazılmış hali de aşağıdaki gibidir:

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.

Tek Satırlık Yorumlar


Programlama yaparken yazılan yorumlar çok önemlidir. Bir programın içinde neler olup bittiğini açık-
larlar, kullanılan metot ve değişkenlerin görevleri, kod akışının neden bu şekilde yönlendirildiği gibi anah-
tar noktalar belirtilir. Böylece kaynak koduna bakan bir kişi kod akışını anlamakta zorluk çekmez.

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.

# Bu bir yorum satırıdır


# Merhaba yazdır
print('Merhaba')

Çok Satırlı Yorumlar


Birden çok satıra ihtiyaç duyulan yorumlar olabilir. Bunun için her satırın başında hash (#) sembolünü
kullanmaktır. Örneğin:

# Bu uzun bir yorum örneğidir


# ve bunun için birden çok
# satır kullanılmıştır

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.

""" Bu yorum satırları da


çok satırlı yorumlar için
güzel bir örnek olabilir """

Kod Dokümantasyonu (Docstrings)


Docstring, belge dizesinin kısaltmasıdır. Python belge dizeleri, bir işlev, yöntem, sınıf veya modül ta-
nımından hemen sonra yer alan açıklama metinleridir. Belge dizeleri yazılırken üçlü tırnak işaretleri kul-
lanılır. Örneğin:

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

Burada sayı adında bir değişken oluşturduk. Değişkene de 26 değerini atadık.

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

Değişken Adlandırma Kuralları


• Değişken isimleri a, b, c gibi kısa isimler olabileceği gibi, bu_uzun_bir_degisken_ismidir gibi
uzun olarak da tanımlanabilir.
• Değişken isimleri sayı ile başlayamaz.
• Harf ya da “_” alt çizgi ile başlayabilir.
• Değişkenler büyük/küçük harf duyarlıdır. Yani Anadolu ve anadolu iki farklı değişken olarak
tanımlanır.
• Değişken isimlerinde ( -, +, /, *, #, ?, .) ve boşluk gibi özel karakterler kullanılamaz.

sayi = 26222
noktali_sayi = 26.22
metin = "Programlama öğreniyorum"

12
1
Programlama II

Çoklu Değer Atama


Python dilinde birden fazla değişkene aynı değer atanabilir.

degisken1 = degisken2 = degisken3 = 20

Aynı zamanda birden çok değişkene birden çok değer de atanabilir.

sayi1, sayi2, metin1 = 56, 11, "Eskişehir"

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.

sabit_degerler.py dosyası içeriği


YER_CEKIMI = 9.80665
PI = 3.14159

[Link] dosyası içeriği

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

Python dört farklı sayısal türü desteklemektedir.


• int (işaretli tam sayılar)
- 26, 222, -925, 0x69
• long (uzun tamsayılar, sekizli ve onaltılı olarak da gösterilebilir)
- 20344211L, 0126L, -0x571630, 0xDEFABCECBDAEC
• float (kayan nokta gerçek değerleri)
- 67.34, 27.3+e18, -76.0, -17.53e123
• complex (karmaşık sayılar)
- 3.14j, 47.j, .631j, 43e+26j

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.

String (Metin Dizisi)


Python’daki metin dizileri, tırnak işaretleri içinde gösterilen bitişik bir karakter kümesi olarak tanım-
lanır. Metin dizilerinde tek veya çift tırnak çiftlerine izin verilir. Dizelerin alt kümeleri, dizinlerin başında
0’dan başlayarak, sonundan ise -1’den başlayarak dilim operatörü ([ ] ve [:] ) kullanılarak alınabilir. Yani
bir metin dizisinin istenilen aralığındaki elemanlar bu şekilde alınabilir.
Artı (+) işareti metin dizesi birleştirme operatörü, yıldız işareti (*) ise tekrarlama operatörü olarak işlev
görmektedir.

15
1
Python ile Programlamaya Giriş

Kod:
#!/usr/bin/python

str = 'Merhaba Dünya!'

print( str ) # Tüm karakter dizisini yazar


print( str[0] ) # Karakter dizisinin ilk karakterini yazar
print( str[2:5] ) # Karakter dizisinin 3 ve 5. elemanı arasını
# yazar
print( str[2:] ) # Karakter dizisinin 3. elemanından başlayarak
# yazdırır
print( str * 2 ) # Tüm karakterleri 2 defa yazar
print( str + " Bu kısmı da ekledik..." ) # Birleştirilmiş metni yazar

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.

listem = [34, 26.1, 'Python öğreniyorum']

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])

# asallar [0:3] = [2, 3, 5]


print("asallar [0:3] = ", asallar [0:3])

# asallar [5:] = [13, 17, 19]


print("asallar [5:] = ", asallar [5:])

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.

demet = ( 20.26, 'Anadolu', 26+4j )

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])

# demet[0:3] = (20.26, 'Anadolu', 26+4j)


print("demet[0:3] = ", demet[0:3])
# Hata verecektir
# Tuple tipi değiştirilemez
demet[1] = "Eskişehir"

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 ))

print("sozluk [1] = ", sozluk [1])

print("sozluk ['anahtar'] = ", sozluk ['anahtar'])

# 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

Python’da iki tip tür dönüşümü vardır:


• Örtülü Tür Dönüşümü (Implicit)
• Açık Tür Dönüşüm (Explicit)

18
1
Programlama II

Örtülü Tür Dönüşümü (Implicit)


Örtülü tür dönüştürmede Python, bir veri türünü otomatik olarak başka bir veri türüne dönüştürür.
Düşük kapasiteli bir veri türünden daha yüksek kapasiteli bir veri türüne dönüşüm yapıldığı için veri kaybı
yaş[Link]ıca bu işlem için herhangi bir kullanıcı müdahalesine de ihtiyaç duyulmaz.
Python’un veri kaybını önlemek için düşük veri türünün (tamsayı) daha yüksek veri türüne (kayan
nokta) dönüştürülmesini desteklediği bir örnek inceleyelim.

Kod:
sayi_int = 123
sayi_flo = 1.23

sayi_yeni = sayi_int + sayi_flo

print("sayi_int veri tipi:",type( sayi_int ) )


print("sayi_flo veri tipi:",type( sayi_flo ) )

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 veri tipi:", type(sayi_int))


print("sayi_str veri tipi:",type(sayi_str))

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.

Açık Tür Dönüşüm (Explicit)


Açık Tür Dönüşümünde, bir nesnenin veri türü gerekli veri türüne kullanıcı tarafından dönüştürülür.
Açık tür dönüştürme işlemi yapabilmek için int(), float(), str(), vb. gibi önceden tanımlanmış fonksiyon-
lar kullanılmaktadır.
Dönüşüm fonksiyonu aşağıdaki şekilde gerçekleştirilir.
<istenen_veri_tipi>(ifade)
Tip dönüşümü, ifadeye ihtiyaç duyulan veri tipi fonksiyonu atanarak yapılabilir. Bir örnek üzerinde
inceleyelim.

Kod:
sayi_int = 321
sayi_str = "987"

print("sayi_int veri tipi:",type(sayi_int))


print("Tür dönüşümünden önce sayi_str veri tipi:",type(sayi_str))

sayi_str = int(sayi_str)
print("Tür dönüşümünden sonra sayi_str veri tipi:",type(sayi_str))

sayi_sum = sayi_int + sayi_str

print("sayi_int ve sayi_str toplamları:",sayi_sum)


print("Toplamın veri tipi:",type(sayi_sum))

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'>

Yukarıdaki kod parçasında sayi_str ve sayi_int değişke-


ni tanımlandı. Toplama işlemini gerçekleştirmek için int()
fonksiyonunu kullanarak sayi_str değişkeni string (yüksek)
veri türünden integer (düşük) veri türüne dönüştürüldü. Tür Dönüştürme, nesnenin bir veri türün-
sayi_str değişkeni bir tamsayı değerine dönüştürüldükten den başka bir veri türüne dönüştürülmesidir.
sonra Python bu iki değişkeni toplayabilir. Toplama işlemi
sonucunda sayi_sum değerini ve veri türünü bir tamsayı
olarak elde edilir

20
1
Programlama II

Tablo 1.2 Tür Dönüşüm Fonksiyonları.


Fonksiyon Tanımı
int(x [,base]) x değerini bir tam sayıya dönüştürür. “base” kısmı isteğe bağlı olarak, taban
dönüşümü için kullanılan bir parametredir. base parametresi 2 olarak
kullanıldığında, sayının 2 tabanındaki karşılığı bulunur.
chr(x) Bir sayıyı karaktere dönüştürür.
str(x) x değerini string değere dönüştürür.
repr(x) x değerini bir ifade string’e dönüştürür.
eval(str) Bir string’i değerlendirir ve bir nesne döndürür.
complex(real [,imag]) Kompleks bir sayı üretir.
float(x) x değerini float bir sayıya dönüştürür.
list(x) x değerini list’e dönüştürür.
dict(d) d (key, value) ilişkisi barındıran veriden bir sözlük oluşturur.
tuple(x) x değerini tuple’ye dönüştürür.
set(x) x değerini bir set’e dönüştürür.
frozenset(x) x değerini bir frozen set’e dönüştürür.
unichr(x) x sayısını unicode karakterine çevirir.
ord(x) Verilen bir karakterin unicode sayısal değerini döndürür.
hex(x) Bir sayının onaltılı düzendeki (hexadecimal) karşılığına (string) çevirir.
oct(x) Bir sayıyı sekizli düzendeki (oktal) karşılığına (string) çevirir.

Öğrenme Çıktısı
2 Anahtar kelimelerin ve değişken isimlerinin tanımlamasını kavrayabilme

Araştır 2 İlişkilendir Anlat/Paylaş

Açık tür dönüşümü yapan, Bildiğiniz diğer program-


dict() metodunu kullanarak lama dilleri ile Python di- Tür dönüşümlerine neden ih-
bir sözlük oluşturan Python linin anahtar kelimelerini tiyaç duyulduğunu anlatınız.
kodunu yazınız. karşılaştırınız.

GİRİŞ/ÇIKIŞ (I/O) VE İÇE AKTARMA (IMPORT)


Bu bölümde, Python’da Giriş/Çıkış yani I/O görevini gerçekleştirmek için kullanılan print() ve input()
metodlarını inceleyeceğiz. Bunun yanında, modülleri içe aktarmayı ve bunları program içinde kullanmayı
göreceğiz.
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. İlk olarak çıkışlar için
kullanılan çıktı bölümünü inceleyelim.

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:

print(*nesneler, sep=' ', end='\n', file=[Link], flush=False)

Burada nesneler yazdırılacak değer(ler)dir.


“sep”: Ayırıcı değerler arasında kullanılır. Varsayılan olarak bir boşluk karakterine dönüşür.
“end”: Tüm değerler yazdırıldıktan sonra yazdırılan satır sonu karakteridir. Varsayılan olarak yeni bir
satıra geçer.
“file”: Dosya, değerlerin yazdırıldığı nesnedir ve varsayılan değeri [Link] yani ekrandır.
“flush”: Arabelleğe alınan verilerin çıktı hedefine gönderilmesini sağlamaktadır.

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

String bir ifadeyi biçimlendirmek için anahtar kelime argümanlarını da kullanabiliriz.

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.

İçe Aktarma (Import)


Yazılan kod zaman içinde büyüdükçe kontrol etmesi daha da güç bir hale gelecektir. Böyle bir durumla karşı-
laşmamak için, hazırlanan kodun modüllere ayrılarak daha küçük ve yönetimi kolay parçalara ayrılması önerilir.
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ıyla biter. Bir modülün içindeki tanımlar başka bir modüle veya Python’daki etkileşimli
yorumlayıcıya aktarılabilir. Bunu yapmak için “import” anahtar sözcüğünü kullanırız.
Örneğin, aşağıdaki satırı yazarak matematik modülünü içe aktararak içerdiği özelliklere erişebiliriz:

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

[Link] dosyası içeriği

import sabit_degerler

print('{0} Üniversitesine hoşgeldiniz! {1} Bölümü {2} dönemlik bir bölüm-


dür.'.format(sabit_degerler.UNIVERSITE, sabit_degerler.BOLUM, sabit_degerler.
DONEM_SAYISI ) )

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

Araştır 3 İlişkilendir Anlat/Paylaş

Kullanıcıdan ismini is-


teyerek, başka bir dosya- Kodun modüllere ayrılma-
daki ülke ve başkent bil- sını günlük hayattan bir Modüler programlamanın
gisini girilen isme hitap örnek ile ilişkilendirerek avantajlarından bahsediniz.
edecek şekilde ekrana yazdı- anlatınız.
ran Python kodunu yazınız.

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

Burada +, toplama işlemini gerçekleştiren operatördür. 21 ve 5 işlenenlerdir ve 26 işlemin çıktısıdır.

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.

Tablo 1.3 Aritmetik Operatörler.


Operatör Anlamı Örnek
+ İki işlenen veya tekli toplama x + y+ 2
- Sağ işleneni soldan çıkarma veya tekli çıkarma x - y- 2
* İki işleneni çarpma x*y
/ Sol işleneni sağa bölün (her zaman kayan nokta ile x/y
sonuçlanır)
% Mod alma - sol işlenenin sağ tarafından bölümünden x%y
kalan (x/y bölümünden kalan)
// Kat bölümü - soldaki sayının sağdaki sayıya x // y
bölümünden elde edilen tam sayı sonucu
** Üs - soldaki sayının sağdaki üs değerini hesaplama x**y
(x üssü y)

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.

Tablo 1.4 Karşılaştırma Operatörleri.


Operatör Anlamı Örnek
> Büyüktür - Sol işlenen sağdan büyükse doğru x>y
< Küçüktür - Sol işlenen sağdan küçükse doğru x<y
== Eşittir - Her iki işlenen de eşitse doğru x == y
!= Eşit değil - İşlenenler eşit değilse doğru x != y
>= Büyüktür veya eşittir - Sol işlenen sağa eşit veya büyükse doğru x >= y
<= Küçük veya eşittir - Sol işlenen sağa eşit veya küçükse doğru x <= y

Tabloda verilen karşılaştırma operatörlerinin kod içerisinde kullanımını da bir örnek ile inceleyelim.

Kod:
x = 34
y = 26

print('x > y is',x>y)


print('x < y is',x<y)
print('x == y is',x==y)
print('x != y is',x!=y)
print('x >= y is',x>=y)
print('x <= y is',x<=y)

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.

Tablo 1.5 Mantıksal Operatörler.


Operatör Anlamı Örnek
and Her iki işlenen de doğruysa true x and y
or İşlenenlerden herhangi biri doğruysa true x or y
not İşlenen yanlış ise true (işlenen değerin tersini verir) not x

Tabloda verilen mantıksal operatörlerin kod içerisinde kullanımını da bir örnek ile inceleyelim.

Kod:
x = True
y = False

print('x and y :',x and y)


print('x or y :',x or y)
print('not x :',not x)

Kod Çıktısı:
x and y : False
x or y : True
not x : False

Bitwise (Bitsel) Operatörler


Bitwise operatör, bitler üzerinde çalışır ve bit bit işlem gerçekleştirir. Yani işlem yapılan değerler ikilik
tabandaki verilerdir.
Örnek verecek olursak; a = 26 ve b = 10 değerlerini atayalım. Bu iki değişkenin ikili formatta değerleri
sırasıyla 0001 1010 ve 0000 1010 olacaktır.
Aşağıdaki tabloda Python tarafından desteklenen bitwise operatörler ve kullanım örnekleri bulunmaktadır.
Tabloda kullanmak üzere a ve b değişkenlerini aşağıdaki gibi tanımlayalım.

a = 60 (ikilik tabanda 0011 1100) ve b = 13 (ikilik tabanda 0000 1101)

27
1
Python ile Programlamaya Giriş

Tablo 1.6 Bitwise Operatörler.


Operatör Anlamı Örnek
& (AND) Her iki işlenende de 1 değeri varsa, sonuca 1 (a & b)
değerini, değilse 0 değeri atanır (Değeri 0000 1100)
| (OR) İki işlenenden birinde 1 değeri varsa sonuca 1 (a | b) = 61
değerini kopyalar (Değeri 0011 1101)
^ (XOR) Her iki işlenenin değeri aynı ise ilgili bit değerine (a ^ b) = 49
0, farklı ise 1 değerini kopyalar (Değeri 0011 0001)
~ (Tersini Alma) Tek işlenenlidir ve bitleri ‘ters çevirme’ etkisine (~a) = -61
sahiptir (Değeri 1100 0011, İşaret
bitinin aldığı değer nedeniyle
- işaretli)
<< (Sola Sol işlenenlerin değeri, sağ işlenen tarafından a << 2 = 240 (Değeri 1111
Kaydırma) belirtilen bit sayısı kadar sola taşınır. 0000)
>> (Sağa Sol işlenenlerin değeri, sağ işlenen tarafından a >> 2 = 15 (Değeri 0000
Kaydırma) belirtilen bit sayısı kadar sağa taşınır. 1111)

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.

Tablo 1.7 Atama Operatörleri.


Operatör Örnek Eşdeğer Atama
= x=5 x=5
+= x += 5 x=x+5
-= x -= 5 x=x-5
*= x *= 5 x=x*5
/= x /= 5 x=x/5
%= x %= 5 x=x%5
//= x //= 5 x = x // 5
**= x **= 5 x = x ** 5
&= x &= 5 x=x&5
|= x |= 5 x=x|5
^= x ^= 5 x=x^5
>>= x >>= 5 x = x >> 5
<<= x <<= 5 x = x << 5

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.

Tablo 1.8 Kimlik Operatörleri.


Operatör Anlamı Örnek
is İşlenenler aynıysa true x is True
(aynı nesneye atıfta bulunuyorsa)
is not İşlenenler aynı değilse true x is not True
(aynı nesneye atıfta bulunmuyorsa)

Kod:
x1 = 25
y1 = 25
x2 = 'Merhaba'
y2 = "Merhaba"
x3 = [10,20,30]
y3 = [10,20,30]

print(x1 is not y1)


print(x2 is y2)
print(x3 is y3)

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ş

Tablo 1.9 Üyelik Operatörleri.


Operatör Anlamı Örnek
in Dizide değer/değişken bulunursa True 5 in x
not in Değer/değişken dizide bulunmazsa True 5 not in x

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

Python Nedir, Ne İşe Yarar? Python Kullanım Alanları


Python Ne İşe Yarar?
Python programlama dili ile birlikte Web programlama, masaüstü programlama ve mobil prog-
ramlama gibi birçok alanda kullanımı yapılmaktadır. Python programlama dili, diğer programlama
dillerine göre çok daha basit bir söz dizilimine sahiptir. Basit olması hiç bir zaman sizi yanıltmasın ki
Python bir çok projenin üstesinden gelebilecek düzeyde bir programlama dilidir.
Python Kullanım Alanları
Python çok çeşitli uygulamalar geliştirilebilen güçlü bir programlama dilidir. Yazılım geliştiricileri-
nin Python’ u tercih etmesi için bir çok neden bulunmaktadır. Bunlardan en başlıca sebepleri python
programlama dilinin esnek bir yapıya sahip olması ile birlikte hem en güçlü hem de en basit kod kütüp-
haneleri ve frameworkleri bulundurmasıdır.
Python’un Önemli Avantajları
Python, üst düzey bir programlama dilidir. Söz diziminin ingilizceye benziyor olması da komut satır-
larının okunması ve kolay anlaşılabilir bir programlama dilidir. Bu nedenle programlamaya yeni başlaya-
cak olan kişilere genel olarak Python tavsiye edilmektedir. Bu da Python’u öğrenmenin en önemli avan-
tajlarından birisi haline getiriyor. Aşağıda Python’ un önemli avantajları ile ilgili bilgilere yer verilmiştir.

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

Araştır 4 İlişkilendir Anlat/Paylaş

Bir sözlük (dictionary) içe-


Günlük hayatta “in” ve “not Operatörlerin programlama
risindeki elemanlardan veri-
in” karşılığını kullandığınız dilleri açısından önemini
len anahtar (key) ile arama
bir örnek veriniz. anlatınız.
yapan kodu hazırlayınız.

31
1
Python ile Programlamaya Giriş

Python programlama dilinin


1 ve kod geliştirme arayüzünün
kurulumunu gerçekleştirebilme
öğrenme çıktıları ve bölüm özeti

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.

Anahtar kelimelerin ve değişken


2 isimlerinin tanımlamasını
kavrayabilme

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

Giriş / çıkış fonksiyonlarının ifade


3 edilebilmesi ve harici modüllerin kod
içerisinde kullanılmasını kavrayabilme

öğrenme çıktıları ve bölüm özeti


Giriş/Çıkış (I/O) ve İçe Aktarma
(Import)

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.

4 Python dilinde kullanılan operatörlerin


kullanım alanlarını ifade edebilme

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ş

1 I. Yüksek seviyeli bir dildir


II. Derleme yerine yorumlanır
neler öğrendik?

III. Sadece Linux ortamında çalışır


Yukarı maddelerden hangileri Python programlama dili için doğrudur?
A. Yalnız I B. Yalnız II C. I ve II D. II ve III E. I, II ve III

2 Aşağıdaki maddelerden hangisi Python programlama dili için söylenemez?


A. Yazım kuralları basittir
B. Satır sonlarına noktalı virgül işareti konulmalıdır
C. Farklı platformlarda çalışabilir
D. Kodlar yorumlanarak çalıştırılır
E. Otomatik çöp toplama desteği vardır

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__)

Yukarıdaki kod parçasının çıktısı aşağıdaki seçeneklerden hangisidir?


A. double değer hesaplayan fonksiyon
B. double.__doc__
C. 2 * num
D. 2
E. double(num)

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

7 print(1, 2, 3, 4, sep='#', end='!')

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

9 I. a or b bitsel bir işlemdir


II. a % b aritmetik bir işlemdir
III. a == b karşılaştırma işlemidir
Python programlama dilinde yapılan yukarıdaki seçeneklerdeki işlemlerden hangileri doğrudur?
A. Yalnız I
B. Yalnız II
C. I ve II
D. II ve III
E. I ve III

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ı

Yanıtınız yanlış ise “Giriş/Çıkış (I/O) ve İçe


2. B Yanıtınız yanlış ise “Python Özellikleri” ko- 7. A
Aktarma (Import)” konusunu yeniden göz-
nusunu yeniden gözden geçiriniz.
den geçiriniz.

Yanıtınız yanlış ise “Giriş/Çıkış (I/O) ve İçe


3. D Yanıtınız yanlış ise “Temel Kavramlar” ko- 8. C
Aktarma (Import)” konusunu yeniden göz-
nusunu yeniden gözden geçiriniz.
den geçiriniz.

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

• Python 2’de print fonksiyonu () almazken, Python 3’de () kullanılmaktadır


• Python 2 ile Python 3’deki tamsayı bölmelerinin sonuçları farklı çıkabilir
• Python 3’de Unicode(utf-8), byte ve bytearrays gelmiştir.

Araştır 2

sozluk = {'car':'araba','apple':'elma', 'table':'masa', 'course':'ders'}


print(type(sozluk ))

print("sozluk [apple] = ", sozluk ['apple'])

36
1
Programlama II

Araştır Yanıt
1 Anahtarı

Araştır 3

sabit_degerler.py
ULKE = "Türkiye"
BASKENT = "Ankara"

[Link] dosyası içeriği


import sabit_degerler
isim = input('İsminizi giriniz: ')
print( sabit_degerler.ULKE, "'nin başkenti ", sabit_degerler.
BASKENT,"'dır, ", isim )

Araştır 4

sozluk = {1:'değer','anahtar':2.6, 'Başkent':'Ankara'}


print('Başkent' in sozluk )

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.

Şekil 2.1 if Kontrolü Akış


Diyagramı.

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.

if…else İfadesi Sözdizimi:


if test ifadesi:
if bloğu
else:
Test Yanlış
else bloğu İfadesi

if..else ifadesi, test ifadesini değerlendirir ve yalnızca test


koşulu True (doğru) olduğunda if bloğu yürütür. Koşul Fal- Doğru
se (yanlış) ise, else bloğu yürütülür. Aynı şekilde if ve else
ifadelerinden sonra yapılan girintiler, kod bloklarını ayır-
mak için kullanılır. İf bloğu else bloğu

Şekil 2.2 if…else Kontrolü Akış Diyagramı.

40
2
Programlama II

Kod:
# sayının pozitif mi negatif mi olduğunu kontrol ederek
# uygun mesajı verelim

sayı = 7

# Bu iki değeri sırayla vererek test edin


# sayı = 0
# sayı = -9

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.

if…elif…else İfadesi Sözdizimi:


if test ifadesi:
if bloğu
elif test ifadesi:
elif bloğu
else:
else bloğu Test Yanlış
İfadesi
Elif, else if ’nin kısaltmasıdır.
Birden fazla ifadenin kontrol edil-
mesini sağlar. if koşulu yanlış ise, Doğru
bir sonraki elif bloğunun durumu- Test Yanlış
nu kontrol etmektedir. Tüm koşul- İf bloğu İfadesi
elif
lar False (yanlış) ise, else öğesinin
gövdesi yürütülür.
Doğru
Birkaç if...elif...else bloğundan
sadece biri koşula göre yürütülür.
elif bloğu else bloğu
if bloğunda yalnızca bir else bloğu
olabilir. Ancak birden fazla elif blo-
ğuna sahip olabilir.

Şekil 2.3 if…elif…else Kontrolü Akış Diyagramı.

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

# Bu iki farklı değeri de deneyelim:


# sayı = -56.3
# sayı = 0

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
'''

sayı = float(input("Bir sayı giriniz: "))


if sayı >= 0 :
if sayı == 0:
print("Sıfır")
else:
print("Pozitif sayı")
else:
print("Negatif sayı")

42
2
Programlama II

Kod Çıktısı:
Bir sayı giriniz: -127
Negatif sayı

Bir sayı giriniz: 0


Sıfır

Bir sayı giriniz: 57


Pozitif 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ı?

for: Bir döngü başlatır


Hayır
değer: Döngünün her bir yenilemesinde sıradaki değeri alan geçici
bir değişkendir
in: İşlem yapılacak her bir değeri diğerlerinden ayırır Döngü gövdesi
liste: Sıralı olarak üzerinde işlem tekrarı yapmak istenilen nesnedir
İki nokta üst üste: altındaki sekme ile belirtilmiş kod bloğunun
Döngüden
çalıştırılma talimatını verir çık
döngü gövdesi: Tekrar edilerek yapılması istenen işlemlerin yazıl-
Şekil 2.4 for Döngüsü Akış
dığı kod bloğudur
Diyagramı.

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]

# toplam değeri tutan değişken


toplam = 0

# liste üzerinde işlem


for deger in sayılar:
toplam = toplam + deger

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" ]

# liste üzerinde indis kullanarak ilerleyelim


for i in range( len( tür ) ):
print( tür[i],"müziğini severim" )

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'

notlar = {'Handan': 90, 'Semra': 75, 'Kamil': 67}

for öğrenci in notlar:


if öğrenci == öğrenci_adı:
print(notlar[öğrenci])
break
else:
print('Bu isimde kayıt bulunamadı.')

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 Döngüsü Sözdizimi:


while
while test ifadesi: döngüsüne giriş
kod bloğu

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

Şekil 2.5 while Döngüsü Akış


Diyagramı.

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

# Kullanıcıdan girdi alınması


n = int(input("n değerini girin: "))

# toplamı ve sayacı başlat


toplam = 0
i = 1

while i<= n:
toplam = toplam + i # her bir i değerinin toplam değere eklenmesi
i = i + 1 # sayaç değerini arttırma

# toplam değerinin yazdırılması


print("Toplam:", toplam)

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

while sayac < 5:


print("while bloğu içinde, sayaç:", sayac)
sayac = sayac + 1
else:
print("else bloğu içinde")

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 ve continue Deyimleri


Python’da break ve continue ifadeleri normal bir döngünün akışını değiştirmek için kullanılmaktadır.
Döngüler, test ifadesi yanlış olana kadar bir kod bloğunu tekrar tekrar çalıştırır. Ancak, bazen mevcut yi-
nelemeyi veya tüm döngüyü test ifadesini kontrol etmeden sonlandırmak zorunda olduğumuz durumlar
olabilir. Böyle durumlarda break ve continue ifadeleri kullanılır.

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

Şekil 2.6 break İfadesi Akış Diyagramı.


while sayac < 10 :
if sayac % 4 == 0 :
break
print( sayac )
sayac = sayac + 1

print("while bloğundan sonra")

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.

continue Deyimi Sözdizimi:


Döngüye giriş
continue

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.

pass Deyimi Sözdizimi:


pass

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",
}

return [Link](argument, "Bulunamadı...")

status = input("Trafik ışığı sırasını giriniz:")


print ( trafik_isigi( int( status ) ) )

50
2
Programlama II

Kod Çıktısı:
Trafik ışığı sırasını giriniz:3
Yeşil

Trafik ışığı sırasını giriniz:4


Bulunamadı…

Öğ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

Araştır 1 İlişkilendir Anlat/Paylaş

Bir while döngüsü içinde,


kullanıcıdan 5 ile 10 karak- Sonlu bir döngü ifadesini Günlük hayatta kontrol
ter arasında bir şifre oluş- atılan adım ve gidilecek yol yapılarını kullandığınız bir
turmasını isteyen Python ile ilişkilendiriniz. durumu anlatınız.
kodunu hazırlayınız.

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))

print('id(30) =', id(30))

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 a=a+10 b=20

a 20 20 b 20

a 30 a 30

Şekil 2.8 Python’daki değişkenlerin bellek diyagramı.

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 = 'Merhaba Python kodlayanlar!'


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ü

Farklı ad alanları belirli bir zamanda bir


arada bulunabilir ancak birbirinden tamamen
yalıtılmış şekildedirler. Yani ad çakışmalarının
olmaması sağlanmaktadır. Python yorum- Built-in (Öntanımlı)
layıcısını başlattığımızda tüm yerleşik, yani Namespace
Python içerisinde ön tanımlı olarak gelen ad-
ları içeren bir ad alanı oluşturulur ve yorum-
layıcı çalıştığı sürece varlığını devam ettirir.
Böylece id(), print() vb. gibi yerleşik işlevler Modül: Global
programın herhangi bir bölümünden her za- (Genel) Namespace
man kullanılabilir şekilde bulunmaktadır.
Her modül kendi global ve yalıtılmış ad
alanını oluşturmaktadır. Böylece farklı mo- Fonksiyon:
düllerde bulunabilecek aynı isim çakışmasının Local (Yerel)
önüne geçilmektedir. Namespace

Modüllerin çeşitli işlevleri ve sınıfları ola-


bilir. Bir işlev çağrıldığında, içinde tanımlanan
tüm adlara sahip yerel bir ad alanı oluşturulur.
Sınıflarda da benzer bir durum vardır. Şekil 2.9 Python’daki Çeşitli Ad Alanları.

Python Değişken Kapsamı (Scope)


Program içinde tanımlanmış bir değişkenin erişilebilir olduğu alan için kullanılan bir kavramdır. Ta-
nı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.
Kapsam, bir programın herhangi bir önek olma-
dan bir ad alanına doğrudan erişilebildiği kısımdır.
Herhangi bir anda, en az üç iç içe kapsam vardır.
dikkat
1. Yerel adlara sahip mevcut fonksiyonun kapsamı İşlev, metot ve fonksiyon aynı kavramı ifade etmek
2. Global isimlere sahip modülün kapsamı için kullanılan farklı isimlerdir.
3. Yerleşik/Öntanımlı adlara sahip en dıştaki
kapsam
Bir fonksiyon içinde bir değişkene başvuru yapıldığında, ilk önce yerel ad alanında, ardından global ad
alanında ve son olarak yerleşik ad alanında aranır. Başka bir fonksiyonun içinde bir fonksiyon varsa, yerel
kapsamın içine yeni bir kapsam yerleştirilir.

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

Algoritmaların Hayatımızdaki Yeri ve Önemi


Bilgisayarlar verilen talimatları ve tekrar eden görevleri çok hızlı bir şekilde adım adım uygulayabilen
makinalardır. Bilgisayarların bu hızlarından yararlanabilmek için net bir şekilde tanımlanmış talimatlara
yani algoritmalara ihtiyaç vardır. Bu nedenle algoritma mantığını anlamak ve gerekli algoritmaları geliş-
tirebilmek çok önemlidir. Algoritmalar modern kullanımlarına rağmen aslında bilgisayardan çok eskidir.
Algoritmalar çözülmesi gereken problemler için genel bir çözüm oluşturmaktadır. Bu durum hem modern
hem de eski algoritmalar için geçerlidir. Gerek günlük hayatımızda karşılaşmakta olduğumuz problemle-
rin çözümünde gerek dijital çağımıza yeni katkılarda bulunabilmek için algoritmaları benimseyerek hayatı
kolaylaştırabilecek algoritma geliştirebilmek inanılmaz derecede bir öneme sahiptir.
Algoritma, sonlu bir işi tanımlamada kullanılan, açık bir şekilde tanımlanan ve sıralı aşamalardan
oluşan yapılara denmektedir. Algoritmalar programlamanın tasarımında faydalanılan ve programın ge-
liştirilmesi için gereken aşamaların kendi dilimize uygun bir biçimde anlatıldığı yapılardır. Program-

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

Araştır 2 İlişkilendir Anlat/Paylaş

İç içe geçmiş ad alanlarına Ad alanlarının kullanımına İç içe geçen ad alanlarındaki


örnek bir kod yazarak açık- benzer şekilde kullanılan bir değişkenlere erişim izinleri-
layınız. işaretleme yöntemi araştırınız. ni araştırınız.

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

2 Farklı döngü ifadelerinin


kullanımını kavrayabilme

Döngü içerisinde kullanılan


3 özel ifadelerin kullanımını
kavrayabilme

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

öğrenme çıktıları ve bölüm özeti


Ad ve Ad Alanı (Namespace)

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ü

1 a = 50 4 meyveler = ["armut", "elma", "por-


b = 10 takal", "şeftali"]
.... a .... b ....
neler öğrendik?

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

7 2numaralı-derslik_kapasitesi = 40 9 def dis_fonk():

Yukarıda verilen Python değişken tanımı için aşa- b = 20

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

Yukarıdaki Python kodu için aşağıdakilerden han-


gisi söylenemez?
A. a değişkeni global ad alanında tanımlıdır
B. b değişkeni, dış fonksiyon olarak tanımlı dis_
fonk() öğesinin yerel ad alanındadır
C. c değişkeni, dış fonksiyonun içindeki bir iç
fonksiyon olan ic_fonk() öğesinin içinde ta-
nımlanmıştır
D. c değişkeni, iç içe yerel ad alanındadır
E. ic_fonk fonksiyonundan a değişkenine değer
ataması yapılabilir

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

Örnek kodda, değişkenler global_degisken, global ad alanında tanımlanmış-


tır. dis_degisken ise dis_fonksiyon fonksiyonunun yerel ad alanında tanımlan-
mıştır. ic_degisken ise, ic_fonksiyon fonksiyonunun yerel değişkenidir, ayrıca
iç içe yerel ad alanında tanımlanmıştır.

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 Fonksiyon türlerini inceleyerek farklarını


kavrayabilme

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

Anahtar Sözcükler:• Fonksiyon • Metot • Modül • Özyineleme • Lambda • Package • Pip


• Paket Yükleme • Import • Dahil Etme

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

Yukarıdaki fonksiyon tanımındaki deyimleri şu şekilde açıklayabiliriz:


def: Fonksiyon başlığının başlangıcını işaretleyen anahtar sözcüktür.
fonksiyon_adı: Fonksiyonu benzersiz şekilde tanımlamak için kullanılan bir tanımlamadır. Fonksiyon
isimlendirme, Python’da değişken isimlendirme ile aynı kuralları izler.
parametre(ler): Bir fonksiyona iletmek istediğimiz değerlerdir. İsteğe bağlı olarak kullanılır.
İki nokta üst üste (:): Fonksiyon başlığının sonunu işaretlemek için kullanılır.
docstring (Yorum satırı): Fonksiyonun parametreleri ve fonksiyonun görevini açıklamak için isteğe
bağlı yazılan açıklamaları içerir.
kod bloğu: Fonksiyon gövdesini oluşturan bir veya daha fazla geçerli python ifadesine verilen isimdir.
İfadeler aynı girinti düzeyine sahip olmalıdır (genellikle 4 boşluk veya 1 tab girintisi).
return: Fonksiyondan bir değer döndürmek için isteğe bağlı olarak kullanılabilen bir dönüş ifadesidir.

Kod:
def selamlama( isim ):
"""
Bu fonksiyon, parametre olarak girilen kişiye selam verir
"""
print("Merhaba, " + isim + ". Günaydın!")

isim = input("Lütfen isminizi giriniz:")


selamlama( isim )

65
3
Fonksiyonlar

Kod Çıktısı:
Lütfen isminizi giriniz: Hüsrev Paşa
Merhaba, Hüsrev Paşa. Günaydın!

Bir fonksiyon tanımladıktan sonra, fonksiyon baş- dikkat


ka bir fonksiyondan, programdan ve hatta Python ko- Python’da, fonksiyon tanımı her zaman fonksiyon
mut isteminden çağrılabilir. Bir fonksiyonu çağırmak çağrısından önce bulunmalıdır. Aksi takdirde yo-
için, uygun parametrelerle birlikte fonksiyon adının rumlayıcı fonksiyon bulunamadı hatası verecektir.
yazılması yeterlidir.

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)

Şekil 3.1 Python’da fonksiyonların çalışma şekli.

66
3
Programlama II

Değişkenlerin Kapsamı ve Ömrü


Bir değişkenin kapsamı, bir programın değişkenin değer ataması yapılabildiği, yani yorumlayıcı tarafın-
dan tanındığı kısmıdır. Bir fonksiyon içinde tanımlanan parametreler ve değişkenler fonksiyonun dışından
görünmez yani erişilemez. Bu nedenle, yerel bir kapsamları vardı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. Fonksiyondan dönüldüğünde yok edilirler.
Bu sebeple, bir fonksiyon daha önce yapılan çağrılarından bir değişkenin değerini tutamaz.

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;

Kullanıcı Tanımlı Fonksiyonlar


Kullanıcılar tarafından oluşturulan fonksiyonlardır. Belirli bir görev için hazırlanmış fonksiyonlar, kul-
lanıcı tanımlı fonksiyonlar olarak adlandırılır.
Python ile öntanımlı olarak gelen fonksiyonlara yerleşik, dahili fonksiyonlar denir. Kütüphane biçi-
minde başkaları tarafından yazılan fonksiyonlar ise, kütüphane fonksiyonları olarak adlandırılabilir. Kendi
ihtiyacımız için hazırlanan fonksiyonlar da bir başkası için kütüphane işlevi görebilir.
Kullanıcı tanımlı fonksiyonların avantajları:
• Kullanıcı tanımlı fonksiyonlar, büyük bir programı küçük bölümlere ayırmaya yardımcı olur, bu da
programın anlaşılmasını, bakımını ve hata ayıklamasını kolaylaştırır.
• Bir programda tekrarlanan kod oluşursa, bu kodlar bir fonksiyona dahil edilerek, ihtiyaç duyulan
yerlerde bu fonksiyon çağrılabilir.
• Büyük proje üzerinde çalışan programcılar, farklı fonksiyonlar yaparak iş yükünü bölebilir.

67
3
Fonksiyonlar

Dahili (Built-in) Fonksiyonlar


Python dilinin kullanıma hazır çeşitli fonksiyonları vardır. Bu fonksiyonlara yerleşik, dahili, ön tanımlı
fonksiyonlar denir. Bu hazır fonksiyonlara birkaç örnek verelim:
abs(): Bir sayının mutlak değerini döndürür
any(): Bir listedeki herhangi bir nesnenin doğru (true) olup olmadığını kontrol eder
chr(): Bir tam sayıdan bir karakter (bir dize) döndürür
hex(): 10 tabanındaki bir sayıyı 16 tabanına dönüştürür
input(): Bir satırlık metni okur ve döndürür
len(): Nesnenin uzunluğunu verir
open(): Bir dosya nesnesi döndürür
print(): Parametre olarak verilen nesneyi yazdırır

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)

isim = input("Lütfen isminizi giriniz: ")


mesaj = input("Lütfen mesajı giriniz: ")
selamlama( 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.

Tek parametre ile fonksiyon çağrılması

>>> selamlama( "Osman" )


Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: selamlama() missing 1 required positional argument: 'mesaj'

68
3
Programlama II

Parametresiz fonksiyon çağrılması

>>> selamlama( )
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: selamlama() missing 2 required positional arguments: 'isim' and 'mesaj'

Değişken Sayıda Fonksiyon Argümanları


Şimdiye kadar, fonksiyonların aldığı sabit sayıda argüman kullanımı incelendi. Python’da değişken
sayıda argüman alabilen bir fonksiyon tanımlamanın başka yolları da vardır. Bu tipin üç farklı kullanım
şeklini inceleyelim.

Python Varsayılan Argümanlar


Python’da parametreler varsayılan değerlere sahip olabilir. Atama operatörü (=) kullanılarak bir argü-
mana varsayılan bir değer sağlanabilir.

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)

isim = input("Lütfen isminizi giriniz: ")


selamlama( isim )
selamlama( isim, "Herkese benden çay!" )

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ı:

def selamlama( mesaj = "Merhaba", isim ):

69
3
Fonksiyonlar

Python yorumlayıcısı şu hatayı verecektir:

Traceback (most recent call last):


File "[Link]", line 1
def selamlama( mesaj = "Merhaba", isim ):

SyntaxError: non-default argument follows default argument

Python Anahtar Kelime Argümanları


Bazı değerlere sahip bir fonksiyon çağırdığımızda, bu değerler konumlarına göre argümanlara atanır.
Örneğin, kod örneğimizdeki selamlama() fonksiyonu, selamlama(“Bülent”, “Nasılsın?”) olarak çağrıl-
dığında, isim argümanına “Bülent” değeri atanır ve benzer şekilde “Nasılsın?” değeri de mesaj argümanına
aktarılır.
Python, işlevlerin anahtar kelime argümanları kullanılarak çağrılmasına izin vermektedir. Fonksiyonlar
bu şekilde çağrıldığında argümanların sırası (konumu) değiştirilebilir. Örnek koddaki fonksiyona yapılan
aşağıdaki çağrıların tümü geçerlidir ve aynı sonucu verir.

Kod:
# 2 anahtar kelime argümanlı
selamlama( isim="Fatih", mesaj="Okumak bir yaşam felsefesidir..." )

# 2 anahtar kelime argümanlı (sırasız)


selamlama( mesaj="Okumak bir yaşam felsefesidir...", isim="Fatih" )

# 1 doğru konumda, 1 anahtar kelime argümanlı


selamlama( "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.

selamlama( isim = "Fatih", "Okumak bir yaşam felsefesidir..." )

Örnek fonksiyonu bu şekilde çağırdığımızda Python yorumlayıcısı şu hatayı verecektir:

Traceback (most recent call last):


File "[Link]", line 21
selamlama( isim = "Fatih", "Okumak bir yaşam felsefesidir..." )

SyntaxError: positional argument follows keyword argument

Python İsteğe Bağlı Argümanlar


Bazen bir fonksiyona geçirilecek argüman sayısı önceden bilinmeyebilir. Python, bu tür durumları,
isteğe bağlı sayıda argüman içeren fonksiyon çağrıları yoluyla ele alınmasını sağlar. Fonksiyon tanımında,
bu tür bir argümanı belirtmek için parametre adından önce bir yıldız işareti (*) kullanılı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 )

selamlama( "Harun", "Kerem", "Nurullah", "Mustafa", "Orkun" )

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.

Özyinelemeli Fonksiyonlar (Recursive)


Python’da bir fonksiyonun içerisinden diğer fonksi- def ozyineleme():
yonların çağrılabilmesinin yanında, fonksiyonun kendisi-
ni çağırması da mümkündür. Bu tür yapılar özyinelemeli Özyinelemeli
fonksiyon
fonksiyonlar olarak adlandırılır. Python kodu çağrısı
Özyineleme, bir şeyi kendi içerisinde tanımlama süre-
cidir. Daha kolay anlaşılması amacıyla fiziksel dünyadan ozyineleme()
bir örnek verebiliriz. Birbirine paralel olarak konumlan-
Python kodu
dırılmış iki ayna olduğunu düşünelim. Aynaların arasına
konulan herhangi bir nesne, özyinelemeli olarak her iki
aynada da yansıyacaktır.
ozyineleme()
Aşağıdaki görüntü, özyineleme adı verilen özyineleme-
li bir işlevin çalışmasını göstermektedir. Şekil 3.2 Özyinelemeli fonksiyon çalışma şekli.

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 fonksiyonun söz dizimi

lambda argümanlar: ifade

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

print( "7 sayısının karesi:", kareAl( 7 ) )

Kod Çıktısı:
7 sayısının karesi: 49

Örnek kodda lambda x: x * x, lambda fonksiyonudur. Burada x argümandır ve x * x, değerlendirilen


ve döndürülen ifadedir. Bu işlevin adı yoktur. kareAl tanımlayıcısı, kendisine atanan bir fonksiyon nesnesi
döndürür. Böylece kareAl ifadesini normal bir fonksiyon olarak adlandırabiliriz. İfade

kareAl = lambda x : x * x

ile

def kareAl():
return x * x

ifadeleri birbirleri ile hemen hemen aynıdır.


Kısa bir süre için isimsiz bir fonksiyona ihtiyaç duyduğumuzda lambda fonksiyonlarını kullanırız.
Python’da bunu genellikle daha yüksek dereceli bir fonksiyonun (diğer fonksiyonları bağımsız değişken
olarak alan bir fonksiyon) argümanı olarak kullanırız. Lambda işlevleri, filter(), map() vb. gibi yerleşik
fonksiyonlarla birlikte kullanılır.

filter() fonksiyonu Örneği


Python’daki filter() fonksiyonu, bir fonksiyonu ve bir listeyi argüman olarak alır. Fonksiyon, listedeki
tüm öğelerle birlikte çağrılır ve fonksiyonun Doğru olarak değerlendirdiği öğeleri içeren yeni bir liste
döndürür.

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]

yeni_liste = list( filter( lambda x: ( x % 2 == 0 ) , sayı_listesi ) )

print( yeni_liste )

Kod Çıktısı:
[4, 6, 8, 12]

map() fonksiyonu Örneği


Python’daki map() fonksiyonu, bir fonksiyon ve bir liste alır. Fonksiyon, listedeki tüm öğelerle birlikte
çağrılır ve her öğe için o fonksiyon tarafından döndürülen öğeleri içeren yeni bir liste döndürülür.
Örnek olarak bir listedeki tüm öğelerin iki katını hesaplamak için map() fonksiyonunun kullanımını
inceleyelim.

Kod:
# map() fonksiyonu kullanarak bir listedeki her bir öğenin iki katını bulan program

sayı_listesi = [7, 13, 51, 4, 9, 3, 11, 2, 19]

yeni_liste = list( map( lambda x: x * 2 , sayı_listesi ) )

print( yeni_liste )

Kod Çıktısı:
[14, 26, 102, 8, 18, 6, 22, 4, 38]

global, local ve nonlocal Anahtar Kelimeleri


Python programlama diline değişkenlerin program içindeki kapsamlarını bildiren anahtar kelimeler
mevcuttur. Bunları sırayla inceleyelim.

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.

Kod - [Link] dosya içeriği:


x = 1
y = "boş"

Kod - [Link] dosya içeriği:


import config

config.x = 20
config.y = "metin"

Kod - [Link] dosya içeriği:


import config

print(config.x)
print(config.y)

import guncelleme

print(config.x)
print(config.y)

75
3
Fonksiyonlar

[Link] dosyası çalıştırıldığı zaman ekrana yazdırılacak çıktı şu şekilde olacaktır:

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

print("İç fonksiyon çağrısından önce x:", x)


ic_fonk()
print("İç fonksiyon çağrısından sonra x:", x)

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.

Local (Yerel) Değişkenler


Fonksiyon gövdesinde veya yerel kapsamda bildirilen bir değişken, yerel değişken olarak adlandırılı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.

Nonlocal (Yerel Olmayan) Değişkenler


Yerel kapsamı tanımlanmamış iç içe fonksiyonlarda yerel olmayan değişkenler kullanılır. Bu, değişke-
nin ne yerel ne de global kapsamda olamayacağı anlamına gelir. Yerel olmayan değişkenler oluşturmak için
nonlocal anahtar kelimesi kullanılmaktadır.
Python’da yerel olmayan bir değişkenin nasıl kullanıldığına dair bir örnek inceleyelim.

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

Araştır 1 İlişkilendir Anlat/Paylaş

Bildiğiniz başka bir prog- İsteğe bağlı parametrelerde


Özyinelemeli bir fonksiyon
ramlama dili varsa, Python hangi durumlara dikkat et-
hazırlayarak nasıl çalıştığını
dilindeki fonksiyon türleri mek gerekmektedir, payla-
kısaca açıklayınız.
ile karşılaştırma yapınız. şınız.

MODÜL YAPISI (MODULE)


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.
Python kodunu içeren bir dosya, örneğin: [Link], modül olarak adlandırılır ve modül adı “islemler” olur.
Büyük programları küçük yönetilebilir ve düzenlenmiş dosyalara bölmek için modüller kullanılmak-
tadı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 kul-
lanabilmek için import anahtar kelimesi ile koda dahil edilirler.

Kod - [Link] dosya içeriği:


def topla( a, b ):
""" Bu fonksiyon verilen iki sayının toplamını döndürür """
sonuc = a + b
return sonuc

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

import Anahtar Kelimesi


Bir modülün içindeki tanımlar, başka bir modüle veya Python’daki etkileşimli yorumlayıcıya aktarıla-
bilir. Bunu yapmak için import anahtar sözcüğü kullanılmaktadır. Python komut satırında modül dahil
ederek fonksiyonlarını kullanmayı bir örnek ile inceleyelim.

>>> import matematik

Ö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.

Python import İfadesi


Pyhton’da hazırlanmış bir modül, import deyimi kullanılarak içe aktarılabilir ve nokta operatörü kulla-
nılarak içindeki tanımlara erişilebilir. Örnek programda, Python dilinde tanımlanmış, matematiksel ifade-
leri içeren “math” modülünü programa dahil ederek, içerdiği fonksiyonlara “.” operatörü vasıtasıyla erişimi
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

Yeniden Adlandırarak İçe Aktarma


Python’da bir modül, farklı bir isimlendirme ile programa aktarılabilir. Kod içerisinden de yeni verilen
isim üzerinden “.” operatörü vasıtasıyla içerdiği fonksiyonlara erişilebilir. Artık yapılacak tüm işlemler,
modülün yeni adı üzerinden yapılmalıdır. Eski modül adının bir geçerliliği yoktur.

Kod:
# yeniden isimlendirme ile modülün içe aktarımı
import math as m

print("Pi sabiti değeri:", [Link])


print("5! değeri:", [Link](5)) dikkat
Yeniden isimlendirilen bir modüle artık eski
Kod Çıktısı: ismi ile bir çağrı yapılamaz. Yeni ismi üze-
Pi sabiti değeri: 3.141592653589793 rinden işlemler gerçekleştirilmelidir.
5! değeri: 120

80
3
Programlama II

Python from...import İfadesi


Python dilinde, modülü bir bütün olarak içe aktarmadan sadece ihtiyaç duyulan belirli fonksiyonları
içe aktarabiliriz.

Kod:
# math modülünden sadece karekök almaya yarayan sqrt fonksiyonunu alalım

from math import sqrt


print("256 sayısının karekökü:", sqrt(256))

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:

>>> from math import pi, e, sqrt as karekok


pi
3.141592653589793
>>> e
2.718281828459045
>>> karekok(16)
4.0

Örnek kodda e ve pi sabitlerine direk erişerek yazdırabildiğimiz gibi, sqrt fonksiyonunu da yeniden
adlandırarak karekok şeklinde kullanabiliriz.

Tüm Tanımlamaların İçe Aktarımı


Aşağıdaki yapıyı kullanarak tüm adları (tanımları/fonksiyonları) bir modülden içe aktarabiliriz:

Kod:
# standart math modülündeki tüm tanımlamaları içe aktarır

from math import *


print("Pi sabiti değeri:", pi)
print("25 sayısının karekökü:", sqrt(25))

Ö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.

Yeniden Yükleme (Reload) İşlevi


Python yorumlayıcısı, bir oturum sırasında bir modülü yalnızca bir kez içe aktarır. Böylece kodlar
tekrar dahil edilmediği için, yorumlama işlemleri daha verimli hale gelmektedir. Bu durumun çalışmasını
gösteren bir örnek inceleyelim.
test_modul adlı bir modülde aşağıdaki kodun olduğunu varsayalım.

81
3
Fonksiyonlar

Kod - test_modul.py Dosyası İçeriği


# Bu modül çoklu içe aktarım durumunu gözlemlemek için oluşturulmuştur

print("Bu kod parçası çalıştırıldı")

Şimdi de çoklu içe aktarımı test edelim.

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

Araştır 2 İlişkilendir Anlat/Paylaş

Bir dairenin çevresi ve alanı-


nı hesaplayan [Link] adın-
da bir modül oluşturarak, Modül yapısı ile gerçek ha-
Modül kullanmak her zaman
[Link] adında bir dosyaya yattaki kütüphane arasında-
faydalı mıdır? Anlatınız.
dahil ederek bu alan ve çev- ki ilişkiyi anlatınız.
re fonksiyonlarını kullanan
kodları hazırlayınız.

82
3
Programlama II

PAKET YAPISI (PACKAGE)


Bilgisayar ortamında, benzer nesneler daha hızlı erişim ve kategorizasyon için genellikle aynı isimli kla-
sör yapıları içerisinde saklanır. Örneğin tüm fotoğrafları bir klasör altında tutabiliriz. Python programlama
dilinde de, bir dizin yapısı altında toplanmış, birbiri ile bağlantılı, alakalı modüllere paket adı verilmekte-
dir. Dolayısıyla, paket modüllerden oluşan bir yapıdır.
Hazırladığımız program çok sayıda modülle büyüdüğü için benzer modülleri bir pakete, farklı modül-
leri farklı paketlere yerleştiririz. Bu, bir projeyi (programı) yönetmeyi kolay ve kavramsal olarak net hale
getirecektir.
Benzer şekilde, bir dizin alt dizinleri ve dosyaları içerebileceğinden, bir Python paketinin alt paketleri
ve modülleri olabilir. Python’un bir yapıyı paket olarak kabul etmesi için, __init__.py adlı bir dosya içer-
melidir. Bu dosya boş bırakılabilir, ancak genellikle o paketin başlatma kodu bu dosyaya yerleştirilir.
Bir oyun paketinin yapısını şekil ile inceleyelim.

Paket

Oyun

Alt Paket Alt Paket Alt Paket


_init_.py
Ses Resim Seviye

_init_.py _init_.py _init_.py

[Link] [Link] [Link]

[Link] [Link] [Link]

[Link] [Link] [Link]

Şekil 3.3 Python Programlamada Paket Modül Yapısı.

Modülü Bir Paketten İçe Aktarma


Nokta (.) operatörü kullanılarak paketlerden modüller içe aktarılır. Oyun paketi örneğindeki start mo-
dülünün içe aktarımı şu şekilde olacaktır:

import [Link]

Şimdi de bu modülün altında zorluk_seviyesi() fonksiyonu tanımlanmış olsun. Bu fonksiyona erişmek


için tüm adını yazmamız gerekmektedir.

[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:

from [Link] import start


start.zorluk_seviyesi(3)

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:

from [Link] import zorluk_seviyesi


zorluk_seviyesi(3)

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

Araştır 3 İlişkilendir Anlat/Paylaş

Python’da en çok kullanı-


Paketleri modül bazlı şekil- Paket oluştururken modül-
lan paketleri araştırarak bir
de içe aktarmanın faydaları- lerin gruplama kriterleri ne-
tanesini yazdığınız kodda
nı anlatınız. dir, anlatınız.
içeri aktarınız.

PAKET YÖNETİCİSİ (PIP)


Python dilinde uygulama geliştirenler, kendi hazırladıkları paketleri diğer kullanıcılarının da erişimine
açabilmektedir. Bu paylaşılan Python paketlerinin yüklenebilmesi amacıyla ortak bir yükleyici oluşturul-
muştur. Bu paket yükleme ortamına “pip” adı verilmektedir. Pip’in “Pip installs Python” ya da “Pip installs
packages” şeklinde açılımları mevcuttur.
Pip, PyPI (The Python Package Index) ortamındaki paketlerin kurulması, güncellenmesi veya kal-
dırılmasını sağlamaktadır. [Link] adresinden işletim sisteminize uygun kurulum kodunun
çalıştırılması gerekmektedir.
Python ortamınızda pip kurulu değilse, pip’in kurulumu için doğrudan pip’in sağlayıcıları tarafından
desteklenen 2 mekanizma vardır.
• ensurepip
• [Link]

ensurepip
Python, bir Python ortamına pip yükleyebilen bir “ensurepip” modülü ile birlikte gelmektedir.

84
3
Programlama II

Linux ortamında

$ python -m ensurepip --upgrade

MacOS ortamında

$ python -m ensurepip --upgrade

Windows ortamında

C:\> py -m ensurepip --upgrade

[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.

Python dilinde modüllerin __path__ özelliği bulunmamaktadır ve erişilmeye çalışıldığında bu hatayı


döndürmektedir.
Paketler için tanımlanmış bu özellik ile paketin hangi klasör yapısı altında bulunduğu verisini elde
etmiştik. Bu klasöre,

C:\\Users\\default\\AppData\\Local\\Programs\\Thonny\\lib\\urllib

yani “urllib” paketi içerisine gittiğimizde karşımıza şu dosyalar çıkacaktır:

[Link]
[Link]
[Link]
[Link]
[Link]
__init__.py

86
3
Programlama II

Paketlerin modüllerden oluştuğundan bahsetmiştik. “urllib” paketi de bu modüllerden oluşmaktadır.


Bu yapı sayesinde, hangi paketin hangi modüllerden oluştuğu görülebilir.

Üçüncü Şahıs Paketleri


Bu paketler, 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.
[Link] adresinde 60 binden fazla, kullanıcılar tarafından hazırlanarak erişime açılmış paket
mevcuttur. Bu paketler kurulmadan önce, ilgili paketin yardım dosyaları ve sitesi incelenerek kurulum
adımlarının takip edilmesi faydalı olacaktır. Bu adresten kurulmak istenen paket adı öğrenilerek, kurulum
komutu ile kurulum tamamlanabilir.

pip3 install paket_adı

Ö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:

pip3 install sphinx

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:

python3 [Link] install

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:

>>> import django

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.

>>> import muhasebe


>>> dir(muhasebe)
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
>>> muhasebe.__package__
'muhasebe'

Örnek testimizde oluşturduğumuz klasörün bir paket yapısı olduğunu görüyoruz.

Yaşamla İlişkilendir

Python Kütüphaneleri: Hangisi Ne İşe Yardımcı Olur?


Bir kütüphaneyi düşündüğünüzde burnunuza hemen o eski kitapların kokusu, gözünüzün önüne
o sessiz atmosfer gelir. Eğer Python kütüphaneleri içerisinde girebilseydik karşımıza kodunuzda kulla-
nabileceğiniz modüllerle dolu organize raflar çıkardı. İşte bu yüzden bu kütüphaneler çeşitli fonksiyo-
nelliğin kaynaklarıdır. Geliştiriciler farklı kütüphanelerde bulunan önceden yazılmış ve iyi tanımlanmış
kodları kullanarak kod yazmaktan kaçınırlar.
Python kütüphaneleri kullanarak verimli bir şekilde kod yazarak tüm script’e harcayacağınız za-
mandan kar edeceksiniz. Ama her şey sırayla. İlk adım olarak bir Python kütüphanesi nedir ve alakalı
konseptler nelerdir onları öğrenelim.
Öncelikle Öğrenilmesi Gereken Önemli Konseptler
Farklı Python kütüphaneleri hakkında konuşmaya başlamadan önce bazı önemli konseptleri göz
önünde bulundurmanız gerekiyor. Örneğin derin öğrenme makine öğrenmesine ait bir işlemdir. İn-
sanlar hatalarından nasıl öğreniyorsa bilgisayarlarda da aynı şey geçerli. Derin öğrenme makinelerin
örnekten öğrenmesini hedefliyor.
Diğer bir alakalı terim de insan beynini temsil eden yapay sinir ağlarıdır. Hangi şekilde diye sor-
duğunuzu duyar gibiyim. Yapay sinir ağları, insanların şekilleri tanımlama yollarını taklit eden algo-
ritmaların kombinasyonudur. Bu yüzden konsept insan biyolojisini ele alarak görüntü ve ses tanımayı
(ikisinden birini) programlama dünyasıyla buluşturur.
Python Kütüphaneleri Nedir?
Öncelikle Python kütüphanelerinin gerçek hayatta gidip sizi etkileyen kitapları aldığınız kütüpha-
nelerden farklı olmadığını anlamalısınız. Her ikisi de bilgi kaynakları koleksiyonudur.
Ancak Python kütüphaneleri kitaplar yerine size kodlama işleminizde kullanacağınız modüller su-
nar. Tüm profesyonel geliştiriciler detaylı hazırlanmış modüllerden faydalanır. Bir şeyi yapmanın kolay
yolu varsa neden onu seçmeyesiniz ki?
Python kütüphaneleri arasında araştırma yapmaya başladığınızda asıl ve üçüncü parti kütüphanele-
rinin sayısız derinliklerinde kaybolacaksınız. Pek çok modül koleksiyonu mevcut. Hangisini seçeceğini-
ze karar verirken kafa karışıklığı yaşayabilirsiniz. Farklı alanlarda sivrilmeye çalışan bir programcıysanız
size en uygun kütüphaneyi bulmanız zorlu bir görev olabilir.
Kaynak: M., Laura, (2022, Ocak 6), Python Kütüphaneleri: Hangisi Ne İşe Yardımcı Olur?, https://
[Link]/tutorial/python-kutuphaneleri/ (Erişim Tarihi 2022, 30 Haziran).

88
3
Programlama II

Öğrenme Çıktısı
6 Paket yükleyicisinin çalışmasını ve kullanımını ifade edebilme

Araştır 4 İlişkilendir Anlat/Paylaş

İçerisinde derse ait 5 farklı


modül içeren “egitim” isim- Kendi yazdığınız modülleri
Üçüncü şahıs paketlerini
li bir paket yapısı oluştura- bir paket altında toplama-
kullanmanın faydalarını an-
rak içeri aktarınız. Hazırla- nın ne gibi faydaları oldu-
latınız.
nan klasör yapısı için paket ğunu anlatınız.
testi yapınız.

89
3
Fonksiyonlar

1 Fonksiyon türlerini inceleyerek farklarını


kavrayabilme
öğrenme çıktıları ve bölüm özeti

Fonksiyon parametrelerinin farklı kullanım


2 şekillerini kavrayabilme

Özyinelemeli fonksiyonların hazırlanmasını


3 kavrayabilme

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.

4 Modül yapısını ve modüllerin programın


içerisine dahil edilmesini ifade edebilme

Modül Yapısı (Module)

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

5 Paket yapısını ve içe aktarmayı ifade


edebilme

öğrenme çıktıları ve bölüm özeti


Paket Yapısı (Package)

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.

6 Paket yükleyicisinin çalışmasını ve


kullanımını ifade edebilme

Paket Yöneticisi (PIP)

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

2 Aşağıdaki şıklardan hangisi kullanıcı tanımlı fonksiyonların avantajlarından biri değildir?


A. Kullanıcı tanımlı fonksiyonlar, büyük bir programı küçük bölümlere ayırmaya yardımcı olur
B. Programın anlaşılmasını, bakımını ve hata ayıklamasını kolaylaştırır.
C. Bir programda tekrarlanan kod oluşursa, bu kodlar bir fonksiyona dahil edilerek, ihtiyaç duyulan yerler-
de bu fonksiyon çağrılabilir.
D. Büyük proje üzerinde çalışan programcılar, farklı fonksiyonlar yaparak iş yükünü bölebilir.
E. Python programlama dili ile dahili olarak gelmektedir

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]

print("Pi sabiti değeri:", format(pi, "1.7f"))

print("Pi sabiti değeri:", float(pi))

print("5! değeri:", [Link]( 5))

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

6 I. Bir yapının paket olabilmesi için __init__.py içermesi gerekir


II. Paket yapısının alt paketleri ve modülleri olabilir

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

8 Aşağıdakilerden hangisi Python programlama dili kullanılarak yapılamaz?


A. Veri bilimi
B. Görüntü işleme
C. Makine öğrenmesi
D. İşletim sistemi
E. Web uygulaması

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

10 Python paket yöneticisi (pip) için aşağıdaki şıklardan hangisi yanlıştır?


A. Python paketlerinin yükleme ortamıdır
B. Standart Python paketleri için kuruluma ihtiyaç yoktur
C. pip ile üçüncü şahısların paketleri kurulmaktadır
D. Paket kurulumunun sonunda test için “import modul_adı” denenebilir
E. Kendi paketinizi oluşturabilmek için pip’in kullanılması gereklidir

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

def us_hesapla(taban, usdeger):


if usdeger == 0:
return 1
else:
return taban * us_hesapla(taban, usdeger - 1)

print('{} üssü {} : {}'.format(4, 7, us_hesapla(4, 7)))


print('{} üssü {} : {}'.format(2, 8, us_hesapla(2, 8)))

Ö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

yaricap = input("Dairenin yarıçapını giriniz:")

print([Link](yaricap))
print(d [Link](yaricap))

Ekran Çıktısı
Dairenin yarıçapını giriniz:5
78.5
31.400000000000002

Araştır 3

Matematiksel işlemler için kullanılan numpy paketini kullanacağız.

Kod
import numpy as np

# 100 ve 1000 arasında 7 tane rastgele sayı bastırır


print( [Link](100,1000,7) )

Ekran Çıktısı
[982 824 206 773 346 416 956]

95
3
Fonksiyonlar

Araştır Yanıt
3 Anahtarı

Araştır 4

Aşağıdaki gibi bir klasör yapısı oluşturuyoruz.

+ 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.

>>> import egitim


>>> dir(egitim)
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
>>> egitim.__package__
'egitim'

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ı

ve sayılar üzerinde yapılabilen işlemleri Liste (Liıst)


kavrayabilme 2 Liste yapısını ve özelliklerini açıklayabilme

Metin Dizisi (String)

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.

Tablo 4.1 Sayı sistemi örnekleri.

Sayı Sistemi Önek


Binary (2 lik taban) ‘0b’ veya ‘0B’
Octal (8 lik taban) ‘0o’ veya ‘0O’
Hexadecimal (16 lık taban) ‘0x’ veya ‘0X’

Kod:
#Çıktı: 171
print(0b10101011)

# Çıktı: 253 (251 + 5)


print(0xFB + 0b101)

# Çı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.

Decimal Veri Tipi


Python dilindeki float yerleşik sınıfı normalde beklenenden farklı hesaplamalar yapmaktadı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

# Float olarak kullanım


print([Link](2.2))

# Metin dizesi olarak kullanım


print([Link]('2.2'))

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

print(F(2, 3) + F(3, 3))


print(1 / F(3, 7))
print(F(-5, 9) > 0)
print(F(-5, 9) < 0)

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

print("Pi: ", [Link])


print("6!: ", [Link](6))
print("Sin(1) : ", [Link](1))
print("Sinh(1): ", [Link](1))
print("Cos(Pi): ", [Link]([Link]))
print("e^100: ", [Link](100))
print("Log(10000): ", math.log10(10000))

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

Random modülü ile ilgili şu örnekleri verebiliriz:

Kod:
import random

# 5 ile 30 arasında rastgele bir tamsayı değer döndürür


print([Link](5, 30))

dizi = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

# Dizi den rastgele bir değer döndürür


print([Link]( dizi ))

# Diziyi karışık şekilde dizer


[Link]( dizi )

# Karıştırılmış diziyi ekrana yazar


print( dizi )

# Rastgele bir değer döndürür


print([Link]())

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

Araştır 1 İlişkilendir Anlat/Paylaş

Random modülündeki ran-


Matematik modülü gibi sa- Python dilinde matematik
dom metodunun döndür-
yısal işlemleri destekleyen işlemlerin hangi alanlarda
düğü değerleri nasıl oluş-
modülleri araştırınız. kullanıldığını araştırınız.
turduğunu araştırınız.

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.

list İfadesi Sözdizimi:


class list([yinelenebilir])

Bir liste tanımı yapmanın farklı yolları vardır.


• Boş listeyi belirtmek için bir çift köşeli parantez kullanarak: [ ]
• Köşeli parantez kullanarak, öğeleri virgülle ayırarak: ['a'], ['a', 'b', 'c'], [1], [1, 2, 3]
• Tip yapıcısını kullanarak: list() veya list(yinelenebilir)

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 ]

# Boş bir liste


bos_liste = []

# Farklı veri türleri içeren liste


farkli_liste = [ 1, "Eskişehir", 9.25 ]

# İç içe geçmiş liste


icice_liste = [ "Ankara", [6, 26, 34, 20], ['a', 'n', 'a', 'd', 'o', 'l', 'u'], 49.87 ]

105
4
Veri Tipleri

Liste Elemanlarına Erişim


Python dilinde, liste elemanlarına erişmenin farklı yolları mevcuttur.
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. Bu aralıkların dışındaki dizi ele-
manlarına erişmeye çalışmak, IndexError hatası alınmasına neden olacaktır. İndeks bir tamsayı olmalıdır.
Float veya diğer türler kullanılamaz, böyle bir durum TypeError ile sonuçlanacaktır. İç içe listelerde de, iç
içe indeks kullanılarak erişilir.

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

# Nested - iç içe liste


n_list = [ "Merhaba", [ 1, 4, 5, 3 ] ]

# iç içe geçmiş liste indeks erişimi


print(n_list[0][1])

print(n_list[1][3])

# Hata! Dizi elemanlarına Yalnızca tam sayılar ile erişilebilir


print(liste[4.0])

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

Şekil 4.1 Python’da liste indeksleme.

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

liste = ['a', 'n', 'a', 'd', 'o', 'l', 'u']


# 2 indeksinden 4 indeksine kadar olan elemanlar
print(liste[2:5])

# 5 indeksinden sona kadar olan elemanlar


print(liste[5:])

# başlangıçtan bitişe kadar olan elemanlar


print(liste[:])

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.

Liste Elemanı Ekle/Değiştir:


Listeler değişkendir, yani elemanları string veya tuple’dan farklı olarak değiştirilebilir. Bir öğeyi veya bir
dizi öğeyi değiştirmek için atama operatörü = kullanılır.

Kod:
# Listedeki hatalı verilerin düzeltilmesi
cift = [1, 3, 5, 7, 9]

# listenin ilk elemanını değiştirelim


cift[0] = 2

print(cift)

# 2 ile 4. elemanlar arasını değiştirelim


cift[1:4] = [4, 6, 8]

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)

[Link]([9, 11, 13])


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]

print(liste + [5, 3, 1])


print(["müdür"] * 3)

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]

Liste Elemanlarını Silme


Python programlama dilinde, “del” deyimi kullanılarak listeden bir veya daha fazla eleman silinebilir.
Bu komut ile tüm liste de silinebilir.

Kod:
# Liste elemanlarını silme
liste = ['i', 'ç', 'e', 'r', 'i', 'k' ]

# tek eleman silme


del liste[2]
print(liste)

# çoklu eleman silme


del liste[1:3]
print(liste)

# tüm listeyi silme


del liste
# Hata: Liste tanımlı değil
print(liste)

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', 'a', 'd', 'o', 'l', 'u' ]


print(liste)

# Çıktı: 'a'
print([Link](1))

# Çıktı: ['a', 'd', 'o', 'l', 'u' ]


print(liste)

# Çıktı: 'u' son eleman


print([Link]())

# Çıktı: ['a', 'd', 'o', 'l' ]


print(liste)

[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']

Liste (List) Yöntemleri


Python, listelerle çalışmayı gerçekten kolaylaştıran birçok kullanışlı liste yöntemine sahiptir. Yaygın
olarak kullanılan liste yöntemlerinden bazıları inceleyelim.

Tablo 4.2 Python dilinde sık kullanılan liste metodları.


Metod Açıklama
append() Listenin sonuna bir eleman ekler
extension() Bir listenin tüm öğelerini başka bir listeye ekler
insert() Tanımlanan indekse bir öğe ekler
remove() Verilen bir elemanı listeden kaldırır
pop() Verilen dizindeki / indeksteki bir öğeyi döndürür ve kaldırır
clear() Tüm elemanları listeden kaldırır
index() Eşleşen ilk elemanın dizinini döndürür
count() Bağımsız değişken olarak iletilen öğelerin sayısını döndürür
sort() Listedeki öğeleri artan düzende sıralar
reverse() Listedeki öğelerin sırasını tersine çevirir
copy() Listenin bir kopyasını döndürür

111
4
Veri Tipleri

Kod:
liste = [3, 3, 5, 0, 5, 8, 0]

# En sona a harfi ekler


[Link]('a')

# Çıktı: [3, 3, 5, 0, 5, 8, 0, 'a']


print(liste)

# 5 sayısının ilk geçtiği indeks


print([Link](5))
# Çıktı: 2

# 5 sayısının listede kaç tane olduğu


print([Link](5))
# Çıktı: 2

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']

Liste Üyelik Testi


Bir elemanın listede olup olmadığını “in” anahtar sözcüğü kullanarak test edilebilir.

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

Liste İçinde Yineleme


Bir listedeki her eleman, for döngüsü kullanarak yinelenebilir.

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

Araştır 2 İlişkilendir Anlat/Paylaş

10 kişilik bir sınıftaki öğ-


rencilerin isim ve notlarını Listelere karşılık gelebile- Hangi tür veriler için liste
bir liste içerisinde tanımla- cek, günlük hayattan bir yapısının kullanılması gere-
yıp ekrana yazdıran Python örnek paylaşınız. kir, araştırınız.
kodunu hazırlayınız.

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)

# Tamsayı içeren demet


demet = (9, 2, 5)
print(demet)

# Farklı veri türleri içeren demet


demet = (8, 17, "Merhaba Dünya!", 3.4)
print(demet)

# İçiçe tanımlı demet


demet = ([4, 9, 13], "Hava Sıcaklıkları", (-4, 1, 8, 17))
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)

# bir demeti paketten çıkartmak da mümkündür


a, b, c = demet

print(a) # şeker portakalı


print(b) # 82.12
print(c) # 9

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'>

# Bir tane elemanı olan demet tanımı


demet = ("hello",)
print(type(demet)) # <class 'tuple'>

# Parantez kullanmak isteğe bağlıdır


demet = "hello",
print(type(demet)) # <class 'tuple'>

115
4
Veri Tipleri

Kod Çıktısı:
<class 'str'>
<class 'tuple'>
<class 'tuple'>

Demet Elemanlarına Erişim


Bir demetin elemanlarına erişmenin çeşitli yolları vardır. Sırasıyla bunları inceleyelim.

İ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'

# IndexError: list index out of range


# İndeks hatası: liste indeksi sınırların dışında
# print(demet[9])

# Indeks bir tamsayı olmalıdır


# TypeError: list indices must be integers, not float
# demet[2.0]

# iç içe demet tanımı


icice_demet = ([1, 7, 5], "Tilki", (3, 6, 8))

# iç içe indeks kullanımı


print(icice_demet[0][2]) # 5
print(icice_demet[1][1]) # 'i'

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')

# 2. elemandan [Link] kadar


print(demet[1:4]) # ('s', 'k', 'i')

# -7 ile -2 indeks arasındaki elemanlar


print(demet[-7:-2]) # ('k', 'i', 'ş', 'e', 'h')

# 0 ile -7 indeks arasındaki elemanlar


print(demet[:-7]) # ('E', 's')

# 7 indeksinden sonuna kadar olan elemanlar


print(demet[7:]) # ('i', 'r')

# demetteki tüm elemanlar


print(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ı

Şekil 4.2 Demet dilim aralıkları.

Bir Demeti Değiştirme


Listelerden farklı olarak, demetler değişmez yapılardır. Bu, bir demetin elemanları atandıktan sonra
değiştirilemeyeceği anlamına gelmektedir. Ancak, demet elemanı liste gibi değişken bir veri tipinde ise,
iç içe geçmiş elemanlar değiştirilebilir. Ayrıca tanımlanmış bir demete, farklı değerler atanabilir, buna da
yeniden atama denmektedir.

Kod:
# Tuple değerlerini değiştirme
demet = (63, 5, [4, 0], 71)

# demet nesnesinin elemanlarını değiştirmek istediğimizde


# alacağımız hata
# TypeError: 'demet' object does not support item assignment
# demet[1] = 9

# Ancak, değiştirilebilir bir elementin elemanı değiştirilebilir


demet[2][0] = 7 # Çıktı: (63, 5, [7, 0], 71)
print(demet)

# Tuple'lar yeniden atanabilir


demet = ('E','s','k','i','ş','e','h','i','r')

# Çı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')

Bir Demeti Silme


Bir demet içindeki öğelerin değiştirilemeyeceğini örnekler ile de inceledik. Bu, bir demetten elemanla-
rının silenemeyeceği veya kaldırılamayacağı anlamına gelmektedir. Bununla birlikte, bir demeti tamamen
silmek, “del” anahtar sözcüğünü kullanarak gerçekleştirilebilir.

Kod:
# Demet silme
demet = ('E','s','k','i','ş','e','h','i','r')

# Demet elemanları silinemez


# TypeError: 'tuple' object doesn't support item deletion
# del demet[3]

# Tüm demet nesnesini siler


del demet

# NameError: name 'demet' is not defined


print(demet)

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

Demet (Tuple) Fonksiyonları


Eleman ekleme veya eleman kaldırma yöntemleri, Tuple ile kullanılamaz. Demet yapısının desteklediği
yalnızca iki yöntem bulunmaktadır.

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.

Grup Üyelik Testi


“in” anahtar sözcüğünü kullanarak bir elemanın bir demet içinde olup olmadığı test edilebilir.

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

Bir Demet (Tuple) Üzerinde Yineleme İşlemi


Demet içindeki her bir öğeyi yinelemek için bir for döngüsü kullanılabilir.

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

Demet (Tuple) Yapısının Liste (List) Yapısına Göre Avantajları:


Demet yapıları, listelere oldukça benzer olduğundan, her ikisi de benzer durumlarda kullanılır. An-
cak, liste yerine bir demet kullanmanın bazı avantajları vardır. Bu avantajlardan bazılarını şu şekilde
ifade edebiliriz:
• Genellikle heterojen (farklı) veri türleri için demet yapıları ve homojen (benzer) veri türleri için
listeler kullanılır.
• Demet yapıları değiştirilemez olduğundan, bir demet üzerinden yineleme yapmak liste yapısına
kıyasla daha hızlıdır. Yani hafif bir performans artışı vardır.
• Değişmez öğeler içeren demetler, bir sözlük için anahtar olarak kullanılabilir. Listelerle bu müm-
kün değildir.
• Değişmeyen verileriniz varsa, bunları demet yapısında tutmak, yazmaya karşı korumalı kalmasını
garanti edecektir.

Öğrenme Çıktısı
3 Demet (Tuple) veri yapısının özelliklerini ve kullanım alanlarını ifade edebilme

Araştır 3 İlişkilendir Anlat/Paylaş

Türk alfabesindeki harfleri


içeren bir string ifadeyi, de- Demet yapısının kullanıl- Bütün elemanları değiştiri-
met yapısı ile harf harf ayrıl- ması gerekli olan bir prog- lebilir bir demet yapısı ola-
mış şekilde ekrana yazdıran ramı anlatınız. bilir mi? Araştırınız.
Python kodunu hazırlayınız.

METİN DİZİSİ (STRING)


Bu kısımda metin dizisi (dize/string) oluşturmayı, biçimlendirmeyi, değiştirmeyi ve silmeyi inceleyece-
ğiz. Ayrıca, çeşitli dize işlem ve fonksiyonlarının detaylarını göreceğiz.
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 karakterlerin 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.
Python’da bir dize, bir Unicode karakter dizisidir.
Unicode, her karakteri tüm dillere dahil etmek ve kodla-
mada tekdüzelik sağlamak için hazırlanmıştır. dikkat
Metin dizisi, karakter dizisi, dize ve string
aynı kavramı ifade etmektedir.

121
4
Veri Tipleri

Python’da Bir Dize Nasıl Oluşturulur?


Dizeler, karakterleri tek tırnak veya çift tırnak içine alarak oluşturulabilir. Python’da üçlü tırnak işa-
retleri de kullanılabilir, ancak genellikle çok satırlı dizeleri ve belge dizilerini (docstring) temsil etmek
amacıyla kullanılır.

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)

# Metin, üçlü tırnak dizisi ile birden çok satıra uzatılabilir


metin_dizisi = """Merhaba, Python dünyasına
hoş geldiniz"""
print(metin_dizisi)

Kod Çıktısı:
Merhaba
Merhaba
Merhaba
Merhaba, Python dünyasına
hoş geldiniz

Bir Dizedeki Karakterlere Nasıl Erişilir?


Tek tek karakterlere indeksleme kullanarak erişilebilir. Ayrıca dilimleme kullanılarak da bir dizi karak-
tere 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 şek-
linde erişim için kullanılabilir. Dilimleme operatörü : (iki nokta üst üste) kullanılarak bir dizideki bir dizi
elemana erişilebilir.

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])

#3. ila 7. karakter arasını dilimleme


print('str[3:7] = ', str[3:7])

# 7. karakterden sondan 2. karaktere kadar dilimleme


print('str[7:-2] = ', str[7:-2])

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

# indeks bir tam sayı olmalıdır


>>> str[1.5]
...
TypeError: string indices must be integers

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ı

Şekil 4.3 Dizenin dilim aralıkları.

Bir Dize Nasıl Değiştirilir veya Silinir?


Dizeler de tıpkı demetler gibi değişmezdir. Bir dizenin elemanları atandıktan sonra değiştirilemeyeceği
anlamına gelmektedir. Fakat farklı değerleri aynı isimdeki dizelere yeniden atayabiliriz. Böylece dizeyi yeni
atanan değer ile değiştirmiş oluruz.

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

Python Dize İşlemleri


Python’da onu en çok kullanılan veri türlerinden biri yapan dizelerle gerçekleştirilebilecek birçok işlem vardır.

İki veya Daha Fazla Dizenin Birleştirilmesi


İki veya daha fazla dizenin tek bir dizede bir araya getirilmesi işlemine birleştirme (concatenation) denir.
Python dilinde dizeleri birleştirmek için “+” operatörü kullanılmaktadır. Ayrıca iki dize metni birlikte
yazılarak da birleştirilebilir.
* operatörü ise, dizeyi belirli bir sayıda tekrarlamak için kullanılabilir.

Kod:
# Python String İşlemleri
str1 = 'Merhaba '
str2 ='Python!'

# + operatörü kullanılarak
print('str1 + str2 = ', str1 + str2)

# metinler yan yana yazılarak


print('Merhaba ' 'Python!')
print('Merhaba '
'Python!')

# * 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

Dize üzerinde yineleme:


Bir for döngüsü kullanarak bir dizeyi yineleyebiliriz. Döngü kullanımını bir örnek üzerinde inceleyelim.

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

Dizi Üyelik Testi


Python programlama dilinde “in” anahtar sözcüğü kullanılarak bir dize içinde bir alt dizenin olup
olmadığı test edilebilir.

Kod:
>>> 'a' in 'Osmangazi'
True
>>> 'un' not in 'Orhun'
False
>>> 'ancak' in 'Sancaktepe'
True

Python ile Yerleşik Fonksiyonlar


Sırayla, döngü şeklinde çalışan çeşitli yerleşik fonksiyonlar, dizelerle de çalışır. Enumerate() ve len()
yaygın olarak kullanılan yerleşik fonksiyonlardan bazılarıdır. enumerate() fonksiyonu, bir numaralandırma
nesnesi döndürür. Bu nesne, dizedeki tüm öğelerin indeks ve değer çiftlerini içerir. Bu değerler yineleme
sırasında kullanılması açısından önemlidir. Benzer şekilde, len() fonksiyonu dizenin uzunluğunu (karakter
sayısı) döndürür.

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

Kaçış Dizisi (Escape Sequence)


Python programlama dilinde şöyle bir metin yazmak istediğimizi düşünelim:

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.''')

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.')

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

Tablo 4.3 Python’ın desteklediği kaçış dizileri.


Kaçış Dizisi Açıklama
\newline Ters bölü ve yeni satır yoksayıldı
\\ Ters bölü
\’ Tek alıntı
\” Çift alıntı
\a ASCII Çanı
\b ASCII Geri silme
\f ASCII Form beslemesi
\n ASCII Satır beslemesi
\r ASCII Satır başı
\t ASCII Yatay sekmesi (tab)
\v ASCII Dikey Sekmesi
\ooo Sekizlik değeri ooo olan karakter
\xHH Onaltılık değeri HH olan karakter

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

# varsayılan (örtük) sıralama


varsayılan_sıra = "{}, {} ve {}".format('Fahri', 'Emin', 'Musa')
print('\n--- Varsayılan Sıra ---')
print( varsayılan_sıra )

# konumsal argümanı kullanarak sıralama


konumsal_sıra = "{1}, {0} ve {2}".format('Fahri', 'Emin', 'Musa')
print('\n--- Konumsal Sıra ---')
print( konumsal_sıra )

# anahtar kelime argümanını kullanarak sıralama


anahtar_kelime_sıra = "{m}, {f} ve {e}".format(f='Fahri', e='Emin', m='Musa')
print('\n--- Anahtar Kelime Sırası ---')
print( anahtar_kelime_sıra )

Kod Çıktısı:
--- Varsayılan Sıra ---
Fahri, Emin ve Musa

--- Konumsal Sıra ---


Emin, Fahri ve Musa

--- Anahtar Kelime Sırası ---


Musa, Fahri ve Emin

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))

# noktalı sayıları biçimlendirme


print("Üs temsili: {0:e}".format(1040.567))

# 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|

Eski Stil Biçimlendirme


Python programlama dilinde, C programlama dilinde kullanılan sprintf() stili gibi, dizeler biçimlendi-
rilebilir. Bu biçimlendirmeyi gerçekleştirebilmek için % operatörü kullanılmaktadır.

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

Python Dizisi Ortak Metotlar


String nesnesiyle kullanılabilen çok sayıda yöntem vardır. Bahsettiğimiz format() metodu bunlardan
biridir. Yaygın olarak kullanılan yöntemlerden bazılarına; lower(), upper(), join(), split(), find(), replace()
örnek olarak verilebilir.

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

Araştır 4 İlişkilendir Anlat/Paylaş

Kullanıcıdan alınan uzun-


luk formatlı, yani belirli
Verilen bir metindeki “!”
aralıklarda belirli verilerin Karakter dizisi metotların-
ünlem işareti yerine “.”
tutulduğu bir metin dizisi- dan swapcase() metodunu
nokta işareti koyan kodu
nin parçalara ayrılarak gös- araştırarak paylaşınız.
hazırlayınız.
terildiği Python kodunu
hazırlayınız.

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)

# karışık veri türleri kümesi


kume = {"Merhaba", (9, 8, 2), 2.6}
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)

# listeden küme yapabiliriz


# Çıktı: {1, 4, 5}
kume = set([1, 4, 5, 4])
print(kume)

# küme değiştirilebilir öğelere sahip olamaz


# burada [9, 8] değişken bir listedir
# bu tanımlama bir hataya neden olacaktır
kume = { [9, 8], 6, 2}
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

# küme'yi {} ile başlatalım


kume = {}

# küme'nin veri türünü kontrol edelim


print(type(kume))

# küme'yi set() ile başlatalım


kume = set()

# küme'nin veri türünü kontrol edelim


print(type(kume))

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)

# birden çok öğe ekle


# Çıktı: {0, 1, 2, 3, 4, 6, 8}
[Link]([1, 3, 4])
print(kume)

# liste ekle ve ayarla


# Çıktı: {0, 1, 2, 3, 4, 5, 6, 7, 8}
[Link]([4, 5], {1, 6, 7, 8})
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}

Bir Kümeden Eleman Çıkarma


Belirli bir eleman, discard() ve remove() yöntemleri kullanılarak bir kümeden çıkarılabilir. İkisi arasın-
daki tek fark, eleman kümede mevcut değilse, discard() işlevinin bir kümeyi değiştirmeden bırakmasıdır.
Diğer yandan, remove() işlevi, böyle bir durumda (kümede eleman yoksa) bir hata döndürecektir.

Kod:
# discard() ve remove() arasındaki fark

# kume'yi tanımlama
kume = {1, 3, 4, 5, 6}
print(kume)

# bir öğeyi çıkart


# Çıktı: {1, 3, 5, 6}
[Link](4)
print(kume)

# bir öğeyi kaldır


# Çıktı: {1, 3, 5}
[Link](6)
print(kume)

# bir öğeyi çıkart


# kume'de yok
# Çıktı: {1, 3, 5}
[Link](2)
print(kume)

# bir öğeyi kaldır


# kume'de yok
# hata oluşturacak
# Çıktı: KeyError

[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)

# bir elemanı çekme


# Çıktı: rastgele bir eleman
print([Link]())

# başka bir eleman çek


[Link]()
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

Tablo 4.4 Küme veri türünün desteklediği metotlar.


Method Tanım
add() Kümeye bir eleman ekler
clear() Kümedeki tüm öğeleri kaldırır
copy() Kümenin bir kopyasını döndürür
difference() İki veya daha fazla kümenin farkını yeni bir küme olarak döndürür
difference_update() Bu kümeden başka bir kümenin tüm öğelerini kaldırır
Bir elemanı kümenin üyesi ise kümeden kaldırır. (Eleman kümede
discard()
değilse hiçbir şey yapmaz)
intersection() İki kümenin kesişimini yeni bir küme olarak döndürür
intersection_update() Kümeyi kendisinin ve diğerinin kesişimiyle günceller
isdisjoint() İki kümenin boş bir kesişimi varsa True döndürür
issubset() Başka bir küme bu kümeyi içeriyorsa True döndürür
issuperset() Bu küme başka bir küme içeriyorsa True döndürür
İsteğe bağlı bir küme öğesini kaldırır ve döndürür. Küme boşsa KeyError
pop()
hatası verir
remove() Kümeden bir elemanı kaldırır. Eleman üye değilse, bir KeyError hatası verir
symmetric_difference() İki kümenin simetrik farkını yeni bir küme olarak döndürür
symmetric_difference_update() Bir kümeyi kendisinin ve diğerinin simetrik farkıyla günceller
union() Yeni bir kümedeki kümelerin birleşimini döndürür
update() Kümeyi kendisinin ve diğerlerinin birleşimiyle günceller

Kümelerde Üyelik Testi


Bir elemanın bir kümede olup olmadığı “in” anahtar sözcüğü kullanılarak test edilebilir.

Kod:
# kümede in ve not in kullanımı
# kume'ye ilk değer atama
kume = set("Bilgisayar")

# 'a' olup olmadığının kontrolü


# Çıktı: Doğru
print('a' in kume )

# 's'nin olup olmadığının kontrolü


# Çıktı: Yanlış
print('s' not in kume)

Kod Çıktısı:
True
False

136
4
Programlama II

Bir Küme İçinde Yineleme


Küme üzerinde for döngüsü kullanarak her eleman yinelenebilir.

Kod:
for harf in set("bilgisayar"):
print(harf)

Kod Çıktısı:
b
g
y
l
s
i
a
r

Kümelerde Yerleşik/Dahili Fonksiyonlar


all(), any(), enumerate(), len(), max(), min(), sorted(), sum() vb. gibi yerleşik fonksiyonlar, farklı görev-
leri gerçekleştirmek amacıyla kümelerde yaygın olarak kullanılmaktadır.

Tablo 4.5 Kümelerde Yerleşik Fonksiyonlar.


Fonksiyon Tanım
all() Kümenin tüm öğeleri doğruysa (veya küme boşsa) True döndürür.
any() Kümenin herhangi bir elemanı doğruysa True döndürür. Küme boşsa, False döndürür.
Bir numaralandırma nesnesi döndürür. Kümenin tüm elemanlarını bir indeksini ve değer
enumerate()
çifti olarak döndürür.
len() Kümenin uzunluğunu yani eleman sayısını döndürür.
max() Kümedeki en büyük elemanı döndürür.
min() Kümedeki en küçük elemanı döndürür.
sorted() Kümedeki elemanlardan sıralanmış yeni bir liste döndürür (kümenin kendisini sıralamaz).
sum() Kümedeki tüm elemanların toplamını döndürür.

Python Frozenset (Kısıtlanmış Küme)


Frozenset, bir kümenin özelliklerine sahip yeni bir sınıftır, fakat elemanları atandıktan sonra değiştiri-
lemez. Tuple’lar değişmez listeler iken, frozenset’ler değişmez kümelerdir.
Değişken olan kümelerin hash kodu (doğrulama kodu) oluşturulamadığı için sözlük anahtarları olarak
kullanılamazlar. Öte yandan, kısıtlanmış kümelerin hash kodu oluşturulabilir ve bir sözlüğün anahtarı
olarak kullanılabilir.
Kısıtlanmış kümeler, frozenset() fonksiyonu kullanılarak oluşturulabilir. Bu veri türü, copy(), differen-
ce(), intersection(), isdisjoint(), issubset(), issuperset(), symmetric_difference() ve union() gibi yöntemleri
destekler. Değiştirilemez (immutable) olduğu için eleman ekleyen veya çıkaran yöntemlere sahip değildir.

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

Araştır 5 İlişkilendir Anlat/Paylaş

Üç farklı branşta verilen


kurs kümesi tanımlayınız
Python dilinde tanımlı
ve bu kümelere 5 er kişi ek- Küme veri türü ile yapılabi-
küme kavramı ile matema-
leyiniz. Daha sonra bu kü- lecek işlemleri düşününüz
tikteki kümeleri karşılaştı-
melerdeki birleşim, kesişim ve bir örnek ile açıklayınız.
rınız.
ve farkları gösteren Python
kodunu hazırlayınız.

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 = {}

# tamsayı anahtarlı sözlük


sozluk = {1: 'ağaç', 2: 'kitap'}

# karışık anahtarlı sözlük


sozluk = {'isim': 'Tahir', 1: [3, 5, 15]}

# dict() kullanarak
sozluk = dict({1:'ağaç', 2:'kitap'})

# her öğenin bir çift olduğu diziden


sozluk = dict([(9, 'ağaç'), (5, 'kitap')])

Sözlükteki Elemanlara Erişmek


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. Köşeli parantez [ ]
kullanıldığı durumda, sözlükte ilgili anahtar bulunmadığında KeyError hatası ortaya çıkmaktadır. Diğer
taraftan, anahtar bulunamazsa get() yöntemi None (Yok) değerini döndürmektedir.

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ş'))

# Sözlükte olmayan anahtara erişmeye çalışmak hata verir


# Çıktı: None
print([Link]('adres'))

# 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'

Sözlük Elemanlarını Değiştirme ve Ekleme


Sözlükler değişkendir. Bir atama operatörü kullanarak yeni öğeler ekleyebilir veya mevcut öğelerin
değeri değiştirilebilir. Sözlükte anahtar (key) mevcutsa, mevcut değer güncellenir. Anahtarın bulunmaması
durumunda sözlüğe yeni bir (anahtar: değer) çifti eklenir.

Kod:
# Sözlük Öğelerini Değiştirme ve Ekleme
sozluk = {'isim': 'Sadri', 'yaş': 17}

# değer güncelleme
sozluk['isim'] = 'İbrahim'

# Çıktı: {'isim': 'İbrahim', 'yaş': 17}


print(sozluk)

# Eleman ekleme
sozluk['adres'] = 'Konya'

# Çıktı: {'isim': 'İbrahim', 'yaş': 17, 'adres':'Konya'}


print(sozluk)

140
4
Programlama II

Kod Çıktısı:
{'isim': 'İbrahim', 'yaş': 17}
{'isim': 'İbrahim', 'yaş': 17, 'adres': 'Konya'}

Öğeleri Sözlükten Kaldırma


pop() yöntemi kullanılarak sözlükteki belirli bir eleman kaldırılabilir. Bu yöntem, verilen anahtara
karşılık gelen öğeyi kaldırır ve değeri döndürür. popitem() yöntemi, sözlükten rastgele bir (anahtar, değer)
eleman çiftini kaldırmak ve döndürmek için kullanılabilir. Tüm öğeler clear() yöntemi kullanılarak bir
kerede kaldırılabilir. Tek tek öğeleri veya tüm sözlüğün kendisini kaldırmak için del anahtar sözcüğü de
kullanılabilir.

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}

# belirli bir öğeyi kaldır, değerini döndürür


# Çıktı: 16
print([Link](4))

# Çıktı: {1: 1, 2: 4, 3: 9, 5: 25, 6: 36}


print(kareler)

# rastgele bir öğeyi kaldırıp değeri geri döndürür (anahtar, değer)


# Çıktı: (6, 36)
print([Link]())

# Çıktı: {1: 1, 2: 4, 3: 9, 5: 25}


print(kareler)

# tüm öğeleri kaldır


[Link]()

# Çıktı: {}
print(kareler)

# sözlüğün kendisini siler


del 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

Python Sözlük Fonksiyonları


Bir sözlükle kullanılabilen fonksiyonlar tabloda verilmiştir. Bunlardan bazıları kod örneklerinde de
kullanılmıştır.

Tablo 4.6 Python Sözlük Fonksiyonları.


Method Tanım
clear() Tüm öğeleri sözlükten kaldırır
copy() Sözlüğün bir kopyasını döndürür
Sıra anahtarları ve v değerine eşit olan yeni bir sözlük döndürür. Varsayılan
fromkeys(seq[, v])
değeri None (Yok)’dır
Anahtara karşılık gelen değeri döndürür. Anahtar yoksa, d’yi döndürür.
get(key[,d])
Varsayılan olarak None (Yok)’dır

items() (anahtar, değer) biçiminde sözlük elemanlarının yeni bir nesnesini döndürür

keys() Sözlük anahtarlarının yeni bir nesnesini döndürür

Elemanı anahtarla çeker ve anahtar bulunamazsa değerini veya d değerini


pop(key[,d])
döndürür. d değeri verilmediyse ve anahtar bulunmazsa, KeyError hatası verir
Rastgele bir elemanı (anahtar, değer) çeker ve döndürür. Sözlük boşsa KeyError
popitem()
hatası verir
Anahtar sözlükte mevcutsa, karşılık gelen değeri döndürür. Değilse, anahtarı d
setdefault(key[,d])
değeriyle ekler ve d değerini döndürür. Varsayılan olarak None (Yok)’dır
Mevcut anahtarların üzerine yazarak diğer anahtar/değer çiftleriyle sözlüğü
update([other])
günceller
values() Sözlüğün değerlerinin 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)

# Çıktı: {'Matematik': 0, 'Türkçe': 0, 'Coğrafya': 0}


print(notlar)

for eleman in [Link]():


print(eleman)

# Çıktı: ['Coğrafya', 'Matematik', 'Türkçe']


print(list(sorted([Link]())))

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']

Sözlük Oluşturma (Dictionary Comprehension)


Sözlük oluşturma, Python’da yinelenebilir bir sözlükten yeni bir sözlük oluşturmanın kısa ve etkili bir
yoludur. Sözlük oluştururken, bir ifade çiftinden (anahtar: değer) ve ardından küme parantezleri { } içinde
bir for ifadesinden faydalanılır.
Daha iyi anlaşılabilmesi amacıyla, her elemanının bir sayı çifti ve karesi olduğu bir sözlük oluşturmak
için bir kod örneği inceleyelim.

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}

Örnek kodun eşdeğer kodu da şu şekildedir:

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}

Sözlük Üyelik Testi


Bir anahtarın sözlükte olup olmadığı in anahtar sözcüğü kullanılarak ile test edilebilir. Üyelik testinin
değerler için değil, yalnızca anahtarlar için olduğuna da dikkat edilmelidir.

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 )

# Değer için değil, yalnızca anahtar için üyelik testleri yapılabilir


# Çıktı: Yanlış
print(49 in kareler)

Kod Çıktısı:
True
True
False

Sözlük Üzerinden Yineleme (İterasyon)


Bir for döngüsü kullanılarak, bir sözlükteki her bir anahtar yinelenebilir. Yani sözlükteki tüm elemanlar
üzerinde bir döngü şeklinde işlem yapılabilir.

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

Sözlük Yerleşik Fonksiyonlar


all(), any(), len(), cmp(), sorted(), vb. gibi yerleşik fonksiyonlar, farklı görevleri gerçekleştirmek için
sözlüklerde yaygın olarak kullanılır.

Tablo 4.7 Sözlük Yerleşik Fonksiyonları.


Fonksiyon Tanım
all() Sözlüğün tüm anahtarları True ise (veya sözlük boşsa) True döndürür
any() Sözlüğün herhangi bir anahtarı doğruysa True döndürür.
Sözlük boşsa, False döndürür
len() Sözlüğün uzunluğunu (eleman sayısını) döndürür
cmp() İki sözlükteki öğeleri karşılaştırır. (Python 3’te mevcut değildir)
sorted() Sözlüğün yeni bir sıralanmış anahtar listesini döndürür

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))

# Çıktı: [0, 1, 3, 5, 7, 9, 10]


print(sorted(kareler))

145
4
Veri Tipleri

Kod Çıktısı:
False
True
7
[0, 1, 3, 5, 7, 9, 10]

Yaşamla İlişkilendir

Python ile Veri Bilimine Dalış


Veri bilimi, karmaşık problemleri çözmek için hem yapılandırılmış hem de yapılandırılmamış veriyi,
işe yarar/değerli bilgiye (knowledge) dönüştürmeye yarar. Bu süreçte, bilimsel problem çözme tekniklerini,
matematiği, istatistiği ve yazılım geliştirme disiplinlerini birlikte kullanır [1]. Veri biliminin geçmişi çok
uzun yıllara dayansa da veri bilimi iş kavramının popüler olması HBR (Harvard Business Review) dergi-
sinde yayınlanan “Data Scientist: The Sexiest Job of the 21st Century” adlı yazıyla başlamaktadır.
Bir veri bilimi projesinin aşamalarını soyut olarak aşağıdaki gibi 4 adımda tanımlamak mümkündür.
1. Problem Tanımlama
2. Veri Hazırlama
3. Model/Algoritma Seçimi
4. Sonuçları İyileştirme
Aşamaların detaylarına bu yazıda girerek yazıyı boğmak istemiyorum ancak yine de elinizdeki proble-
min ne olduğunu iyice anlamadan, problemi çözünce tam olarak ne elde edeceğinizi bilmeden ve müm-
künse yanınızda bir alan uzmanı olmadan gerçek hayatta hiçbir projeye girmemenizi tavsiye ediyorum.
Günümüzde veri bilimi denilince akla ilk gelen programlama dili Python’dur. Kolay öğrenilebilme-
si, kolay okunması, bakımının kolay olması ve hazır birçok veri bilimi kütüphanesi bulundurması, dilin
kullanımını oldukça yaygınlaştırmıştır [2]. Popülerliği ve kullanımı arttıkça, var olan kütüphaneleri
daha fazla gelişmekte ve ayrıca yeni kütüphaneler de eklenmektedir.

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

Araştır 6 İlişkilendir Anlat/Paylaş

Küçük veri kümeleri için


1 ile 100 arasında 7’nin kat- bir sözlük hazırlandığında,
Sözlük ve Liste veri türleri
ları olan çift sayılardan olu- sözlük veri türünün kulla-
arasındaki farkları araştırınız.
şan bir sözlüğü oluşturunuz. nımının veritabanı kullanı-
mı ile kıyaslamasını yapınız.

146
4
Programlama II

Python dilinin desteklediği sayı


1 türlerini ve sayılar üzerinde
yapılabilen işlemleri kavrayabilme

öğrenme çıktıları ve bölüm özeti


Sayılar (Numbers)

Temel olarak sayı türlerini şu şekilde listeleyebiliriz:


• Integer
• Long Integer
• Float
• Complex
Tamsayılar herhangi bir uzunlukta olabilirken, bir kayan noktalı sayı yalnızca 15 ondalık basamağa kadar
değer alabilir.
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.
Python dilindeki float yerleşik sınıfı normalde beklenenden farklı hesaplamalar yapmaktadır. Bilgisayarın yal-
nızca iki tabanındaki sayıları (0 ve 1) anlaması nedeniyle, kayan noktalı sayıların bilgisayar donanımında ikili
tabanda kesirler olarak uygulandığı görülmektedir. Bu nedenle bildiğimiz ondalık kesirlerin çoğu bilgisayara
tam olarak kaydedilemez.
Python, fractions (kesirler) modülü aracılığıyla kesirli sayılar içeren işlemleri desteklemektedir. Bu modül
rasyonel sayı aritmetiği desteğine sahiptir. Bir kesrin, her ikisi de tam sayı olan bir payı ve bir paydası bulun-
maktadır.
Python ayrıca, 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.

2 Liste yapısını ve özelliklerini


açıklayabilme

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) veri yapısının


3 özelliklerini ve kullanım alanlarını
ifade edebilme
öğrenme çıktıları ve bölüm özeti

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.

Metin dizilerinin birleştirilmesi,


4 parçalanması, biçimlendirilmesi gibi sık
kullanılan metotları ifade edebilme

Metin Dizisi (String)

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 veri türü ile gerçekleştirilebilecek


5 işlemleri ifade edebilme ve desteklediği
fonksiyonları kavrayabilme

öğrenme çıktıları ve bölüm özeti


Küme (Set)

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 veri türü ile ilgili özellikleri ve


6 diğer veri türleri ile farklarını ifade
edebilme

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)

print("alan: "+ str(alan) + " - tipi: ", type(alan) )

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’>

3 I. Boş listeyi belirtmek için bir çift köşeli parantez kullanarak: [ ]


II. Köşeli parantez kullanarak, öğeleri virgülle ayırarak: ['a'], ['a', 'b', 'c']
III. Tip yapıcısını kullanarak: list()
Python liste (list) veri tipi için yukarıda verilen maddelerden hangileri doğrudur?
A. Yalnız I B. Yalnız III C. I ve II
D. I ve III E. I, II ve III

4 mesaj = "Python öğrenmekten keyif alıyorum!".split()


print( mesaj )

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’’’

7 print("Benim adım {2} {0} ve {1} yaşındayım.".format("Yavaş", 21, "Sami" ))


Yukarıda verilen örnek Python kodunun ekran çıktısı, aşağıdaki seçeneklerden hangisinde doğru olarak
verilmiştir?
A. Benim adım 21 Sami ve Yavaş yaşındayım.
B. Benim adım Yavaş Sami ve 21 yaşındayım.
C. Benim adım Yavaş 21 ve Sami yaşındayım.
D. Benim adım 21 Yavaş ve Sami yaşındayım.
E. Benim adım Sami Yavaş ve 21 yaşındayım.

8 I. Sıralanmamış bir öğeler topluluğudur


II. Her küme elemanı benzersizdir yani tekrar edilemez ve değiştirilemez
III. Kümeye eleman eklenip çıkarılabilir
Python küme (set) veri tipi için yukarıda verilen maddelerden hangileri doğrudur?
A. Yalnız I B. Yalnız III C. I ve II D. II ve III E. I, II ve III

9 kume = {"Merhaba", 2.6, (9, 8, 2), 2.6}

[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.

neler öğrendik yanıt anahtarı


2. A Yanıtınız yanlış ise “Sayılar (Numbers)” ko- 7. E 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

ogrenciler = [ ["AYTEKİN SÜRÜM", "76"], ["ASLIHAN SÜNER", "34"],


["ALİRIZA YURDSEVEN", "65"], ["ORHAN UYGAR ÇETEMEN", "88"],
["GONCA SUNGURTEKİN", "93"], ["TUBA HANIM TURP", "57"],
["SARE ATBAŞ", "87"], ["ERSAGUN BUDUNOĞLU", "23"],
["ALPEREN SONAY", "75"], ["AYCAN ÖZDEN ALTINOK", "81"] ]

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

Demet yapısı Python kodu

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

ingilizce = { "DUÇEM BÖLÜK", "CİHAT SARICANBAZ", "SEVCAN ÖZZEYBEK", "SEVGİ


TINAZ", "RABİA BAYHAN" }
matematik = { "RABİA BAYHAN", "SEVCAN ÖZZEYBEK", "SEVGİ TINAZ", "ZEKERİYA
SENEMTAŞI", "KEMAL ATASOY" }
fizik = { "ZELİHA SAMSA", "CİHAT SARICANBAZ", "FEVZİYE KÜPELİ", "SEVCAN
ÖZZEYBEK", "SAMİ EGEHAN" }

#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'}

İngilizce * Matematik: {'RABİA BAYHAN', 'SEVCAN ÖZZEYBEK', 'SEVGİ TINAZ'}


İngilizce * Fizik: {'SEVCAN ÖZZEYBEK', 'CİHAT SARICANBAZ'}
Matematik * Fizik: {'SEVCAN ÖZZEYBEK'}

İngilizce - Matematik: {'CİHAT SARICANBAZ', 'DUÇEM BÖLÜK'}


İngilizce - Fizik: {'SEVGİ TINAZ', 'RABİA BAYHAN', 'DUÇEM BÖLÜK'}
Matematik - Fizik: {'KEMAL ATASOY', 'RABİA BAYHAN', 'ZEKERİYA SENEMTAŞI',
'SEVGİ TINAZ'}

155
4
Veri Tipleri

Araştır Yanıt
4 Anahtarı

Araştır 6

yedinin_katlari = {x: x for x in range(1,100) if x % 7 == 0 }

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.

Tablo 5.1 Python Dosya Erişim Modları.


Mod Tanım
r Okumak için bir dosya açar. Varsayılan moddur
Yazmak için bir dosya açar. Mevcut değilse yeni bir dosya oluşturur veya dosya varsa içeriğini
w
siler, sıfırlar
x Dosya oluşturma için kullanılır. Dosya zaten varsa, işlem başarısız olur.
İçeriğini silmeden sonuna eklemek için bir dosya açar. Dosya mevcut değilse yeni bir dosya
a
oluşturur.
t Dosyayı metin (text) modunda açar. Varsayılan moddur
b Dosyayı ikili (binary) modda açar
+ Dosyayı okuma ve yazma güncellemesi için açar

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.

Kod örneğinde hazırlanan metin_dosyası.txt dosyası şu şekilde okunabilir:

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ı

Bu dosya rastgele verilerle dolu

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ı

Bu dosya rastgele verilerle dolu

['\n', 'Dosya test işlemleri\n']

Tablo 5.2 Python Dosya Metotları.


Fonksiyon Tanım
İşlem yapmak için açılan bir dosyayı kapatır.
close()
Dosya kapalıysa bir etkisi yoktur, hata vermez.
detach() Temel alınan akışı (stream) arabellekten ayırarak döndürür
fileno() Dosyanın bir tamsayı değeri olan dosya tanıtıcısı numarasını döndürür.
flush() Dosya akışı (stream) yazma arabelleğini temizler.
isatty() Dosya akışı etkileşimli ise True (Doğru) döndürür.
Dosyadan en fazla x adet karakter okur.
read(x)
Negatif, None (Yok) veya boş ise dosyanın sonuna kadar okur.
readable() Dosya akışı okunabiliyorsa True döndürür.
Dosyadan bir satır okuyarak döndürür.
readline(x=-1)
Belirtilmişse en fazla x bayt veri okur.
Dosyadan satırların bir listesini okuyarak döndürür. Belirtilmişse en fazla x bayt/
readlines(x=-1)
karakter okur.
seek(offset) Dosya imlecini offset ile tanımlanan istenilen pozisyonuna getirmek için kullanılır.
seekable() Dosya akışı (stream) rastgele erişimi destekliyorsa True döndürür.
tell() Dosya nesnesinin geçerli konumunu belirten bir tamsayı değeri döndürür.
Parametresiz olarak kullanıldığında dosya içeriğini siler. Boyut verildiğinde ise o
truncate(boyut=None)
boyuta göre bayt olarak dosyayı boyutlandırır.
Bir dosyanın yazma yetkisine sahip olunup olunmadığını sorgular. Yazma yetkisi
writable()
“w” ile açıldıysa True, okuma yetkisi “r” ile açıldıysa False döndürür.
Dosyaya parametre olarak verilen m dizesini yazar ve yazılan karakter sayısını
write(m)
döndürür.
writelines(liste) Dosyaya parametre olarak verilen satır listesi yazar.

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

Araştır 1 İlişkilendir Anlat/Paylaş

Kullanıcıdan alınacak dos-


ya ismi ile yazmak için yeni İki farklı dosyanın içerikle-
Linux ve Windows işletim
bir dosya oluşturan ve giri- rini birleştirerek farklı bir
sistemlerindeki dosya işlem-
lecek metni açılan dosyaya dosya oluşturan Python ko-
lerindeki farkları araştırınız.
kaydeden bir Python kodu dunu araştırınız.
hazırlayınız.

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.

Geçerli Dizini Alma


Geçerli Çalışma Dizini (CWD), Python kodunun çalıştığı bir klasör olarak düşünülebilir. Dosyalar
yalnızca adlarıyla çağrıldığında, Python yorumlayıcısı bunun CWD’de başladığını varsayarak işlem yapar.
Programın mevcut çalışma dizini (Current Working Directory - CWD), os modülünün getcwd() yön-
temi kullanılarak elde edilebilir. Bu yöntem, geçerli çalışma dizinini bir dize biçiminde döndürmektedir.

Kod:
# işletim sistemi modülünü içe aktarma
import os

# Geçerli çalışma dizinini al


cwd = [Link]()

# Geçerli çalışma dizinini yazdır


print("Geçerli çalışma dizini:", cwd)

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

Dizinleri ve Dosyaları Listeleme


Bir dizindeki tüm dosya ve alt dizinlere listdir() fonksiyonu kullanılarak elde edilebilir. Bu fonksiyon
parametre 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.

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]']

Yeni Dizin Oluşturma


Yeni bir dizin oluşturmak için os modülünün desteklediği [Link]() fonksiyonu bulunmaktadır. Bu
fonksiyona parametre olarak verilen, “dosya yolu” isimli bir dizin oluşturmak için kullanılır. Oluşturulacak
dizin zaten mevcut ise, bu yöntem FileExistsError hatası verecektir.

Kod:
import os

[Link]('bir alt dizin')


print([Link]())

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]']

Bir Dizini veya Dosyayı Yeniden Adlandırma


Bir dizini veya dosyayı yeniden adlandırmak için rename() fonksiyonu kullanılmaktadır. Bu fonksiyon
iki temel parametre almaktadır. Bunlardan ilki eski isim, ikinci parametre de yeni isim değerleridir.

Kod:
import os

[Link]('D:\\temp')
[Link]('eski dizin')

print( [Link]() )

[Link]('eski dizin', 'güncel dizin')


print( [Link]() )

Kod Çıktısı:
['eski dizin']
['güncel dizin']

Dizin veya Dosyayı Kaldırma/Silme


Bir dosyayı kaldırmak, silmek için remove() yöntemi kullanılmaktadır. Boş bir dizini kaldırmak da
rmdir() metodu yardımı ile gerçekleştirilmektedir.

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

Dolu bir dizinin silinmesi örneğini inceleyelim.

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

Araştır 2 İlişkilendir Anlat/Paylaş

Kullanıcıdan alınan dizin


Bir dizinde, var olan bir
isminin altına yine kullanı-
dizin ile aynı isimde yeni
cıdan alınan dosya ismi ile
bir dizin oluşturmak is- OS modülünün destekledi-
bir dosya açılması ve klasör-
tendiğinde bu işlem hata ği fonksiyonları araştırınız.
deki içeriklerin listelenme-
almadan nasıl yapılabilir,
sini sağlayan Python kodu-
araştırınız.
nu hazırlayınız.

İ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.

Program Hataları (Syntax Errors)


Programlama dilinin söz dizimine uygun olmayan kod yazılması nedeniyle ortaya çıkan hataya yazım
(syntax) veya çözümleme (parsing) hatası denilmektedir.

Kod:
# sayı listesi
sayılar = [11, 26, 20, 34, 42, 77, 55, 3, 4, 91]

# liste üzerinde işlem


for deger in sayılar
print(deger)

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.

Mantık Hataları (Bug)


Mantık hatalarının fark edilmesi, yazım hatalarına göre daha zordur. Program çalışırken işleyişe mü-
dahale edecek, sonlanmasına neden olacak bir hata oluşmaz. Fakat, istenilenden daha farklı sonuç veriyor
olması ile bu mantık hataları ortaya çıkmaktadı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.

Python Dilindeki Dahili/Yerleşik İstisnalar


Programlama dilinin izin vermediği işlemler istisnalar oluşturabilir. Python dilinde, ilgili hatalar oluş-
tuğunda ortaya çıkan, birçok dahili tanımlanmış istisna mevcuttur. Yerleşik local() işlevini kullanarak tüm
yerleşik istisnalara ulaşılabilir.

Kod:
print(dir(locals()['__builtins__']))

locals()[‘__builtins__’] fonksiyonu yardımıyla, dahili istisnalar, fonksiyonlar ve niteliklerden oluşan


bir modül elde edilir. Elde edilen bu modülün özniteliklerinin metin dizeleri olarak listelenmesi ise “dir”
fonksiyonu vasıtasıyla gerçekleşir.

Tablo 5.3 Python Yerleşik İstisnalar ve Nedenleri.

İstisna Hata Nedeni


AssertionError Koddaki assert ifadesi başarısız olduğunda tetiklenir
AttributeError Nitelik referansı ya da ataması başarısız olduğunda tetiklenir
EOFError input() fonksiyonu ile işlem yaparken dosya sonuna ulaştığında tetiklenir
FloatingPointError Kayan nokta işlemi sırasında bir hata olduğunda tetiklenir
Bir generator (iterasyon yapılabilen fonksiyonlar) close() fonksiyonu
GeneratorExit
çağrıldığında çağırılır
ImportError İçe aktarılan modül bulunamadığında verilen hatadır
IndexError Bir dizinin indeks değeri aralık dışında olduğunda tetiklenir
KeyError Sözlükte bir anahtar bulunmadığında verilen hatadır
Kullanıcı tarafından işlem iptal etme/kesme tuşuna (Ctrl+C veya Delete)
KeyboardInterrupt
bastığında tetiklenir
MemoryError Bir işleme ayrılan hafıza tükendiğinde tetiklenir
NameError Global ya da yerel alanda tanımlı bir değişken bulunmadığında tetiklenir
Bir fonksiyon oluşturulmadı ise, Soyut (abstract) fonksiyonlar tarafından
NotImplementedError
tetiklenir.
OSError Bir sistem işlemi, işletim sistemi ile ilgili bir hataya neden olduğunda tetiklenir
Bir aritmetik işlemin sonucu, atandığı değişkenin tanımlandığı değer
OverflowError
aralıklarından daha büyük olduğunda tetiklenir
Çöp toplama mekanizması tarafından temizlenmiş bir referansa erişilmeye
ReferenceError
çalışıldığında tetiklenir
RuntimeError Karşılaşılan hata başka bir kategoriye dahil edilemediğinde tetiklenir
Üzerinde yineleme yapılan nesnede döndürülecek başka eleman kalmadığını
StopIteration
göstermek için next() fonksiyonu tarafından tetiklenir
SyntaxError Python kod ayrıştırıcısı (parser) bir sözdizimi hatası ile karşılaştığında tetiklenir

170
5
Programlama II

IndentationError Kodda hatalı bir girinti olduğunda tetiklenir


TabError Kodda girinti tutarsız boşluk ve sekmelerden oluştuğunda tetiklenir
SystemError Yorumlayıcı tarafından dahili bir hata algılandığında tetiklenir
SystemExit [Link]() fonksiyonu tarafından tetiklenir
TypeError Bir fonksiyon veya işlem değeri, yanlış türde bir nesneye atandığında tetiklenir
Bir fonksiyon içinde yerel bir değişkene başvuru yapıldığında ve bu değişkene
UnboundLocalError
öncesinde bir değer ataması yapılmadığında tetiklenir
Unicode karakterler ile ilgili bir kodlama veya kod çözme hatası gerçekleştiğinde
UnicodeError
tetiklenir
UnicodeEncodeError Unicode karakterler ile ilgili bir kodlama hatası gerçekleştiğinde tetiklenir
UnicodeDecodeError Unicode karakterler ile ilgili bir kod çözme hatası gerçekleştiğinde tetiklenir
UnicodeTranslateError Unicode karakterler ile ilgili bir çeviri hatası gerçekleştiğinde tetiklenir
Bir fonksiyon doğru türde fakat uygun olmayan değerde bir parametre
ValueError
aldığında tetiklenir
ZeroDivisionError Mod alma ya da bölme işleminin ikinci işleneni sıfır olduğunda tetiklenir

İ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.

Metod çağrısı Metod çağrısı Metod çağrısı

A Fonksiyonu B Fonksiyonu C Fonksiyonu D Fonksiyonu

Hata yakalama Hata yakalama Hata yakalama Hata yakalama


bulunamadı bulunamadı bulunamadı bulunamadı
Program Hata döndürülüyor Hata döndürülüyor Hata döndürülüyor
kapatılıyor

Şekil 5.1 Python programlama dili hata yakalama mekanizması.

Ö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

liste = [5.7, 0,'R', 7, 2]

for eleman in liste:


try:
print("Eleman:", eleman)
ters = 1/int(eleman)
print(eleman, "tersi:", ters)
except:
print("Hata ", sys.exc_info()[0], "oldu.")
print("Sonraki eleman")
print()

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

liste = [5.7, 0,'R', 7, 2]

for eleman in liste:


try:
print("Eleman:", eleman)
ters = 1/int(eleman)
print(eleman, "tersi:", ters)
except Exception as e:
print("Hata ", e.__class__, "oldu.")
print("Sonraki eleman")
print()

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

Belirli İstisnaların Yakalanması


Program yazarken tüm hataları aynı şekilde ele alan bir kod hazırlanması tavsiye edilen bir durum de-
ğildir. Bir hata yakalanırken except ifadesi ile hangi türde hataların yakalanması gerektiği belirtilebilir. Kod
içerisindeki try ifadesi ise birden fazla except ifadesine sahip olabilir. Herhangi bir hata oluştuğu durumda
ise sadece bir except ifadesi çalıştırılacaktır. Bir except ifadesi içinde de bir değer kümesi ile farklı hatalar
tanımlanabilmektedir.

Kod:
try:
# kod bloğu
pass

except ValueError:
# ValueError hatasının yakalanması
pass

except ( ZeroDivisionError, TypeError ):

173
5
Dosya İşlemleri ve Hata Yakalama

# çoklu hata yakalama


# ZeroDivisionError ve TypeError
pass

except:
# kalan diğer tüm hataların yakalanması
pass

İstisna Oluşturma / Hata Fırlatma


Python programlama dilinde, istisnalar çalışma zamanında hatalar meydana geldiğinde ortaya çıkmak-
tadır. Ayrıca, “raise” anahtar sözcüğü kullanılarak istisnalar kod tarafında da kullanıcı tarafından oluşturu-
labilir. Programcı tarafından oluşturulan istisnanın sebebini açıklamak için de, isteğe bağlı olarak istisnaya
parametre gönderilebilir.

Kod:
>>> raise MemoryError("This is an argument")
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
MemoryError: This is an argument

>>> raise KeyboardInterrupt


Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
KeyboardInterrupt

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

Sıfırdan büyük bir tamsayı giriniz: 85


Girdiğiniz sayı Tek

Sıfırdan büyük bir tamsayı giriniz: 0


Girdiğiniz sayı sıfırdan büyük değil!

Hata Yakalamada Else Bloğu


Program akışına bağlı olarak kimi durumlarda, “try” hata yakalama bloğunda hata olmadan çalıştığın-
da bir kod bloğunun çalıştırılması gerekebilir. Bu gibi durumlarda “else” bloğundan faydalanılabilir. Else
bloğu, try bloğundan sonra çalıştırılacağı için hata yakalama işlemlerinden bağımsızdır.

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

Lütfen bir sayı giriniz: 77


Girilen değer bir Çift sayı değil!

Lütfen bir sayı giriniz: 0


Traceback (most recent call last):
File "[Link]", line 9, in <module>
ters = 1/sayi
ZeroDivisionError: division by zero

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

Kullanıcı Tanımlı Hata Yakalama


Python programlama dilinde yerleşik olarak gelen çok sayıda hata yakalama durumları mevcuttur.
Ancak kimi durumlarda kullanıcılar, programın akışına özel olarak tasarlanmış kendi istisnai durumlarını
oluşturabilirler.
Kullanıcı tanımlı bir istisna oluşturabilmek için yeni bir sınıf oluşturulmalıdır. Oluşturulan yeni istisna
sınıfı, doğrudan veya dolaylı olarak yerleşik olan “Exception” sınıfından türetilmesi gerekmektedir.

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

# Kullanıcı tanımlı hata yakalama


class OzelHata(Exception):
"""Diğer hatalar için temel sınıf"""
pass

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

# 0 ile 100 arasında rastgele bir sayı ataması


sayi = [Link](0,100)
while True:
try:
tahmin = int(input("Bir sayı giriniz: "))
if tahmin < sayi:
raise KucukDegerHatasi
elif tahmin > sayi:
raise BuyukDegerHatasi
break
except KucukDegerHatasi:
print("Daha büyük bir değer deneyin!")
print()
except BuyukDegerHatasi:
print("Daha küçük bir değer deneyin!")
print()

print("Tebrikler, tuttuğum sayıyı bildiniz!!!")

Kod Çıktısı:
Bir sayı giriniz: 50
Daha büyük bir değer deneyin!

Bir sayı giriniz: 75


Daha küçük bir değer deneyin!

Bir sayı giriniz: 66


Daha küçük bir değer deneyin!

Bir sayı giriniz: 60


Daha küçük bir değer deneyin!

Bir sayı giriniz: 55


Daha büyük bir değer deneyin!

Bir sayı giriniz: 57


Tebrikler, tuttuğum sayıyı bildiniz!!!

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

Bilmeniz Gereken 10 Python Dosya Sistemi Yöntemi


Os ve Shutil modülleri ile Dosyaları ve Klasörleri İşleyin
Harika şeyler yapmak amacıyla, dosya sistemiyle etkileşim kurmak için Python programları yazabi-
lirsiniz. Fakat bunun nasıl yapılacağı her zaman çok net olmayabilir.
Bu makale, mevcut ve gelecek vadeden geliştiriciler ve veri bilimcileri için bir kılavuzdur. Dosya sis-
temiyle etkileşimleri otomatikleştirmek ve komut dosyaları yazabilmeniz için 10 temel işletim sistemini
ve Shutil komutunu vurgulayacağız.
Dosya sistemi biraz bir ev gibidir. Bahar temizliği yaptığınızı ve defter dolu kutuları bir odadan
diğerine taşımanız gerektiğini varsayalım. Kutular da dizinler gibidir, bu durumda defterleri tutuyorlar.
Defterler dosyalar gibidir. Onlara okuyup yazabilirsiniz. Bunları dizin kutularınıza koyabilirsiniz.
Bu kılavuzda os ve shutil modüllerindeki metotlara bakacağız. Os modülü, işletim sistemiyle etki-
leşim için kullanılan birincil Python modülüdür. Shutil modülü ise ilave olarak üst düzey dosya işlem-
lerini de içerir. Nedense os ile dizinler oluşturuyorsunuz ama onları Shutil ile taşıyıp kopyalıyorsunuz.
Python 3.4’te pathlib modülü, dosya yollarıyla çalışmayı iyileştirmek için standart kitaplığa eklendi
ve 3.6’dan itibaren standart kitaplığın geri kalanıyla uyum içinde çalışıyor. pathlib yöntemleri, dosya
yollarını ayrıştırmak için bazı faydalar sağlar - yani pathlib, yolları dizeler yerine nesneler olarak ele alır.
Pathlib kullanışlı olsa da, tüm alt düzey işlevlere sahip değildir. Ayrıca, şüphesiz önümüzdeki yıllarda
kodda aşağıdaki işletim sistemi ve kapatma yöntemlerini göreceksiniz. Bu yüzden onlara aşina olmak
kesinlikle iyi bir fikirdir.

….

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

Araştır 3 İlişkilendir Anlat/Paylaş

Dosya oluşturma ve içe-


rik eklenmesi sırasında var
olan bir dosyanın tekrar Mantık hatalarının en
3 farklı hata türüne örnek-
oluşturulması işlemi için önemli sebeplerini araştıra-
ler vererek anlatınız.
gerekli istisna yakalama rak anlatınız.
mekanizmalarını içeren
kodu hazırlayınız.

178
5
Programlama II

Dosya açma, dosyaya


1 yazma ve dosyadan okuma
işlemlerini açıklayabilme

öğrenme çıktıları ve bölüm özeti


Dosya için kullanılan özel
2 metotların kullanımını
kavrayabilme

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

Klasör/dizin oluşturma, silme


3 ve içeriklerinin listelenmesini
ifade edebilme

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

Kodlama sırasında karşılaşılan hataları


4 yönetebilme, hata türleri ve kullanıcı
tanımlı istisnaları ifade edebilme
öğrenme çıktıları ve bölüm özeti

İ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

1 Aşağıdakilerden hangisi dosya açma şekillerinden biri değildir?


A. Okuma B. Yazma C. Sonuna ekleme D. Başına ekleme E. İkili mod

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

3 I. r modu okumak için dosya açar


II. w modu yazmak için dosya açar
III. a modu sonuna eklemek için dosya açar
Yukarı maddelerden hangisi Python dosya açma işlemleri için doğru olarak verilmiştir?
A. Yalnız I B. Yalnız III C. I ve II D. I ve III E. I, II ve III

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?

III. I/O hataları


Yukarıdaki maddelerden hangisi Python programlama dilindeki hatalardan biri değildir?
A. Yalnız I B. Yalnız II C. Yalnız III D. I ve II E. I ve III

8 I. Bir try ifadesi birden fazla except ifadesine sahip olabilir


II. Birden fazla except ifadesinden sadece biri çalışabilir
III. except ifadesinden sonra mutlaka finally gelmelidir
Yukarıdaki maddelerden hangileri Python programlama dilindeki hata yakalama kuralları için
doğrudur?
A. Yalnız I B. Yalnız II C. Yalnız III D. I ve II E. I, II ve III

9 Hata yakalama ile ilgili aşağıdaki maddelerden hangisi yanlıştır?


A. Program yazarken yanlış sözdizimi, hatalı metot ve parametre kullanımı program/yazım
hatalarıdır
B. Yazım hatalarının tespiti ve düzeltilmesi kolaydır
C. Mantık hataları, program çalışırken oluşan hatalardır
D. Her try bloğu, bir except bloğu ile devam etmesi zorunludur
E. Finally bloğu, try bloğunda hata alınmadıysa çalışır

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.

neler öğrendik yanıt anahtarı


2. B Yanıtınız yanlış ise “Dosya İşlemleri” konu- 7. C Yanıtınız yanlış ise “İstisnalar (Exceptions)”
sunu yeniden gözden geçiriniz. konusunu yeniden 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

dosya_adı = input("Lütfen dosya ismini giriniz:")


icerik = input("Lütfen dosya içeriğini giriniz:")

# 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

dizin_adı = input("Lütfen dizin ismini giriniz:")


dosya_adı = input("Lütfen dosya ismini giriniz:")

# dosyayı yazma moduyla aç


dosya = open(dizin_adı + "\\" + dosya_adı + ".txt",'w', encoding = 'utf-8')
[Link]()
# dosyaları listele
print([Link]( dizin_adı ))

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ı

1 Python dilindeki nesne yönelimli 2 Sınıf oluşturma ve bu sınıfa ait nesnelerin


programlamada kullanılan kavramları ifade oluşturulmasını açıklayabilme
edebilme

Sınıf Kalıtımı (Inheritance)

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.

NESNE YÖNELİMLİ PROGRAMLAMA (OOP - OBJECT ORIENTED


PROGRAMMING)
Object Oriented Programming (OOP) yani Türkçe karşılığı Nesne Yönelimli Programlama ya da Nesne
Tabanlı Programlama olarak çevirebileceğimiz bir programlama yaklaşımıdır. 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 dilleriyle aynı şe-
kilde 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.
Python programlamada, sınıf ve nesne oluşturmak oldukça kolaydır. Nesne yönelimli yaklaşımda oluş-
turulan nesneler, gerçek hayattaki nesnelerden de seçilebilir. Programlamada kullanılan nesnelerin iki te-
mel özelliği vardır:
1. Özellikleri (Attributes)
2. 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 Programlamadaki Terimler


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 örnekler
ile inceleyelim.

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

# Araç sınıfından yeni nesne oluşturulması


spor = Araç("Kırmızı", "Benzin")
suv = Araç("Beyaz", "Dizel")

# sınıfın özelliklerine erişim


print("Spor araç {}".format(spor.__class__.tür))
print("SUV araç da {}".format(suv.__class__.tür))

# örneklerin özelliklerine erişim


print("{} aracın yakıtı {}".format( [Link], [Link]ıt))
print("{} aracın yakıtı ise {}".format( [Link], [Link]ı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:

def selam(self, isim):


print( "Merhaba", isim )

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

class AnaSınıf: # ana sınıfın tanımlanması


anaSınıfDeger = 518
def __init__(self):
print( "Ana sınıfın yapıcı metodu çağrıldı")

def anasınıfMethod(self):
print( "Anasınıf metodu çağrıldı" )

def setDeger(self, deger):


AnaSını[Link]ınıfDeger = deger

def getDeger(self):
print( "Ana sınıf özelliği: ", AnaSını[Link]ınıfDeger)

class AltSınıf(AnaSınıf): # alt sınıfın tanımlanması


def __init__(self):
print( "Alt sınıfın yapıcı metodu çağrıldı")

def altsınıfMethod(self):
print( 'Altsınıf metodu çağrıldı')

189
6
Nesne ve Sınıf

c = AltSınıf() # alt sınıfın örneği


[Link]ınıfMethod() # alt sınıfın metodu çağrıldı
[Link]ınıfMethod() # ana sınıf metodu çağrılması
[Link](629) # ana sınıfın değer atma metodu çağrılması
[Link]() # ana sınıfın değer alma metodu çağrılması

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))

def setEnYuksekFiyat(self, fiyat):


self.__enyuksekfiyat = fiyat

a = Araba()
[Link]()

# ücreti değiştirme
a.__enyuksekfiyat = 4750
[Link]()

# atama fonksiyonu kullanımı


[Link](1950)
[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.

Çok Biçimlilik (Polymorphism)


Nesne yönelimli programlamada Çok Biçimlilik kavramı, farklı veri türleri, sınıflar için ortak bir arabi-
rim kullanma kabiliyetidir. Örneğin bir şeklin alan hesaplaması yapılması istendiğinde, farklı şekiller için
farklı birer formül kullanılması gerekecektir. Aynı metodu kullanarak farklı şekillerin alanlarının hesapla-
nabilmesine çok biçimlilik denilmektedir.

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

Araştır 1 İlişkilendir Anlat/Paylaş

Nesne yönelimli program- Nesne yönelimli program-


Nesne yönelimli programla-
lama ile fonksiyonel prog- lamanın fonksiyonel prog-
mayı destekleyen diğer dil-
ramlama arasındaki farkları ramlamadan üstün olduğu
leri araştırınız.
araştırınız. yönleri araştırınız.

SINIF VE NESNE (CLASS & OBJECT)


Nesne yönelimli bir programlama dili olan Python, prosedür yönelimli dillerin aksine, nesneler üze-
rinde durmaktadır. Bir sınıf, kendisinden oluşturulacak nesneler için bir şablon niteliğindedir. Sınıflara
özellik ve yöntemler atanabilmektedir.
Günlük hayatta kullanılan her şey birer nesnedir denebilir. En çok kullanılan cihaz olan cep telefonu
incelersek, belirli işlev ve özelliklere sahip olduğu görülmektedir. Telefonun şarj süresi, hafızası, işlemci gücü,
rengi, ebatları, marka ve model bilgileri telefonun özellikleridir. Telefondan arama yapmak, bir resim prog-
ramı çalıştırmak, video çekmek ise telefon nesnesinin davranışları ve faaliyetleri olarak isimlendirilebilir:
Cep telefonu, üreticisinin hazırladığı bir tasarıma göre üretilmektedir. Bu tasarım ya da şablon, sınıf
kavramına karşılık gelmektedir. Bu tasarım detaylarına uygun olarak üretilen her bir telefon ise bir nesnedir.
Bir telefon tasarımından bir çok telefon üretilebildiği gibi, bir sınıftan da bir çok nesne oluşturulabilir.
Oluşturulan nesneye, oluşturulduğu sınıfın örneği (instance) denir ve bu nesne oluşturma işlemi de örnek-
leme (instantiation) olarak adlandırılır.

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ş

memur = Personel("İsmet", "Kaplan", "Muhasebe", 46)


müdür = Personel("Oktay", "Aslan", "Personel", 51)

print("Memurun ismi: {0} {1}".format([Link], [Link]))


print("{0} Müdür, {1} biriminde çalışmakatadır ve {2} yaşındadır.".for-
mat(müdü[Link], müdü[Link], müdü[Link]ş))

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ş

memur = Personel("İsmet", "Kaplan", "Muhasebe", 46)


müdür = Personel("Oktay", "Aslan", "Personel", 51)

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!')

# Personel sınıfından yeni bir nesne oluşturulması


Alper = Personel()

# Çıktı: <function [Link] at 0x04060078>


print( [Link] )

# Çıktı: <bound method [Link] of <__main__.Personel object at


0x04055710>>
print( [Link] )

# Çıktı: Aramıza hoş geldiniz!


[Link]()

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!')

# Personel sınıfından yeni bir nesne oluşturulması


uzman = Personel()
# Çıktı: Aramıza hoş geldiniz!
[Link]()
# Çıktı: Aramıza hoş geldiniz!
[Link]( uzman )

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.

Kurucu/Yapıcı Metotlar (Constructors)


Python programlama dilinde, sınıflar içerisinde tanımlı fonksiyonlarından çift altçizgi ile başlayan
fonksiyonlara ö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ı verilmek-
tedir. Nesne için bellekte yer ayrıldığı anda bu metot çağırılmaktadır.

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_1 = Araç( "Hyundai", "Tucson", "Kırmızı", "Dizel", "Otomatik" )


print( arac_1 )

arac_2 = Araç( "Fiat", "Egea", "Mavi", "Benzin", "Manuel" )


print( arac_2.__dict__ )

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'

Örnek kodda arac_3 nesnesi için, __init__() metodu-


nun 5 tane zorunlu parametresinin eksik olduğu hatasını dikkat
vermektedir. Kurucu metotta belirtilen parametreler, ilgili Oluşturulan nesnelere ihtiyaca göre, sınıf içerisinde
sınıftan oluşturulan her bir nesne için tanımlanması zo- tanımlanmamış olsa bile özellik eklenebilir. Fakat
runlu olan verileri göstermektedir. yeni eklenen özellikler sadece ilgili nesne için geçer-
lidir, sınıf tanımlaması üzerinde bir etkisi yoktur.
Kod:
class sınıf():
def merhaba(self):
print("Herkese selam!")

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

Nesne ve Özellik Silme


Bir nesne veya bir özellik del fonksiyonu kullanılarak silinebilir.

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]))

arac_1 = Araç( "Hyundai", "Tucson", "Kırmızı", "Dizel", "Otomatik" )


arac_1.özetBilgi()

arac_2 = Araç( "Fiat", "Egea", "Mavi", "Benzin", "Manuel" )


del( arac_2.renk )
print( arac_2.__dict__ )
arac_2.özetBilgi()

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”

araç = Araç (“Hyundai”, “Tucson”, del= (araç)


“Kırmızı”, “Dizel”, “Otomatik”)

Şekil 6.1 Nesne silme.

pass Anahtar Kelimesi


Python programlama dilinde, oluşturulan sınıflar boş bırakılamaz. En az bir satır komut yazılması bek-
lenmektedir. Sınıf içeriği boş bırakılacaksa, pass anahtar kelimesi ile bu gereklilik yerine getirilmiş olacaktır.

Öğrenme Çıktısı
2 Sınıf oluşturma ve bu sınıfa ait nesnelerin oluşturulmasını açıklayabilme

Araştır 2 İlişkilendir Anlat/Paylaş

Sadece kendisinden oluş-


turulmuş nesnelerin tüm
özelliklerini yazdıran “özel-
likler” isimli bir metoda
Çevrenizde çok karşılaştı-
sahip “TemelSınıf ” ismiyle Evin özelliklerini içeren ve
ğınız nesneler için sınıf ve
bir sınıf tanımlayınız. Bu sı- en az 3 tane metodu olan
nesne kavramları ile ilişki-
nıftan “öğrenci” isminde bir bir sınıf tanımı yapınız.
lendiriniz.
nesne oluşturarak, öğrenci
ile ilgili en az 3 özellik ek-
leyerek, nesnenin özellikler
metodunu çağırınız.

198
6
Programlama II

SINIF KALITIMI (INHERITANCE)


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. dikkat
Kalıtım kullanılarak oluşturulan sınıflarda, üst/ana sı- Bir A sınıfından B sınıfı türetilmiş ise, B sınıfın-
nıfın tüm özellikleri alt sınıfa aktarılarak kullanılmasına dan oluşturulan tüm sınıflar da otomatik olarak
izin verilir. İhtiyaç duyulması halinde üst sınıfın metotları A sınıfından türetilmiş olacaktır.
geçersiz kılınarak (override) tekrar tanımlanabilir.

Kalıtım Söz Dizimi:


class AnaSınıf:
# ana sınıfın kod bloğu

class AltSınıf( AnaSınıf ):


# alt sınıfın kod bloğu

Kalıtımı bir kod örneği üzerinden inceleyelim.

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))

personel = Personel("Selami", "Atik")


[Link]ır()

akademik = AkademikPersonel("Zihni", "Sinir", "Araştırma Geliştirme - Sanat ve


Tasarım Fakültesi")
[Link]ır()

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.

Çoklu Kalıtım Söz Dizimi:


class AnaSınıf1:
# ana sınıfın kod bloğu

class AnaSınıf2:
# ana sınıfın kod bloğu

class AltSınıf( AnaSınıf1, AnaSınıf2 ):


# alt 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

Şekil 6.2 Çoklu Kalıtım.

Ö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.

Çok Düzeyli Kalıtım


Python programlama dilinde türetilmiş bir sınıftan kalıtım ile yeni bir sınıf oluşturulabilir. Bu duruma
çok düzeyli kalıtım adı verilmektedir. Bu kalıtım türünde herhangi bir derinlik sınırı bulunmamaktadır.
Kalıtım ile aynı şekilde, tüm türetilmiş sınıfların ve temel sınıfın özellikleri yeni oluşturulan sınıfa kalıtım
ile aktarılmaktadır.

201
6
Nesne ve Sınıf

Çoklu Düzeyli Kalıtım Söz Dizimi:


class AnaSınıf: AnaSınıf
# ana sınıfın kod bloğu
AnaSınıfÖzellikleri
class TüretilmişSınıf( AnaSınıf ):
# türetilmiş sınıfın kod bloğu

class TüretilmişSınıf2( TüretilmişSınıf ): TüretilmişSınıf


# türetilmiş sınıfın kod bloğu
TüretilmişSınıfÖzellikleri
Çoklu düzeyli kalıtımın söz diziminin görselleştirilmiş hali Şekil 6.3’de
gösterilmiştir. TüretilmişSınıf, AnaSınıf ’tan kalıtım ile türetilmiş ve Türe-
tilmişSınıf2 sınıfı da TüretilmişSınıftan türetilmiştir. Böylece, TüretilmişSı-
nıf2 sınıfı diğer iki sınıfın tüm özelliklerine sahip olmuştur. TüretilmişSınıf2

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

Şekil 6.4 Çoklu Kalıtım Görselleştirmesi.

Kod:
class W:
pass

class K:
pass

class A(W):
pass

class B(W, K):


pass

203
6
Nesne ve Sınıf

class C(K):
pass

class X(A, B):


pass

class Y(A, C):


pass

class Z(B, C):


pass

class S(X, Y, Z):


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.

Geçersiz Kılma Yöntemleri (Overriding)


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 olacak-
tı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.

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]ş))

personel = Personel("Selman", "Bilaloğlu")


[Link]()

204
6
Programlama II

akademik = AkademikPersonel("Hamdullah", "Tarık", "Uzaktan Eğitim", "Öğrenme


Yönetim Sistemleri")
[Link]()

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.

Operatör Aşırı Yüklemesi (Overloading)


Temel işlem operatörleri, farklı türler için farklı şekilde davranış sergilemektedir. Örneğin “+” operatö-
rü iki sayı için toplama işlemi yaparken, iki metin ifadesini / dizeyi birbirine ekler veya iki listeyi birleştirir.
“+” operatörü kullanılan bir işlemde, yorumlayıcı arka planda __add__ metodunu otomatik olarak çağır-
maktadır. Bu metot üzerinde ihtiyaca 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.

Tablo 6.1 Temel aşırı yükleme metotları.

Metot Açıklama Örnek Kullanım

Kurucu metottur. Opsiyonel olarak


__init__( self [, args…] ) nesne = sınıfAdı( parametreler )
herhangi bir parametre alabilir

__cmp__( self, x ) Nesne karşılaştırma için kullanılır cmp( nesne, x )


str( nesne ),
__str__( self ) Yazdırılabilir metin gösterimi
format( nesne )
__repr__( self ) Hesaplanabilir metin gösterimi repr( nesne )
__del__( self ) Yıkıcı metottur, nesneyi siler del nesne
d1.__add__(d2) Toplama d1 + d2
d1.__sub__(d2) Çıkarma d1 - d2
d1.__mul__(d2) Çarpma d1 * d2
d1.__truediv__(d2) Bölme d1 / d2
d1.__pow__(d2) Üs Alma d1 ** d2
d1.__mod__(d2) Kalan bulma - Mod alma d1 % d2
d1.__lt__(d2) Küçüktür d1 < d2
d1.__le__(d2) Küçük eşittir d1 <= d2
d1.__eq__(d2) Eşittir d1 == d2
d1.__ne__(d2) Eşit değildir d1 != d2
d1.__gt__(d2) Büyüktür d1 > d2
d1.__ge__(d2) Büyük eşittir d1 >= d2

205
6
Nesne ve Sınıf

“+” operatörünün aşırı yüklenmesini bir örnek ile inceleyelim.

Kod:
# + operatörünün aşırı yüklenmesi

class Toplama:
def __init__(self, değer):
[Link]ğer = değer

# iki nesnenin toplanması


def __add__(self, nesne):
return [Link]ğer + 2 * [Link]ğ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:

Traceback (most recent call last):


File "[Link]", line 16, in <module>
print(ob1 + ob2)
TypeError: unsupported operand type(s) for +: 'Toplama' and 'Toplama'

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.

Karşılaştırma Operatörlerinde Aşırı Yükleme


Python programlama dilinde operatörlerin aşırı yüklemesi, aritmetik operatörlerin yanında karşılaştır-
ma operatörleriyle de yapılabilmektedir. Alan hesabı yapan bir sınıfta “<” küçüktür operatörü ile karşılaş-
tırma sonucu döndüren bir aşırı yükleme örneği inceleyelim.

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])

def __lt__(self, diğer):


self_alan = [Link] * [Link]
diğer_alan = diğ[Link] * diğ[Link]
return self_alan < diğer_alan

a1 = Alan(1,2)
a2 = Alan(2,3)
a3 = Alan(2,4)

# küçüktür operatörü kullanımı


print(a1 < a2)
print(a2 < a3)
print(a3 < a1)

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

Araştır 3 İlişkilendir Anlat/Paylaş

Öğrencinin not ortalaması-


nın hesaplanmasında kullanı-
lacak Not sınıfı oluşturunuz. Diğer programlama dille-
Aşırı yükleme ve üzerine
3 adet not alan bir kurucu rinde kullanılan aşırı yükle-
yazma için kullanılabilecek
metot oluşturunuz. “=” ope- me ile Python dilindeki aşı-
bir örnek senaryo anlatınız.
ratörünü aşırı yükleyerek, 2 rı yüklemeyi karşılaştırınız.
not nesnesinin notlarının or-
talamalarını karşılaştırınız.

207
6
Nesne ve Sınıf

VERİ GİZLEME (DATA ENCAPSULATION)


Nesne yönelimli programlamada verilerin kod içerisinde gizlenmesi için kullanılan bir yöntemdir. Nes-
ne 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.
Nesne yönelimli programlamada bir yazılım geliştirme tekniği olarak verilere özel erişim sağlanır, sınıf
dışarısından izinsiz bir şekilde verilerin değiştirilmesi önlenmektedir. Sınıf üyelerindeki bu sınırlı karşılıklı
bağımlılıklar, sistem karmaşıklığını azaltarak programın daha sağlam ve güvenli bir şekilde hazırlanmasına
yardımcı olmaktadır.
Veri gizleme, bilgi gizleme ya da veri kapsülleme olarak da isimlendirilmektedir. Ayrıca veri kap-
sülleme uygulama 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 veri kapsülleme, özellik adından önce önek olarak çift altçizgi “__” ekle-
nerek yapılmaktadır. Bu özelliklerin sonlarına da en fazla bir adet altçizgi eklenebilir. Böylece, özellik özel/
erişilemez hale gelir ve kullanıcıdan gizlenir.

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ı

Yani örnek kodda son satır şu şekilde çağrılabilir:

print( sayac._Sayac__gizliSayac )

208
6
Programlama II

Veri Gizlemenin Faydaları:


• Gizlenmiş verilere, kötü niyetli kişilerin erişimi engellenerek güvenlik arttırılır
• Sınıf içindeki nesnelerin kendileri ile ilgisi olmayan veriler ile bağlantısı kesilir
• Programcıyı yanlışlıkla ilgisiz verilere bağlanmasını engeller. Kod içinde kullanılan veriler hata ve-
rerek programcıyı uyararak düzeltmesini sağlar
• Nesne yönelimli programlamanın temel konsepti olarak nesnelerin izolasyonunu sağlar
• Geçici verileri kullanıcılardan gizleyerek olası zararların önüne geçilir

Veri Gizlemenin Zararları:


• Kimi zaman programcı fazladan kod yazmak zorunda kalabilir, bu da programcının işini zorlaştırır
ve yazılan kodu uzatarak hataya daha açık hale getirir
• Veriler arasındaki bağlantı, nesnelerin daha hızlı çalışmasını sağlarken veri gizleme bu bağlantıyı engeller

Öğrenme Çıktısı
4 Veri gizlemenin kullanımını ve önemini ifade edebilme

Araştır 4 İlişkilendir Anlat/Paylaş

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.

ÇÖP TOPLAMA (GARBAGE COLLECTION)


Python programlama dilinde bellek ayırma ve ayrılan belleği serbest bırakma/temizleme işlemleri oto-
matik olarak yapılmaktadır. C ve C++ gibi dillerindeki gibi belleğin ayrılması ve serbest bırakılması işlem-
lerinin programcı tarafından yapılmasına gerek kalmamaktadır. Python dilinde bellek ayrılması için iki
yöntem kullanılmaktadır.
• Referans sayımı
• Çöp toplama
Python 2.0 sürümünden önce, Python yorumlayıcısında bellek yönetimi için sadece referans sayım
işlemi kullanılmaktaydı. Referans sayımı, bir nesneye sistemdeki diğer nesneler tarafından kaç kez referans
verildiğini saymaktadır. Nesneye yapılan referanslar kaldırıldığında, nesneye ait referans sayısı bir azaltılır
ve bu sayı sıfır olduğunda, nesne serbest bırakılır.

Kod:
# 26 sayısı bir nesnedir
e = 26

# 26 sayısının referans sayısı 0 olur


e = 44

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 döngüsü oluşturuldu. liste kendine referans veriyor


[Link]( 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 )

# liste nesnesinin hafızadan silinmesi


del liste

# veya nesnesnin değerine None(Null) ataması ile silinebilir


# liste = None

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.

Döngülerde Otomatik Çöp Toplama


Referans döngülerinin bulunması hesaplama gerektirdiği için çöp toplama işlemi zamanlanmış bir
aktivite olarak gerçekleştirilmektedir. Python, çöp toplama işlemini nesnelere hafızadan yer ayırma ve
hafızadaki yeri serbest bırakma eşiğine göre zamanlamaktadır. Hafızada ayrılan yer sayısı ile serbest
bırakılan yer sayısı arasındaki fark, eşik sayısından büyük olduğunda çöp toplayıcı çalıştırılmaktadır.
Eşik değeri, gc modülü yardımı ile incelenebilir. get_threshold() fonksiyonu ile mevcut koleksiyon eşik
değerleri görülebilmektedir.

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.

Çöp Toplayıcının Elle Tetiklenmesi


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ı programcı 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. Ayrıca bu gibi müdahaleler
programcıya istediği sonuçları vermeyebilir.

Kod:
import gc

# hafızada ayrılan ve serbest bırakılan nesne sayısını döndürür


serbest = [Link]()

# 0 nesne için çöp toplayıcı çalışacaktır


print("Çöp toplama: %d nesne için serbest bırakıldı." % serbest )

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

Araştır 5 İlişkilendir Anlat/Paylaş

Örnek bir kod içerisinde


hafızada çeşitli nesneler için
Hangi programlama dille- Arka plan işlevlerine mü-
yer ayırarak, daha sonra bu
rinde çöp toplama mekaniz- dahale etmek gerekli midir,
yerleri çöp toplayıcıyı çağı-
ması olduğunu araştırınız. anlatınız.
rarak serbest bırakan kodu
hazırlayınız.

212
6
Programlama II

Python dilindeki nesne yönelimli


1 programlamada kullanılan
kavramları ifade edebilme

öğrenme çıktıları ve bölüm özeti


Nesne Yönelimli Programlama
(OOP - Object Oriented
Programming)

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 oluşturma ve bu sınıfa


2 ait nesnelerin oluşturulmasını
açıklayabilme

Sınıf ve Nesne (Class & Object)

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

Nesne tabanlı programlamada kalıtım,


3 çoklu kalıtım, geçersiz kılma ve aşırı
yükleme konularını ifade edebilme
öğrenme çıktıları ve bölüm özeti

Sınıf Kalıtımı (Inheritance)

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

4 Veri gizlemenin kullanımını ve


önemini ifade edebilme

Veri Gizleme (Data


Encapsulation)

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.

5 Hafızada yer ayırma ve yer açma


işlemlerini açıklayabilme

Çöp Toplama (Garbage


Collection)

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

1 Aşağıdaki şıklardan hangisi nesne yönelimli programlamadaki terimlerden biri değildir?

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

3 Nesne yönelimli programlama kullanılarak, değişken ve metotlara erişim kısıtlanabilmektedir. Bu


kısıtlama işlemi, verilerin doğrudan erişilip değiştirilmesini önlemek amacıyla kullanılmaktadır.
Python programalama dili için, yukarıda verilen tanıma karşılık gelen kavram aşağıdakilerden hangisidir?
A. Sınıf
B. Kalıtım
C. Kapsülleme
D. Üzerine Yazma
E. Çok Biçimlilik

4 Python programlama dilindeki yerleşik özelliklerden __doc__ özelliğinin işlevi aşağıdakilerden


hangisidir?
A. Sınıfa ait açıklama metni mevcutsa döndürür
B. Sınıfın niteliklerini içeren sözlük değerini döndürür
C. Sınıfın adını döndürür
D. Çağrıldığı nesne veya fonksiyonun adını döndürür
E. Sınıfın temel sınıflarının demetini döndürür

215
6
Nesne ve Sınıf

5
class Personel:
"Personel tanımlarının yapıldığı sınıf"
neler öğrendik?

birim = "Bilgi İşlem"

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ç:

def ……… (self, marka, son_hız, mesafe):


[Link] = marka
self.son_hız = son_hız
[Link] = mesafe

class ……. (Araç):


pass

……… = Otobüs("BMC", 150, 17)


print("Araç markası:", okul_servisi.marka, "Son hız:", okul_servisi.son_
hız, "Mesafe:", okul_servisi.mesafe)

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

7 I. Çoklu kalıtımı desteklemektedir


II. Çok düzeyli kalıtım yapılabilir
III. Türetilmiş bir sınıftan başka bir sınıf türetilemez

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

10 I. Çöp toplama mekanizması otomatik olarak çalışır


II. Çöp toplama mekanizması elle de tetiklenebilir
III. Çöp toplama mekanizması rasgele olarak çalışmaktadır
Python programlama dilindeki çöp toplama (garbage collection) için yukarıdaki maddelerden hangileri
doğrudur?
A. Yalnız I
B. Yalnız II
C. Yalnız III
D. I ve II
E. I, II ve III

217
6
Nesne ve Sınıf

Yanıtınız yanlış ise “Nesne Yönelimli Prog-


1. E 6. A Yanıtınız yanlış ise “Sınıf Kalıtımı (Inheri-
ramlama (OOP - Object Oriented Program-
tance)” konusunu yeniden gözden geçiriniz.
ming)” konusunu yeniden gözden geçiriniz.
neler öğrendik yanıt anahtarı

Yanıtınız yanlış ise “Nesne Yönelimli Prog-


2. D 7. C Yanıtınız yanlış ise “Sınıf Kalıtımı (Inheri-
ramlama (OOP - Object Oriented Program-
tance)” konusunu yeniden gözden geçiriniz.
ming)” konusunu yeniden gözden geçiriniz.

Yanıtınız yanlış ise “Nesne Yönelimli Prog-


3. C 8. B Yanıtınız yanlış ise “Sınıf Kalıtımı (Inheri-
ramlama (OOP - Object Oriented Program-
tance)” konusunu yeniden gözden geçiriniz.
ming)” konusunu yeniden gözden geçiriniz.

Yanıtınız yanlış ise “Veri Gizleme (Data


4. A Yanıtınız yanlış ise “Sınıf ve Nesne (Class & 9. A
Encapsulation)” konusunu yeniden gözden
Object)” konusunu yeniden gözden geçiriniz.
geçiriniz.

Yanıtınız yanlış ise “Çöp Toplama (Garba-


5. D Yanıtınız yanlış ise “Sınıf ve Nesne (Class & 10. D
ge Collection)” konusunu yeniden gözden
Object)” konusunu yeniden gözden geçiriniz.
geçiriniz.

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__)

öğrenci = TemelSınıf("Mustafa", "Neccarzade", 24)


öğrenci.özellikler()

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

# üç notun ortalamasının hesaplanması


def __eq__(self, nesne):
return [Link]() == [Link]()

not_1 = Not( 55, 65, 75 )


not_2 = Not( 65, 75, 85 )

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

# çalışanın detay bilgilerini yazdırır


def detay(self):
# accessing public data member
print("İsim: ", self.__isim, 'Maaş:', self.__maaş)

# çalışanın görevini yazdırır


def çalışma(self):
print(self.__isim, 'nin görevi ', self.__pozisyon)

# çalışan sınıfından bir nesne oluşturma


emp = Çalışan('Haktan', 8700, 'Destek Personeli')

# çalışan sınıfından oluşturulan nesnenin metotlarını çağırma


[Link]()
emp.çalışma()

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

# bir sözlük oluşturularak veri ataması yapılması


def veri_oluştur():
x = { }
x[i+1] = x
print( x )

# çöp temizleme işlemi ile verilerin temizlenmesi


collected = [Link]()
print( "Garbage collector: %d nesne hafızadan kaldırıldı." % (col-
lected) )

print( "Veri oluşturuluyor..." )


for i in range(10):
veri_oluştur()

collected = [Link]()

print( "Garbage collector: %d nesne hafızadan kaldırıldı." % (col-


lected))

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 - MYSQL BAŞLARKEN


MySQL, piyasada kullanılan en popüler açık kaynak
kodlu veritabanı yönetim sistemlerinden (DBMS) biri-
dir. Çoğu yazılım veriler üzerinde işlem yapması gerektiği
için, Python gibi programlama dilleri bu veri kaynakları- dikkat
MySQL veritabanı kurulumu yapılırken ana
na erişmek ve depolamak için araçlar sağlamaktadır.
kullanıcı olan “root” kullanıcısına verdiğiniz şif-
MySQL veritabanı kurulumu yapmak için https:// renizi unutmayınız. Ayrıca veritabanına bağlantı
[Link]/doc/refman/5.7/en/[Link] resmi için kullanacağınız kullanıcı adı ve şifresini de
web sitesinden yararlanılabilir. Ya da en son sürümüne not almanız faydalı olacaktır.
erişmek için [Link]
adresinden kurulum dosyaları indirilebilir.

MySQL ve Python için MySQL Connector Kurulumu


Python, MySQL veritabanına ulaşabilmek için bir MySQL sürücüsüne ihtiyaç duymaktadır. Bu üni-
tede, sürücü olarak “MySQL Connector” kullanılarak kod örnekleri hazırlanacaktır. Sürücüyü yüklemek
için şu komut komut satırında çalıştırılmalıdır:

python -m pip install mysql-connector-python

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

Python DB API V2.0 (PEP 249)


Python DB
API

1 2
[Link]() Connection request
M
MySQL 3 Y
Python 4 [Link]() connected
Connector S
Application Python Q
5 [Link]() result data 6 L

MySQL Database Connection in Python

Şekil 7.1 Python ile MySQL Veritabanı Bağlantısı.


Kaynak: [Link]

Veritabanı ile Bağlantı Kurma


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, veri-
tabanı sunucusu, kullanıcı, şifre ve veritabanı adı gibi bilgileri parametre olarak alarak, MySQLConnecti-
on nesnesi döndürmektedir. Ayrıca bu bilgiler kullanıcıdan alınarak bu metot tetiklenebilir.

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',)

Örnek kodun çıktısında, sistemde oluşturulmuş tüm veritabanları gösterilmektedir.

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"
)

# cursor nesnesi oluşturma


cursor = [Link]()

# 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)

# sunucu ile bağlantıyı koparma


[Link]()

Ö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")

for tablo in cursor:


print( tablo )

Kod Çıktısı:
('calisan',)

Veritabanında şu an sadece “calisan” tablosu oluşturulduğu için, karşımıza tek bir sonuç çıkmaktadır.

Birincil Anahtar (Primary Key)


Veritabanında tablo oluşturulurken, tabloya eklenen her bir kayıt için benzersiz bir anahtar, değer içe-
ren bir sütun da oluşturulmalıdır. Bu sütuna birincil anahtar adı verilmektedir ve sütunda tutulacak veri de
“INT AUTO_INCREMENT PRIMARY KEY” ifadesiyle tanımlanmaktadır. Tablo oluşturma örneğini
bu şekilde güncelleyerek kodu inceleyelim.

Kod:
import [Link]

veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)

# cursor nesnesi oluşturma


cursor = [Link]()

# 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)

# sunucu ile bağlantıyı koparma


[Link]()

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"
)

# cursor nesnesi oluşturma


cursor = [Link]()

# tablo oluşturuldu
[Link]("ALTER TABLE calisan ADD COLUMN id INT AUTO_INCREMENT PRIMARY
KEY")

# sunucu ile bağlantıyı koparma


[Link]()

Öğrenme Çıktısı
1 Veritabanı kurulumu, veritabanı ve tablo oluşturma işlemlerini kavrayabilme

Araştır 1 İlişkilendir Anlat/Paylaş

Öğrencinin isim, soyisim,


Diğer programlama dille-
sınıf, not ortalaması, yaş MySQL gibi açık kaynak
rinde kullanılan veritabanı
kayıtlarının tutulacağı bir kodlu başka veritabanı uy-
bağlantı sürücülerini araş-
tabloyu oluşturan Python gulamalarını araştırınız.
tırınız.
kodunu hazırlayınız.

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, ... );

Komutun kullanımını inceleyecek olursak;


“INSERT INTO” anahtar sözcüğü ile başlayan komut, MySQL sunucusuna yapılacak işlem hakkında
bilgi vermektedir. Zorunlu bir ifade olmakla birlikte, kendisinden sonra işlem yapılacak tablo adının gel-
mesi gerekmektedir. Ardından veri girilmesi istenilen tablodaki sütun adları istenilen sırayla tanımlanır.
“VALUES” anahtar sözcüğünden sonra da, verilen sütun isim ve veri türlerine göre sıra uyumu gözetilerek,
verilerin girilmesi beklenmektedir.
Kod içerisinde kullanılan cursor(), satırlar üzerinde sırayla işlem yapmaktadır. Veritabanına girilmesi
istenen verilerin kaydedilmesi için de [Link]() metodu 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 = "INSERT INTO calisan(isim, soyisim, birim) VALUES (%s, %s, %s)"
val = ("Abdullah", "Birisi", "Döner Sermaye")

[Link](sql, val)
[Link]()

print([Link], "kayıt girildi")

# veritabanı sunucusu ile bağlantının sonlandırılması


[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"
)

# cursor nesnesi oluşturma


cursor = [Link]()

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]()

print([Link], "kayıt girildi")

# veritabanı sunucusu ile bağlantının sonlandırılması


[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.

SELECT * FROM tablo_adı

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]()

for eleman in sonucListe:


print( eleman )

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

(4, 'SENEM', 'YAĞIZ')


(5, 'BURAK', 'GEZER')
(6, 'LEYLA', 'CANLI')
(7, 'BERAT', 'KESKİN')
(8, 'TANER', 'TUNÇER')
(9, 'SEDAT', 'BABAN')
(10, 'ŞAZİYE', 'YILDIZ')
(11, 'KEVSER', 'URUÇ')
(12, 'YEMLİHA', 'ERTUĞRUL')
(13, 'EMRE', 'TUT')
(14, 'BETÜL', 'KORUM')
(15, 'NASIR', 'ALBAYRAK')
(16, 'MUSTAFA', 'CİN')

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]()

for eleman in sonucListe:


print( eleman )

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]()

for eleman in sonucListe:


print( eleman )

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]()

for eleman in sonucListe:


print( eleman )

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]()

for eleman in sonucListe:


print( eleman )

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]()

for eleman in sonucListe:


print( eleman )

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]()

sql = "DELETE FROM calisan WHERE id = 7"


[Link]( sql )

[Link]()

print( [Link], "kayıt silindi" )

Kod Çıktısı:
1 kayıt silindi

Tablodan veri silme gibi herhangi bir sorgudaki değer- dikkat


lerin gizlenmesi, kullanıcıdan alınan verinin sorgu içeri- [Link]() metodu çağrılmadan tablo
sine yazılmaması tavsiye edilmektedir. Böylece en yaygın üzerinde yapılan işlemler veritabanında güncel-
web korsanlığı tekniklerinden biri olan SQL Injection lenmeyecektir. Ayrıca WHERE şartının eklen-
saldırılarının da önüne geçilebilir. Veritabanı ile aramız- mediği bir DELETE komutu, tablodaki tüm
daki bağlantıyı sağlayan [Link] modülünde, ve- verileri silecektir.
rilerin gizlenmesi için %s yer tutucusu kullanılmaktadır.

Kod:
import [Link]

veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
cursor = [Link]()

sql = "DELETE FROM calisan WHERE birim = %s"


birim = ("Muhasebe",)
[Link]( sql, birim )

[Link]()

print( [Link], "kayıt silindi" )

239
7
Python ile MySQL Veritabanı İşlemleri

Kod Çıktısı:
2 kayıt silindi

sql = "DELETE FROM calisan WHERE birim = %s"


birim = ("Muhasebe",)
[Link]( sql, birim )

satırları şu şekilde de yazılabilir:

[Link]( "DELETE FROM calisan WHERE birim = %s", ("Muhasebe",) )

Drop Table Komutu


Veritabanında varolan bir tabloyu silmek için DROP TABLE komutu kullanılmaktadır. Tablo ile ilgili
tüm veriler, indeksler gibi bilgiler de silinecektir.

Kod:
import [Link]

veritabani = [Link](
host="localhost",
user="kullanıcı_adı",
password="kurulum_şifresi",
database="personel"
)
cursor = [Link]()

sql = "DROP TABLE calisan"


[Link]( sql )

Ö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]()

sql = "DROP TABLE IF EXIST calisan"


[Link]( sql )

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]()

sql = "UPDATE calisan SET dogum_tarihi = '2000-04-17' WHERE id = 3"


[Link]( sql )

[Link]()

print( [Link], "kayıt güncellendi" )

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;

SELECT * FROM tablo_adı LIMIT limit OFFSET offset;

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]()

for eleman in sonucListe:


print( eleman )

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]()

for eleman in sonucListe:


print( eleman )
242
7
Programlama II

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

İlk örnek kodda limit 3 alınarak, tabloya ilk kayıt ya- 5


pılan 3 veri listelenmiştir. İkinci kodda ise, limit 5 alınmış
6
ve offset değeri de 3 verilerek, 3. kayıttan sonraki 5 kaydın LIMIT 5
listesi elde edilmiştir. 7

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ı.

Tablo 1 Tablo 2 Tablo 1 Tablo 2 Tablo 1 Tablo 2

INNER JOIN LEFT JOIN RIGHT JOIN


Şekil 7.3 Join Komutu Çeşitleri.

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

SELECT sütun1, sütun2,...


FROM tablo1
INNER JOIN tablo2 ON koşul;

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ı" },

JOIN/INNER JOIN Örneği


Kod:
import [Link]

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] "

cursor .execute( sql )

244
7
Programlama II

sonucListe = [Link]()

for eleman in sonucListe:


print( eleman )

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ı')

LEFT JOIN Örneği


Kod:
import [Link]

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] "

cursor .execute( sql )

sonucListe = [Link]()

for eleman in sonucListe:


print( eleman )

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

RIGHT JOIN Örneği


Kod:
import [Link]

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] "

cursor .execute( sql )

sonucListe = [Link]()

for eleman in sonucListe:


print( eleman )

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

Araştır 2 İlişkilendir Anlat/Paylaş

Örnek olarak oluşturulan Veritabanında karakter


calisan isimli tabloda, is- tutulan alanlarda Türkçe
Açık kaynak kodlu diğer ve-
minde A harfi geçenlerin desteği için hangi karakter
ritabanlarını araştırınız.
listesini döndüren kodu ha- seti kullanılması gereklidir,
zırlayınız. araştırınız.

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

Python - MySQL Başlarken

Ç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ı ile ilgili


2 komutları ve kod içerisinde
kullanımını kavrayabilme

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?

Yukarıda verilen MySQL komutunda boş bırakılan


Yukarıda tanımı verilen MySQL komutu aşağıda- yerlere sırasıyla aşağıdaki şıklardan hangisi gelmelidir?
kilerden hangisidir?
A. UPDATE, SET
A. LIMIT B. UPDATE, INTO
B. ORDER BY C. SELECT, INTO
C. GROUP BY D. SELECT, FROM
D. SELECT E. DELETE, FROM
E. WHERE

10 I. commit() metodu kullanılmayan işlemler


8 I. Tablodaki verileri siler veritabanına aktarılmaz
II. Veritabanından tabloyu siler II. WHERE filtresi uygulanmayan UPDA-
III. WHERE filtresi ile kullanılmazsa tablo- TE komutu ile tüm tablo güncellenir
daki tüm verileri siler III. LIMIT ifadesi kullanılmayan sorgu sonu-
MySQL DELETE komutu için yukarıdaki madde- cu boş gelir
lerden hangileri doğrudur? MySQL veritabanı için yukarı maddelerden han-
A. Yalnız I gisi doğrudur?
B. Yalnız II A. Yalnız I
C. Yalnız III B. Yalnız II
D. I ve II C. I ve II
E. I ve III D. II ve III
E. I, II ve III

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.

neler öğrendik yanıt anahtarı


2. B Yanıtınız yanlış ise “Python - MySQL Baş- 7. B 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"
)

# cursor nesnesi oluşturma


cursor = [Link]()

# 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 )

# sunucu ile bağlantıyı koparma


[Link]()

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]()

sql = "SELECT id, isim, soyisim FROM calisan WHERE


isim like '%A%'"
[Link]( sql )

sonucListe = [Link]()

for eleman in sonucListe:


print( eleman )

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

Komut çalıştırıldıktan sonra ilk web uygulamasını oluşturmaya başlayabiliriz.

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:

django-admin startproject proje_adı

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]

Oluşturulan projenin yapısını inceleyecek olursak;


proje_adı klasörü sadece iki tane nesne içeren proje kapsayıcısıdır.
[Link]: Bu dosya, proje ile komut satırı aracılığıyla iletişim kurmak için hazırlanmış yerel bir
Django-admin’dir. Veritabanı senkronizasyonu, geliştirme sunucusu başlatma gibi görevleri gerçekleştir-
meye yarayan komut satırı yardımcı programıdır.
proje_adı: Alt klasördür ve projedeki gerçek Python paketidir. Dört adet dosya içermektedir.
__init__.py: Bu dosya olduğu için, bu klasör bir paket olarak kabul edilir.
[Link]: Adından da anlaşılacağı gibi, bu dosya projedeki tüm ayarları yönetmektedir.
[Link]: Sitedeki linkleri kontrol eden, tüm bağlantıları ve metotları yönlendiren ana işlevdir.
[Link]: Proje WSGI (Web Server Gateway Interface) üzerinden sunulması gerekiyorsa, uyumlu web
sunucular için bir giriş noktası görevi görmektedir.
Uygulamayı oluşturmak için, komut satırında [Link] dosyası ile aynı klasörde iken aşağıdaki ko-
mutun çalıştırılması gerekmektedir.

python [Link] startapp webapp

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',
)

Arayüz Oluşturma (View)


Bir görüntüleme fonksiyonu olan arayüz, sadece web isteği (web request) alan ve web yanıtı (web res-
ponse) döndüren bir Python metodudur. Döndürülen bu yanıt, bir XML belgesi, CSV dosyası, 404 hatası,
ses dosyası, web sayfasının HTML içeriği gibi farklı içerikler olabilir.
Web sayfalarının oluşturulması için arayüz/görünüm (view) kullanılmaktadır ve bu sayfaların görünür
olabilmesi için sayfaya ait bir URL ile ilişkilendirilmesi gerekmektedir.

256
8
Programlama II

Django’da arayüzler, webapp/[Link] dosyasında oluşturulmalıdır.


Basit bir içerik girilecek bir arayüz oluşturarak inceleyelim.

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'),
]

Daha sonra proje_adı/[Link] dosyasının içeriğini aşağıdaki gibi güncelleyiniz.

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:

python [Link] runserver 8081

Sunucu çalıştırıldıktan sonra, adres çubuğuna [Link] yazıldığında örnek html


içeriğini eklediğimiz metot çağırılacak ve Resim 8.1’deki ekran görüntülenecektir.

Resim 8.1 Örnek proje sayfası.

Şablon Oluşturma (Template)


Html arayüz oluşturmak için HttpResponse kullanıldı. Fakat Html sayfalarını oluşturmak için bu
yöntem en iyi seçenek değildir. Django, MVT (Model View Template) yapısını desteklediği için bu yapı
üzerinden projeyi oluşturmak daha uygun olacaktır.
Yeni oluşturulan webapp klasörünün içerisine templates klasörü ve içine [Link] dosyasını oluş-
turalım. Şablon html dosyası için de [Link] dosyasının içine “html_hello” isimli bir metot tanımlayalım.

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>&nbsp;&nbsp;&nbsp;&nbsp;
<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

Resim 8.2 Örnek Html sayfası çıktısı.

Şablon dosyalara parametre de gönderilebilmektedir. Bu parametreler öncelikle url yönlendirmesi yapı-


lan “[Link]” dosyasına eklenmeli ve sonrasında, “[Link]” dosyasına da ilgili parametreyi alan bir metot
tanımlanmalıdır. Parametrelerin gösterileceği şablon dosyalar da, templates klasörü altında oluşturulmalıdır.
Eğer gönderilecek veri bir sayı ise, [Link] dosyasına url parametresi olarak <int:veri>, veri bir metin ise
de <str:veri> şeklinde girilmelidir. Tablo 8.1’de, url parametrelerinde kullanılabilecek veri türleri detaylı
olarak gösterilmektedir.

Tablo 8.1 [Link] için varsayılan Django yol (url) dönüştürücüleri.


Url Dönüştürücü Tipi Açıklama Örnek URL Dönüştürücü
path(‘giyim/<str:giyim_turu>/’,...)

str Değer olarak standart Python str veri tipi


Url ayırıcı “/” haricinde boş olmayan
değerlerini alabilir.
herhangi bir metin ile eşleşir
<str:veri>
/giyim/erkek%20giyim/ veya
/giyim/çocuk%20giyim/
path(‘urunler/<int:urun_no>/’,...)
int
Sıfır veya herhangi bir pozitif tamsayı Değer olarak standart Python int veri tipi
ile eşleşir değerlerini alabilir.
<int:veri>
/urunler/12/ veya /urunler/3452/
path(‘hakkinda/<slug:sayfa>/’,...)
Normalize edilmiş ASCII metinleridir.
Küçük harfler, numaralar ve “-” işareti sayfa=bize-ulasin
slug içerebilir. /hakkinda/bize-ulasin

<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})

def mesaj_goster(request, mesaj):


return render(request, "mesaj_goster.html", {'mesaj' : mesaj})
...

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.

sayi_goster şablonu için kullanılacak url:

[Link]

mesaj_goster şablonu için kullanılacak url:

[Link]

Resim 8.3 sayi_goster şablonu parametre ile çağrılması.

Resim 8.4 mesaj_goster şablonu parametre ile çağrılması.

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]):

isim = [Link](max_length = 50)


website = [Link](max_length = 50)
eposta = [Link](max_length = 50)
telefon = [Link](max_digits=10, decimal_places=0)

class Meta:
db_table = "kartvizit"

Her model, [Link]’den kalıtım yoluyla türetilmektedir. Oluşturulan Kartvizit sını-


fının 3 tane karakter ve 1 tane de noktalı sayı olmak üzere 4 özelliği bulunmaktadır. Bu özellikler tablo
alanları/sütunları olacaktır. Bunların yanında, otomatik olarak her tablo için id alanı eklenmektedir, tekrar
modelde tanımlanmasına gerek yoktur. Otomatik id alanının arka planda yapılan tanımı da şu şekildedir:

id = [Link](primary_key=True)

Django, tablo veya koleksiyonu otomatik olarak projeAdı_modelAdı şeklinde isimlendirmektedir.


Meta sınıfında tanımlanan “db_table” özelliği ile de, veritabanında oluşturulacak olan tablonun adı, prog-
ramcı tarafından istenildiği gibi isimlendirilebilmektedir.
Model oluşturulduktan sonra, Django ile veritabanında tablolar oluşturulmaktadır.
Python ile MySQL bağlantısı kurulabilmesi amacıyla, Django’nun sitesinde tavsiye edilen bağlantı
sürücülerinden birini yüklemek için aşağıdaki kodlardan yararlanılabilir.

pip install mysql-connector-python

veya

pip install mysqlclient

“proje_adi/[Link]” dosyasının içerisinde MySQL veritabanı bağlantı bilgileri girilmelidir. MySQL


kurulumundaki kullanıcı adı, şifresi ve oluşturulan veritabanı adı bilgileri ilgili alanlara girilmesi gerek-
mektedir.

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:

python [Link] makemigrations

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:

python [Link] migrate

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.

python [Link] check

Verinin Düzenlenmesi (CRUD - Create Retrieve Update Delete) İşlemleri


Django, kurulum ve bağımlılık sorunu olmadan hızlı bir şekilde web uygulaması oluşturmaya izin
veren bir web geliştirme platformu sunmaktadır. MVT (Model Görünüm Şablon) mimarisini temel alarak
CRUD (Oluştur Al Güncelle Sil) işlemlerini gerçekleştirir. CRUD, veritabanındaki bir tablo üzerinde
Oluşturma, Alma, Güncelleme ve Silme işlemlerini gerçekleştirmek anlamına gelmektedir.

265
8
Django ile Web Sitesi Hazırlama

Kullanıcı

URL View

Django
Template Model

Resim 8.5 Django çalışma diyagramı.

Oluştur: Veritabanındaki bir tabloda yeni kayıtlar oluşturma veya ekleme


Al: Mevcut girdileri bir liste olarak okuma, alma, arama veya görüntüleme (Liste Görünümü) veya
belirli bir kaydı ayrıntılı olarak alma (Ayrıntılı Görünüm)
Güncelle: Veritabanındaki bir tablodaki mevcut girişleri güncelleme veya düzenleme
Sil: Veritabanındaki bir tablodaki mevcut girişleri silme, devre dışı bırakma veya kaldırma
Örnek kod üzerinden CRUD işlemlerinin uygulanışını inceleyelim. “webapp/[Link]” dosyasına
crud_islemleri metodu eklendi. Daha sonra “webapp/[Link]” dosyasına bu metoda yönlendirme yapacak
kod eklendi.

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

#Tüm kayıtları oku


kartlar = [Link]()
res ='<b>Tüm Kartvizit kayıtları :</b><br>'

for kart in kartlar:


res += [Link]+"<br>"

# Belirli bir kaydın bulunması


kart = [Link](isim = "Tuncay Dere")
res += '<b>Bir kayıt yazdırılıyor</b> <br>'
res += [Link]

# Bir kayıt silme


res += '<br> <b>Bir kayıt siliniyor</b> ' + [Link] + '<br>'
[Link]()

# Kayıt güncelleme
kart = Kartvizit(
isim = "Hamdullah Suphi Tanrıöver",
website = "[Link]
eposta = "hsuphi@[Link]", telefon = 5569875412
)

[Link]()

res += '<b>Yeni kayıt yapılıyor...</b> ' + [Link] + '<br>'

# Kayıt güncelleme
kart = [Link](eposta = "elon@[Link]")
[Link] = "elon@[Link]"
[Link]()

res += '<b>Kayıt güncelleniyor...</b> ' + [Link] + '<br>'

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

Kullanıcı Boş form


verisi oluşturma

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

Resim 8.6 Django Form çalışma şeması.

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.

Bir Görünümde Form Kullanma


GET ve POST olmak üzere iki tür HTTP isteği vardır. Django’da, görünüme parametre olarak iletilen
istek (request) nesnesinin, isteğin türünün ayarlandığı “method” adlı bir özelliği vardır ve POST aracılığıy-
la iletilen tüm verilere [Link] sözlüğü aracılığıyla erişilebilir.
Giriş sayfasının görünümünü “webapp/[Link]” dosyasına ekleyelim.

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()

return render(request, '[Link]', {"username" : username})

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>

<form name = "form" action = "{% url "login" %}"


method = "POST" >{% csrf_token %}

269
8
Django ile Web Sitesi Hazırlama

<div style = "max-width:470px;">


<center>
<input type = "text" style = "margin-left:20%;"
placeholder = "Kullanıcı Adı" name = "username" />
</center>
</div>

<br>

<div style = "max-width:470px;">


<center>
<input type = "password" style = "margin-left:20%;"
placeholder = "Şifre" name = "password" />
</center>
</div>

<br>

<div style = "max-width:470px;">


<center>

<button style = "border:0px; background-color:#4285F4; margin-


top:8%;
height:35px; width:80%;margin-left:19%;" type = "submit"
value = "Login" >
<strong>Giriş</strong>
</button>
</center>
</div>
</form>
</body>
</html>

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 %}

[Link] adresinden kullanıcı giriş ekranına ulaşılmaktadır.

270
8
Programlama II

Resim 8.7 Kullanıcı giriş ekranı.

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.

Giriş ekranından yapılan POST yönlendirmesi ile [Link] adresine gidi-


lecektir.

271
8
Django ile Web Sitesi Hazırlama

Resim 8.8 Karşılama ekranı.

Öğrenme Çıktısı
1 Django projesi ve bileşenlerini oluşturabilme

Araştır 1 İlişkilendir Anlat/Paylaş

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.

Yönetici Arayüzünü Başlatma


Yönetici arayüzü, [Link] modülüne bağlıdır. Çalışması için bazı modüllerin “proje_adı/set-
[Link]” dosyasındaki INSTALLED_APPS ve MIDDLEWARE_CLASSES demetlerine (tupple) aktarıl-
dığından emin olmanız gerekir.

272
8
Programlama II

INSTALLED_APPS bölümü şu şekilde olmalıdır:


INSTALLED_APPS = (
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'uygulama_adı',
)

MIDDLEWARE_CLASSES kısmı da şu şekilde olmalıdır:


MIDDLEWARE_CLASSES = (
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
'[Link]',
)

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.

python [Link] makemigrations


python [Link] migrate

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.

python [Link] createsuperuser

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]),
]

Tüm kontroller yapıldıktan sonra, şu komut ile sunucu başlatılabilir:

python [Link] runserver

Yönetici ekranlarına [Link] adresinden ulaşılabilir.

273
8
Django ile Web Sitesi Hazırlama

Resim 8.9 Django Yönetici Arayüzü giriş ekranı.

Süper kullanıcı hesabı oluşturularak sisteme giriş yaptıktan sonra şu ekran karşımıza çıkacaktır:

Resim 8.10 Django Yönetici Arayüzü.

Bu arayüz, Django gruplarının, kullanıcıların ve uygulamadaki tüm kayıtlı modellerin yönetilmesine


izin vermektedir. Bu arayüz, modeller üzerinde basit olarak “CRUD” (Oluştur, Oku, Güncelle, Sil) işlem-
lerini yapabilme imkanı vermektedir.

274
8
Programlama II

Yaşamla İlişkilendir

Django vs Flask: Web Uygulamanız için en iyisi hangisi?


Python Web geliştirme ile ilgileniyorsanız, kesinlikle Django ve Flask gibi iki çerçeveyi duymuş
olabilirsiniz. Ancak web uygulamanız için hangisini seçeceğiniz konusunda kafanız karıştıysa, Django
Vs Flask’taki bu blogu okuduktan sonra kafa karışıklığınız kesinlikle sona erecektir.
Django, sunucu ve istemci tarafı geliştirme yapılabilen (full stack) ve üst düzey Python tabanlı bir
Web yazılım geliştirme platformudur. Hızlı gelişmeyi ve temiz ve pragmatik tasarımı teşvik eder. Djan-
go, deneyimli geliştiriciler tarafından oluşturulmuştur ve Web geliştirme güçlüklerinin çoğunu zarif bir
şekilde ele alır. Bu, tekerleği yeniden icat etmenize gerek kalmadan uygulamanızı yazmaya odaklanabil-
meniz için yapılır. Üstelik ücretsiz ve açık kaynaklı bir yazılım geliştirme platformudur.
Flask, hafif bir WSGI (Web Sunucusu Ağ Geçidi Arayüzü) web uygulaması mikro yazılım geliş-
tirme platformudur. Web geliştirmeye hızlı ve kolay bir şekilde başlamanıza yardımcı olmak için tasar-
lanmıştır. Ayrıca, karmaşık uygulamalara ölçeklendirme yeteneği sağlar. Başlangıçta, Werkzeug ve Jinja
çevresinde basit bir sarmalayıcı olarak başlamış ve şimdi en popüler Python web uygulaması geliştirme
platformlarından biri haline gelmiştir.
Django ve Flask Karşılaştırması
Geliştirme Platformu (Framework) Türü
Django bir tür Full Stack platformudur, Flask ise Mikro platform kategorisine girer.
Veri tabanı
Uygulamanız SQLite, PostgreSQL, MySQL veya Oracle’a ihtiyaç duyuyorsa Django kullanmayı
tercih etmelisiniz. Öte yandan, NoSQL kullanıyorsanız veya hiç veritabanı kullanmıyorsanız, Flask
daha iyi bir seçimdir.
Proje Boyutu
Flask, iyi tanımlanmış kapsamları ve daha kısa beklenen ömürleri olan daha küçük, daha az kar-
maşık projeler için uygundur. Django, projenin büyüklüğünden bağımsız olarak tutarlı bir uygulama
yapısını zorladığı için, neredeyse tüm Django projeleri benzer bir yapıya sahiptir. Bu nedenle Django,
daha uzun ömürleri olan ve çok fazla büyüme potansiyeli olan daha büyük ekiplerle daha büyük proje-
leri yürütmek için daha uygundur.
Proje Düzeni
Django geleneksel bir proje yapısı kullanırken Flask isteğe bağlı proje yapısı kullanır.
Uygulama Türü
Django, sunucu tarafı şablonlama ile tam özellikli web uygulamaları oluşturmada çok iyidir. SPA
(Single Page Application) veya mobil uygulamanızı besleyen statik bir web sitesi veya RESTful web hiz-
meti istiyorsanız, Flask tercih edilen bir seçimdir. Django, Django REST Framework ile birlikte ikinci
durumda da iyi çalışır.
RESTful API
En popüler üçüncü şahıs Django paketlerinden biri olan Django REST Framework (DRF), Djan-
go modellerini bir RESTful arabirimi aracılığıyla ortaya çıkarmak için kullanılan bir çerçevedir. API’leri
hızlı ve kolay bir şekilde oluşturmak için ihtiyacınız olan her şeyi (görünümler, seri/dizi haline ge-
tiriciler, doğrulama, kimlik doğrulama) ve daha fazlasını (API arayüzü, sürüm oluşturma, önbelleğe
alma) içerir. Flask, Flask-RESTful, Flask-Classful, Flask-RESTPlus for Views, Flask-Marshmallow for
Serialization, Flask-JWT, Flask-JWT-Extended for Authentication gibi birçok harika uzantıya sahiptir.

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

Araştır 2 İlişkilendir Anlat/Paylaş

Yönetici panelinden nasıl Django alternatifi başka uy-


Django’yu hangi projelerde
yeni kullanıcı ekleneceğini gulama geliştirme platform-
kullanabilirsiniz, araştırınız.
araştırınız. larını araştırınız.

276
8
Programlama II

1 Django projesi ve
bileşenlerini oluşturabilme

öğrenme çıktıları ve bölüm özeti


Django Kurulumu

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:

django-admin startproject proje_adı

Proje klasörünün altında şu dosyalar oluşturulacaktır:


[Link] dosyası, proje_adı alt klasörüve bu klasör altında __init__.py, [Link],
[Link] ve [Link] dosyaları bulunmaktadır.
Bir görüntüleme fonksiyonu olan arayüz, sadece web isteği (web request) alan ve web yanıtı (web response)
döndüren bir Python metodudur. Web sayfalarının oluşturulması için arayüz/görünüm (view) kullanıl-
maktadır ve bu sayfaların görünür olabilmesi için sayfaya ait bir URL ile ilişkilendirilmesi gerekmektedir.
Django, MVT (Model View Template) yapısını desteklediği için, bu yapı üzerinden arayüzler html forma-
tında oluşturulabilir.
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ımlanmaktadır.
Model üzerinden CRUD işlemleri yapılabilmektedir. CRUD, veritabanındaki bir tablo üzerinde Oluştur-
ma, Alma, Güncelleme ve Silme işlemlerini gerçekleştirmek anlamına gelmektedir.
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.

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.

python [Link] makemigrations


python [Link] migrate
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.

python [Link] createsuperuser

277
8
Django ile Web Sitesi Hazırlama

1 Django projesinde tanımlanmış [Link] dosyasının işlevi aşağıdakilerden hangisidir?


A. Proje ayarlarının gerçekleştirilmesi
neler öğrendik?

B. Bağlantı ve metotların yönlendirilmesi


C. Web sunucular için bir giriş noktası
D. Veritabanı işlemleri
E. Şablonların bulunduğu dosya

2 I. Web isteği (web request) alırlar


II. Web yanıtı (web response) döndürler
III. Yalnızca HTML veri döndürebilirler
Django’da arayüzler (view) 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

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

4 I. python [Link] startapp webapp

II. python [Link] migrate


III. python [Link] runserver 8081

Yukarıdaki seçeneklerden hangisi Django sunucusunu başlatmak için kullanılamaz?


A. Yalnız I
B. Yalnız II
C. Yalnız III
D. I ve II
E. II ve III

278
8
Programlama II

5
...

neler öğrendik?
path('arsiv/<str:tarih>', views.arsiv_getir, name='arsiv_getir')
...

Yukarıda verilen örnek kodda aşağıdaki işlemlerden hangisi yapılmaktadır?


A. arsiv adresini arsiv_getir adresine yönlendirir
B. tarih verisini ekrana yazdırır
C. arsiv/24.04.1994 adresinden gelen verileri, “24.04.1994” tarih verisi parametre olacak şekilde arsiv_ge-
tir metoduna yönlendirir
D. arsiv metoduna ‘arsiv_getir’ parametresi ile yönlendirir
E. arsiv adresini arsiv_getir ile değiştirir

6 I. Tablo ve alanlarının tanımları yapılmaktadır


II. Modeller, [Link]’den kalıtım yoluyla türetilmektedir
III. Tablolara id alanı otomatik olarak eklenmektedir
Yukarıdaki maddelerden hangileri Django’daki modeller için doğrudur?
A. Yalnız I
B. Yalnız III
C. I ve II
D. I ve III
E. I, II ve III

7 I . Veritabanı bağlantı bilgileri [Link] dosyasında tutulmaktadır


II. python [Link] migrate komutu ile veritabanı güncelleştirmeleri yapılır
III. python [Link] check komutu ile web sitesi çalıştırılır
Yukarıdaki maddelerden hangileri Django’da veritabanı için doğrudur?
A. Yalnız I
B. Yalnız III
C. I ve II
D. I ve III
E. I, II ve III

279
8
Django ile Web Sitesi Hazırlama

8 I. Verileri işlemeye hazır hale getirmek için hazırlamak ve yeniden yapılandırmak


II. Veriler için HTML formları oluşturma
neler öğrendik?

III. İstemciden gönderilen form ile verileri almak ve işlemek


Yukarıdaki maddelerden hangileri Django’da formlar için doğrudur?
A. Yalnız I
B. Yalnız III
C. I ve II
D. I ve III
E. I, II ve III

9 I. Basit CRUD işlemleri yapılabilir


II. Kullanıcı eklenebilir
III. Yetkilendirmeler yönetilebilir
Django admin paneli için yukarıdakilerden hangisi doğrudur?
A. Yalnız I
B. Yalnız III
C. I ve II
D. I ve III
E. I, II ve III

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 /


1. B Yanıtınız yanlış ise “Django Kurulumu” ko- 6. E
Model Oluşturma” konusunu yeniden göz-
nusunu yeniden gözden geçiriniz.
den geçiriniz.

neler öğrendik yanıt anahtarı


Yanıtınız yanlış ise “Django Kurulumu / Yanıtınız yanlış ise “Django Kurulumu /
2. C 7. C
Arayüz Oluşturma” konusunu yeniden göz- Model Oluşturma” konusunu yeniden göz-
den geçiriniz. den geçiriniz.

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.

Yanıtınız yanlış ise “Django Kurulumu /


4. D 9. E Yanıtınız yanlış ise “Django Kurulumu” ko-
Arayüz Oluşturma” konusunu yeniden göz-
nusunu yeniden gözden geçiriniz.
den geçiriniz.

Yanıtınız yanlış ise “Django Kurulumu /


5. C 10. D Yanıtınız yanlış ise “Django Kurulumu” ko-
Şablon Oluşturma (Template)” konusunu
nusunu yeniden gözden geçiriniz.
yeniden gözden geçiriniz.

Araştır Yanıt
8 Anahtarı

Model, veritabanı işlemlerinin yapıldığı, tablo ve alan bilgilerinin tutulduğu


sayfalardır. Kullanıcı için arka planda CRUD işlemlerini gerçekleştirdiği için
SQL sorguları yazılmasına gerek kalmaz.
View: Fonksiyonlar View içerisinde hazırlanır. Model ve Template ile birlikte
Araştır 1
çalışır. Fonksiyonlardaki işlem sonuçları Template içindeki HTML dosyaları-
na yönlendirilir.
Template: HTML sayfaların tasarlandığı kısımdır. İstemciye sunulan sayfalar
bu kısımda tutulmaktadır.

python [Link] createsuperuser komutu ile Django admin sayfalarına giriş


yapabilmek için bir superuser oluşturulur ve buna bir şifre atanır. Daha sonra
Araştır 2 bu kullanıcı ile sisteme giriş yapılır.
Sisteme giriş yapıldığında ana sayfada bulunan “auth” kısmında User yanında-
ki “+ Add” butonu ile yeni kullanıcı kaydı yapılmaktadır.

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

You might also like