PYTHON İLE PROGRAMLAMA
H.N. ÇETİNKAYA - Güncelleme: 21.11.2022
Algoritma, belirli bir problemi çözmek veya belirli bir amaca ulaşmak için çözüm yolunun adım adım tasarlanmasıdır. Daha iyi anlamak için Josh Darnit'in (2017) çocuklarıyla yaptığı 'Kesin Talimatlar' videosunu izleyebilirsiniz. Algoritmalar doğal dil (satır kod), sözde kod veya akış şeması ile ifade edilebilirler. Örnekler aşağıda verilmiştir.
Algoritma Yazım Örnekleri
Akış Şeması Örneği (Torun, 2021)
Programlama Dili, bir algoritmayı ifade etmek amacıyla, bilgisayara ne yapmasını istediğini anlattığımız (kodladığımız) yoldur. Programlama dilleri ile yazdığımız kodlar makine koduna (binary (yani 0 ve 1)) çevrilir ve kodladığımız algoritma bilgisayar tarafından çalıştırılır.
1. Derlenen (Compiler) Diller: Yazımı(syntax) makine diline yakın olan dillerdir. Dilin yazım şekli makine diline yakın olduğu için yazılmış kodun bütünü hızlıca makine koduna (binary) çevrilir. C, C++, Fortran, R dilleri derlenen dillere örnektir.
2. Yorumlanan (Interpreter) Diller: Yazımı(syntax) makine diline yakın olmayan ama yazımı kolay olan böylelikle daha karmaşık ve zor programlamaları kolayca yapabilmemize imkan sağlayan dillerdir. Bu diller önce yorumlama dediğimiz işlemle kısım kısım (satır satır) kodları makine dilinde dener, hata bulursa derlemeyi durdurur, hata yoksa kodların tamamı makine koduna (binary) çevrilmiş olur. Python, Ruby, Java, C# bu dillere örnektir.
Windows Python kurulumu için; python'un resmi sitesi olan https://www.python.org/ adresine giriniz. Aşağıdaki site açılacaktır.
Ardından kırmızı kutu içinde gördüğünüz 'Downloads' menüsünün üzerine geliniz. Açılan menüdeki 'Download for Windows' yazısının altında bulunan python butonuna tıklayınız. Python inmeye başlayacaktır. Python indikten sonra çalıştırınız. Karşınıza gelen ilk pencerede 'Add to PATH' seçeneğinin seçili olmasına dikkat ediniz. Ardından 'İnstall Now' seçeneği ile python'u kurunuz. Kurulum bittikten sonraki pencerede 'Successfull' ifadesini görmüş olmamız gerekir. Bu pencerede 'Disable path length limit' seçeneğine tıklamanızı öneririm. 'Close' tuşu ile pencereyi kapatınız. Artık python kurdunuz.
Başlat tuşuna basınız ve 'IDLE' yazınız. 'IDLE (Python)' programını açınız. Bu kabuk python kodlarını çalıştırmaktadır. 'IDLE' kabuğunu açtıktan sonra üst menüdeki 'File' menüsünden 'New File' ile kendinize yeni boş bir dosya açabilirsiniz. Daha önceden varolan dosyalarınız için aynı menüdeki 'Open' menüsü ile varolan dosyanızı açılan dialog penceresinden bularak açabilirsiniz. 'New File' ile açtığınız boş dosyadaki kodları çalıştırmak için üst menüdeki 'Run' menüsünden 'Run Module' seçeneğini kullanınız. Unutmamanız gerekir ki yeni bir python dosyasının çalıştırılabilmesi için öncelikle diskinize kaydedilmesi gerekir. Python kodlamak için farklı ide'ler de kurabilirsiniz. Bunlar için araştırma yaparak kurabilirsiniz: Visual Studio Code, Atom, Sublime Text, Notepad++, PyCharm, Spyder bunlardan bazılarıdır.
Diğer işletim sistemlerine kurulum için; Ubuntu ve Mac OS X için sistem ayarlarında bulunan 'Yazılım & Güncelleme (Software & Update)' ile işletim sisteminizin size sağladığı repository içinde aratıp kurabilirsiniz.
Sisteminize Python kurulumu YAPAMIYORSANIZ kod yazmak için kullanılabilecek tamamen ücretsiz olan bulut (online) uygulamalar mevcut. Bunlar:
Python 1991 yılında Guido Van Rossum tarafından geliştirilen bir yüksek seviyeli programlama dilidir.
Python, diğer programlama dillerine göre daha kolay bir sözdizim (syntax: yazım kuralı) yapısına sahiptir. Bu sebeple python yıllar içinde popüler hale gelmiştir.
Programlama dillerinin kullanımına göre yaygınlık sıralamasını TIOBE (Programalama Topluluğu Dizini) sitesinden öğrenebilirsiniz.
Hemen hemen tüm programlama dilleri sözdizimi, komut, değişken, operatör, ifade, fonksiyon ve metot konseptinden oluşur.
Programlama dillerinin yazım kurallarına sözdizimi (syntax) denir. Dile ait tüm öğeler (komutlar, parantezler, tırnak işareti vb. tüm noktalama işaretleri, işleçler, ...) yazım kuralları içerisinde yazılmak zorundadır. Uygun yazılmaz ise programdan hata alınır. Programlama dillerine göre örnek syntax'lar aşağıda verilmiştir.
public class Main {
public static void main(String[] args) {
System.out.println("Merhaba Dünya");
}
}
using System;
namespace MerhabaDunya
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Merhaba Dünya");
}
}
}
print("Merhaba Dünya!")
`
Programlama dilinde anahtar sözcüklerle (if ..., for ..., while ..., def, is, ,in vb.) oluşturulan anlamlı öbeklere deyim (komut) denir. Genelde her satır kod bir anlamlı öbektir yani sözdizimsel deyimdir.
Programlama dilinde verileri bellekte tutmak için kullanılan hafıza birimleridir. Değişkenler sayı, metin, karakterler, listeler vb. gibi değerleri içerebilir. İçerdiği veri tipi nedeniyle değişken tipleri de mevcuttur.
Değerler veya değişkenler üzerinde işlem yapıp sonuçlandıran öğelere operatörler(işleçler) denir. Örneğin; toplama, çıkarma vb. sayısal işlemler ve "aynı mı?", "aynı değil mi?" gibi işlemler.
Ana programa belirli bir değer(ler) dönderen veya görevleri gerçekleştiren deyimler (komutlar) bütününe fonksiyon denir. Örneğin print()
bir fonksiyondur, print(3+5) yazarsak bize 8 değerini döndürür ve ekrana yazar.
Programlama diline ait öğeler (değişken, deyim vb.) ile bağımlı olan alt fonksiyonlara metot denir.
Değeri hesaplanabilen (değerlendirilebilen) sözdizimsel deyimlere (komutlara) ifade denir. 3+5 gibi basit bir deyim de ifade olabilirken birden çok fonksiyon ve deyim içeren ifadeler de olabilir.
print()
fonksiyonu ekrana yazdırma(bastırma) işlevidir. Parantez arasına yazılanlar ekrana basılır.
print ("Merhaba Dünya")
# Etkinlik Çözümü
print ("Merhaba Dünya!")
Eğer print()
ile yazacağınız metinde zaten çift tırnak (") kullanmanız gerekiyorsa tek tırnak işaretiyle de print komutunu kullanabilirsiniz.
print ('Bastığın yerleri "toprak!" diyerek geçme, tanı!')
Çok satırlı bir çıktınız varsa üç tırnak işareti ile yapabilirsiniz.
print("""
Dalgalan sen de şafaklar gibi ey şanlı hilâl;
Olsun artık dökülen kanlarımın hepsi helâl.
Ebediyen sana yok, ırkıma yok izmihlâl:
Hakkıdır, hür yaşamış bayrağımın hürriyet;
Hakkıdır, Hakk’a tapan milletimin istiklâl!
""")
Sayıları tırnaksız yazabilir,aynı satır içinde virgülle ayrılmış şekilde çift tırnaklar kullanabilirsiniz.
print("Türkiye Cumhuriyeti",23,"Nisan","1923","yılında kurulmuştur.")
Virgülle ayrılmış yazımlarda sep
deyimi ile aralara ayıraç (seperator) tanımlayabilirsiniz.
print("www","meb","gov","tr",sep=".")
# Etkinlik Çözümü
print("T","B","M","M","",sep=".")
#veya
print(*"TBMM ",sep=".")
Alt alta yazmak için üç tane çift tırnak kullanmak istemezseniz kaçış dizilerinden "\n" ile alt satıra geçme kaçış dizisini kullanabilirsiniz.
print("Korkma, sönmez bu şafaklarda yüzen al sancak;","Sönmeden yurdumun üstünde tüten en son ocak",sep="\n")
print("Birinci Satır","İkinci Satır","Üçüncü Satır",sep="\n")
# Etkinlik Çözümü
print("Baba","Anne","Abi","Abla","Kız Kardeş","Erkek Kardeş",sep="\n")
(Bir metin yazarken `\` kullanacaksanız kaçış dizisine çarpmamaya dikkat ediniz.)
KAÇIŞ DİZİSİ | İŞLEVİ | ÖRNEK | ÇIKTI |
---|---|---|---|
\n | Satırbaşı | print('O benimdir O benim\nMilletimindir ancak') |
O benimdir O benim Milletimindir ancak |
\t | Sekme (Yatay) |
print('Adınız\t:') |
Adınız : |
\\ |
Ters Eğik Çizgi | print("C:\\Windows\\System32\\") |
C:\Windows\System32\ |
\b | İmleci Bir Sola Alma (Geriye doğru silme) |
print('Python\br:') |
Pythor: |
\r | Aynı Satırda Satırbaşı (Geriye doğru satırbaşına gelme) |
print('Python\rB') |
Bython |
r | Kaçış Dizilerini İptal Etme | print(r'Python\nMerhaba:') |
Python\nMerhaba: |
Bunlar dışında \
ile birlikte 'u', 'U', 'n', 'N', 'x', 'a' ve 'f' kaçış dizileri de vardır. Bunlara çarpmamak için 'r' yöntemini kullanınız.
Print ile yazılan satırın sadece sonunda gerçekleşmesini istediklerimizi şöyle tanımlayabiliriz.
print("Ben ezelden","beridir hür yaşadım,","hür yaşarım.",end='\t')
print ("Hangi çılgın","bana zincir vuracakmış?","Şaşarım!",end='')
print ("Kükremiş sel gibiyim; bendimi çiğner, aşarım;")
Tırnak içinde yazılan metnin her karakteriyle birbirinden ayrıymış gibi işlem yaptırmak için * işlecini kullanabiliriz.
print(*"TBMM",sep=".")
print(*"TÜRKİYE",sep="\n")
Dinamik metinler için kıvırcıklı parantezler ile format metodunu kullanabiliriz.
print("{} programlama dili {} türden bir dilidir ve {} yılında kullanıma sunulmuştur.".format("Python","yorumlanan",1994))
Dinamik metinler için format metodundan daha kullanışlı olan 'f string' yöntemi değişkenler konusu ile anlatılacaktır.
Python programlama dilindeki öğelerin sahip olduğu tüm metotları görmek için dir()
fonksiyonunu çalıştırabilirsiniz.
print(*dir(print),sep="\n")
# Etkinlik Çözümü
print("* "*5,"* "*5,"* "*5,"* "*5,"* "*5,sep="\n") #5X5 Kare için
print("-------")
print("* "*8,"* "*8,"* "*8,"* "*8,"* "*8,sep="\n") #5X8 Dörtgen için
# Etkinlik Çözümü
print("* "*1,"* "*2,"* "*3,"* "*4,"* "*5,sep="\n") #her satırda * işareti artan olarak gider
Turtle öğretim amaçlı 2 Boyutlu çizim kütüphanesidir. Geometrik çizimler yapmamızı sağlayan fonksiyonları barındırır. import turtle
olarak Python'a çekilir. Varsayılan olarak turtle 0° (sağa dönük) ve kalem basılı olarak başlar. Not: Jupyter Notbeook ile kullanılınca son satıra turtle.done()
yazılmalıdır yoksa her çalıştırmada hata alınır.
turtle.forward()
fonskiyonu kullanılır. Örnek: turtle.forward(100)
(sağa doğru 100 pixel çizgi çizdi)turtle.backward()
fonskiyonu kullanılır. Örnek: turtle.backward(100)
(sola doğru 100 pixel çizgi çizdi)turtle.left()
fonskiyonu kullanılır.turtle.right()
fonskiyonu kullanılır.turtle.pensize()
fonskiyonu kullanılır.turtle.color()
fonskiyonu kullanılır. Örnek renker, "red", "blue" vb.turtle.begin_fill()
fonskiyonu kullanılır. Parametresiz kullanılır. Kalem renginde doldurur.turtle.end_fill()
fonskiyonu kullanılır.turtle.circle()
fonskiyonu kullanılır.turtle.speed()
fonskiyonu kullanılır.turtle.penup()
fonskiyonu kullanılır.turtle.pendown()
fonskiyonu kullanılır.turtle.goto(x,y)
fonskiyonu kullanılır. (setx, sety ve xcor, ycor fonksiyonları da var.)turtle.clear()
fonskiyonu kullanılır.turtle.screensize(canvwidth=genişlik, canvheight=yükseklik, bg="renk")
fonskiyonu kullanılır. Örnek: turtle.screensize(canvwidth=400, canvheight=300, bg="blue")#Etkinlik Çözümü
import turtle
turtle.forward(75)
turtle.right(90)
turtle.forward(75)
turtle.right(90)
turtle.forward(75)
turtle.right(90)
turtle.forward(75)
turtle.done()
#Etkinlik Çözümü
import turtle
turtle.color("red")
turtle.begin_fill()
turtle.circle(75)
turtle.end_fill()
turtle.done()
Değişken (variable), bir programda verilerin veya bilgilerin saklandığı hafıza birimleridir.
Değişkene isim verirken, programlama diline ait öğeler kullanılamaz. Örneğin "print" adında bir değişkeniniz olamaz.
Yasaklı diğer öğeleri de listelemek için pythonda şu kodu yazabiliriz.
import keyword
print(keyword.kwlist)
Ayrıca değişken isimleri rakamla başlayamaz, Türkçe karakterler (ÜĞİŞÇÖ, üğışçö) genelde kullanılamaz, tüm özel karakterler (alt çizgi _ hariç) de kullanılamaz. Python Türkçe karakterleri kullanmaya izin verir, bu konuda nadir dillerden biridir. Bir diğer özelliği de büyük-küçük harf duyarlı olmasıdır. Yani 'ad' değişkeni ile 'AD' değişkeni birbirinden farklı değişkenler olarak kullanılabilir.
Değişkene değer atama "=" operatörü (işleci) ile yapılır sağdaki veriyi soldaki değişkene atar (tanımlar).
#Doğru değişken isimlendirmeleri
degisken1 = "Hakkıdır"
degisken_1 = "Hür Yaşamış"
DEGISKEN = "Bayrağımın"
_degisken = "Hürriyet!"
print(degisken1,degisken_1,DEGISKEN,_degisken)
#Yanlış değişken isimlendirmeleri
1degisken = "Yanlış"
degisken-1 = "Değişken"
D E.GI/S*KEN = "İsimlendirmesi"
# Etkinlik Çözümü
tcNo = 12345678900
adSoyad = "Ahmet Yüksel ÖZEMRE"
e_posta = "ornek1@mail.k12.tr"
print (tcNo,adSoyad,e_posta,sep="\n")
Değişkenleri isimlendirirken sonrasında kolay hatırlayacağımız, basit, anlaşılır ve mantığa uygun isimler vermek önemlidir. Bu sebeple değişken isimlendirme standartları (teamülleri) vardır. Bunlar:
#1.Pascal Standartı: Değişkenin her kelimesini büyük harfle yazmak.
MeclisKurulusYili = "1920"
print(MeclisKurulusYili)
#2.Deve Standartı: Değişkenin ilk harfini küçük diğer kelimelerin ilk harfini büyük yazmak.
meclisKurulusYili = 1920
print(meclisKurulusYili)
#3.Yılan Standartı: Değişkenin her kelimesinin arasına alt tire (_) koymak.
meclis_kurulus_yili = '1920' #veya
iMeclis_Kurulus_Yili = 1920 #veya
MECLIS_KURULUS_YILI = "1920"
print(meclis_kurulus_yili,Meclis_Kurulus_Yili,MECLIS_KURULUS_YILI)
Karakter dizisi, metin, dize demektir. Çift tırnak (" ") veya tek tırnak (' ') arasında yazılan herşey string olur.
#Örnek string tipinde değişkenler
karakterDizisi1 = "M.Ö. 209 yılında Mete Han tarafından kurulan Türk Ordusu 'Kurtuluş Savaşı'ndan beri hep muzafferdir."
karakterDizisi2 = 'Kurtuluş Savaşı "1919-1923" yılları arasında gerçekleşmiştir.'
print(karakterDizisi1,karakterDizisi2)
Tipini bilmediğimiz değişken tipini öğrenmek-almak için kullanılan type()
fonksiyonunu kullanarak tipini görüntüleyelim.
dTipi1 = "TÜRKİYE"
dTipi2 = '1923'
print(type(dTipi1))
print(type(dTipi2))
Karakter dizisi (string) olmayan bir değişkeni stringe dönüştürmek için str()
fonksiyonu kullanılır.
degisken = 1923 #Tırnak arasına yazılmadığı için string değildir.
print(type(degisken),type(str(degisken)),sep="\n")
Karakter dizilerinin (string) uzunluğunu len()
fonksiyonu ile öğrenebiliriz.
misra = """
Arkadaş! Yurduma alçakları uğratma sakın;
Siper et gövdeni, dursun bu hayâsızca akın.
Doğacaktır sana va’dettiği günler Hakk’ın...
Kim bilir, belki yarın... belki yarından da yakın.
"""
print(len(misra))
# Etkinlik Çözümü
adSoyad = "Ahmet Yüksel ÖZEMRE"
uzunluk = len(adSoyad)
print (adSoyad,"ismi",uzunluk,"karakterdir.")
#veya format metodu ile
print ("{} ismi {} karakterdir.".format(adSoyad,uzunluk))
#veya f string yöntemi ile
print (f'{adSoyad} ismi {uzunluk} karakterdir.')
Çok sık kullanılan bir yöntem olan print(f' ')
yöntemi stringler ile kullanılabilir. Örnek:
isim="TÜRKİYE"
dogumYili=1923
dogumYeri="Ankara"
print(f'{isim} Cumhuriyeti {dogumYili} yılında {dogumYeri} şehrinde kurulmuştur.')
input()
fonksiyonu kullanıcıdan veri almamızı sağlar. Kullanıcının verisini girmesini bekler, veri girildikten sonra enter(giriş) tuşuna basınca girilen veriyi hafızaya alır. Input ile alınan veri bir değişkene atanırsa, girilen değer değişkene atanır.
Input fonksiyonu ile kullanıcıdan alınan her veri string veri türündedir.
girilenVeri = input("Lütfen Yaşınızı Giriniz: ")
print("{} yaşındasınız.".format(girilenVeri))
# Etkinlik Çözümü
isim = input("İsminizi Giriniz: ")
yas = input("Yaşınızı Giriniz: ")
meslek = input("Mesleğinizi Giriniz: ")
print ("{} isiminde ve {} yaşında bir {}.".format(isim,yas,meslek))
Karakter dizisini (stringi) tamamen büyük harf, küçük harf, sadece ilk harfi büyük, sadece kelimelerin ilk harfi büyük veya tersine(büyüğü küçük-küçüğü büyük) olacak şekilde değiştirebiliriz.
metin = "PytHON pRoGrAmLaMa dİLİ"
print(metin.upper())
print(metin.lower()) #eğer Türkçe karakterler küçülmüyorsa casefold() metodunu kullanabilirsiniz.
print(metin.capitalize())
print(metin.title())
print(metin.swapcase())
# Etkinlik Çözümü
sozcuk = "Mavi VATAN Akdeniz"
print(sozcuk.upper(),sozcuk.lower(),sozcuk.capitalize(),sozcuk.title(),sozcuk.swapcase(),sep="\n")
Karakter dizisindeki (string) harfleri replace()
metodu ile değiştirebiliriz.
vatan = "TÜRKİYE"
print(vatan.replace("ÜRKİYE", "ürkiye"))
print(vatan.replace("İYE", ""))
#Bir karakter birden çok ise kaç kez tekrarlayacağını da metotta parametre olarak girebiliriz.
palindrom = "KAZAK"
print(palindrom.replace("A","I",1))
# Etkinlik Çözümü
sozcuk = input("Adınızı Giriniz: ").upper()
sozcuk = sozcuk.replace("Ç","C")
sozcuk = sozcuk.replace("Ğ","G")
sozcuk = sozcuk.replace("İ","I")
sozcuk = sozcuk.replace("Ö","O")
sozcuk = sozcuk.replace("Ş","S")
sozcuk = sozcuk.replace("Ü","U")
print(sozcuk)
#veya sıralı şekilde
sozcuk = input("Adınızı Giriniz: ").upper()
print(sozcuk.replace("Ç","C").replace("Ğ","G").replace("İ","I").replace("Ö","O").replace("Ş","S").replace("Ü","U"))
String tipinde bir değişkeni del
deyimi (komutu) ile hafızadan silebiliriz. Esasında bu deyim (komutu) her tipte değişken için geçerlidir.
dil = "Python"
del dil
print(dil)
String tipinde bir değişkende bir karakter veya karakter dizisinden ne kadar var count()
metodu ile sayabiliriz.
ornekMetin = "Dal sarkar kartal kalkar, kartal kalkar dal sarkar, dal kalkar kantar tartar."
print(ornekMetin.count("a"))
print(ornekMetin.count("kartal"))
# Etkinlik Çözümü
ilkKita = """
Korkma, sönmez bu şafaklarda yüzen al sancak;
Sönmeden yurdumun üstünde tüten en son ocak.
O benim milletimin yıldızıdır, parlayacak;
O benimdir, o benim milletimindir ancak.
"""
print(ilkKita.count("a"))
String tipinde bir değişkenin içindeki karakterin sırasını find()
metodu ile bulabiliriz.
toprak = "AAAAABBBBBBCCCCCCCCCCCCCCDDDDDDDDDDDDDDD"
print(toprak.index("C")) #ilk geçtiği yeri bulmak için index kullanılır.
print(toprak.rindex("A")) #son geçtiği yeri bulmak için rindex kullanılır.
print(toprak.find("X")) #find metodu index'le aynı işe yarar fakat index metodu bulamazsa 'ValueError' hatası verir, find ise -1
print(toprak.rfind("X")) #find metodunun tersten arama yapanı.
# Etkinlik Çözümü
ilkKita = """
Korkma, sönmez bu şafaklarda yüzen al sancak;
Sönmeden yurdumun üstünde tüten en son ocak.
O benim milletimin yıldızıdır, parlayacak;
O benimdir, o benim milletimindir ancak.
"""
print(ilkKita.index("a")) #ilk yer
print(ilkKita.rindex("a")) #son yer
#veya
print(ilkKita.find("a")) #ilk yer
print(ilkKita.rfind("a")) #ilk yer
String tipinde bir değişkenin başındaki veya sonundaki boşlukları strip()
metodu ile silebiliriz.
ornekMetin = " TÜRKİYE BÜYÜK MİLLET MECLİSİ "
print(ornekMetin.strip())
String tipinde bir değişkeni split()
metodu ile istediğimiz yerden ayırarak bir listeye dönüştürebiliriz.
s1 = "Türkiye Büyük Millet Meclisi"
s2 = "Türkiye, 23 Ekim 1923, Ankara"
print(s1.split()) #split'in içini boş bırakırsan boşluklardan ayırır.
print(s2.split(", ")) #split'in içine tırnak içinde yazdığın ifadeyi baz alarak ayırır.
# Etkinlik Çözümü
misra = "İnsanın, gölgesiyle tanımlandığı bir çağda, marşlara düşer belki birkaç şey açıklamak"
misra = misra.split(", ")
print(*misra,sep="\n") #stringlerin başına gelen * sembolünün işlevini öncesinde görmüştük.
Karakter dizilerinin (string) karakterlerine [ : ]
ile erişebiliriz. Köşeli parantezler arasına karakterin sıra (index) numarasını yazarız. Bu işlemlere 'dilimleme' denir.
ornek = "Pythhon"
print(ornek[0]) #tek karakter için o karakterin sırasını girmeliyiz (dizilerde sıra 0(sıfır)dan başlar)
print(ornek[0:3]) #aralık için iki nokta ile başlama ve bitiş index'ini girmeliyiz
print(ornek[:2]) #başlangıç belirtmeseniz ilk sıradan başlar
print(ornek[3:]) #bitiş belirtmeseniz karakter dizisinin sonuna kadar alır
# Etkinlik Çözümü
ad = input("Adınızı Giriniz: ")
print(ad[:3],ad[3:],ad[::-1],sep="\n")
Karakter dizilerini (string) dilimlerken karakter ilerleme sırasını belirleyebiliriz.
ornek = "TÜRKİYE"
print(ornek[0:8:2]) #0. indexten başlayarak 7.indexe kadar 2'şer karakter ilerledik.
print(ornek[-1:-8:-1]) #Tersten sıraladık. -1. indexten başlayarak -7.indexe kadar tersten 1'er karakter ilerledik.
# Etkinlik Çözümü
vatandaslikNo = input("Vatandaşlık Numaranızı Giriniz: ")
print(vatandaslikNo[::-1])
Karakter dizileri ile ilgili diğer operatör ve metotlara sonradan değineceğiz.
Karakter dizilerinin diğer metotlarını şöyle görüntüleyebilirsiniz:
print(dir(str))
Tamsayı değişken tipidir. Matematiksel işlemler yapmada kullanılır. Pozitif veya negatif olabilir. Çift tırnak ("") veya tek tırnak ('') arasına yazılmaz. Örnek tamsayı tipinde değişkenler:
i1 = 99
i2 = -99
print(i1,i2,sep="\n")
Tipini bilmediğimiz değişkenler için tipini öğrenmek amacıyla type()
foknsiyonunu kullanarak tipini görüntüleyelim.
i = 1919
print(type(i))
Integer (int) olmayan bir değişkeni integer'a dönüştürmek için int()
fonksiyonu kullanılır. Fakat dönüştürülmek istenen veri tamamen rakamlardan (nümerik) oluşmalıdır, aksi halde hata verir.
metin = "1923"
print(int(metin))
print(type(int(metin)))
# Etkinlik Çözümü
yas = input("Yaşınızı Giriniz: ")
print(type(yas))
yas = int(yas)
print(type(yas))
Tam sayıların 2'lik sayı sistemindeki basamak uzunluklarını bulmak için bit_length()
metodu kullanılır.
i = 155
print(i.bit_length())
# Etkinlik Çözümü
yas = input("Yaşınızı Giriniz: ")
print(int(yas).bit_length())
Tam sayılar ile ilgili diğer operatör ve metotlara sonradan değineceğiz.
Tam sayıların diğer metotlarını şöyle görüntüleyebilirsiniz:
print(dir(int))
Ondalıklı sayı değişken tipidir. Ondalık ayıracı nokta (.) dır. Matematiksel işlemler yapmada kullanılır. Pozitif veya negatif olabilir.
Çift tırnak (" ") veya tek tırnak (' ') arasına yazılmaz. Örnek ondalıklı sayı tipinde değişkenler:
f1 = 15.75
f2 = -15.75
print (f1,f2,sep="\n")
Tipini bilmediğimiz değişkenler için tipini öğrenmek amacıyla type()
foknsiyonunu kullanarak tipini görüntüleyelim.
f = 1923.0
print(type(f))
# Etkinlik Çözümü
yas = 11+8/12
print(yas,type(yas),sep="\n")
Float (float) olmayan bir değişkeni float'a dönüştürmek için float()
foknsiyonu kullanılır. Fakat dönüştürülmek istenen veri tamamen rakamlardan (nümerik) oluşmalıdır, aksi halde hata verir.
i = 1923
print(float(i))
print(type(float(i)))
Birbirine bölününce ondalıklı sayıyı veren tam sayıları bulmak için as_integer_ratio()
metodu kullanılır.
f1 = 7.5
print(f1.as_integer_ratio())
# Etkinlik Çözümü
yas = 15.6 #burayı float sayılarla değiştirerek sonucu gözlemleyebilirsiniz
print(yas.as_integer_ratio())
Ondalıklı sayılar ile ilgili diğer operatör ve metotlara sonradan değineceğiz.
Ondalıklı sayıların diğer metotlarını şöyle görüntüleyebilirsiniz:
print(dir(float))
Mantıksal veri tipidir. Sadece 'True' (doğru) ve 'False' (yanlış) değerini alır. Esasında bir sorgulama sonucudur. Mantıksal bütün sorguların sonucu True veya False olur. Örnek boolean tipi sorgulamalar:
b1 = True
b2 = False
print(b1,b2,sep="\n")
Bir değişkeni boolean veri tipine çevirmek için bool()
fonksiyonu kullanılır.
ornek1 = "Türkiye"
ornek2 = ""
ornek3 = 0
ornek4 = 1923
ornek1=bool(ornek1)
ornek2=bool(ornek2)
ornek3=bool(ornek3)
ornek4=bool(ornek4)
print(ornek1,ornek2,ornek3,ornek4,sep="\n")
# Etkinlik Çözümü
bir = 1
sifir = 0
print(bool(sifir),bool(bir),sep="\n")
Tipini bilmediğimiz değişkenler için tipini öğrenmek amacıyla type()
foknsiyonunu kullanarak tipini görüntüleyelim.
b1 = True
b2 = False
print(type(b1),type(b2),sep="\n")
Liste demektir, elemanlardan oluşan çok değişkenli veri tipidir. Listeler köşeli parantez [ ] ile başlar ve biter. İlk elemanın sırası (index) 0'dır. Listedeki elemanların arasında virgül (,) konur. Listede str, int, float, bool veya list elemanları aynı anda olabilir.
Özellikleri:
liste = ["Python",1994,3.10,True,["En Popüler","Programlama Dili",1]]
print(liste)
print(liste[2])
print(liste[1:4])
print(type(liste))
Sadece string veri tipi bir listeye dönüştürülebilir. Bunun için list()
foknsiyonu kullanılır. Diğer veri tiplerini listeye çevirmek için önce str()
ile stringe çeviriniz.
s = "Türkiye 2023"
print(list(s),type(list(s)),sep="\n")
Bir sayı listesi oluşturmak için range()
(aralık) foknsiyonu ile sayı listesi oluşturulabilir. Bunun için list()
ve range()
fonksiyonu kullanılır. range()
fonksiyonu liste tipinden bağımsız başka işlemlerle de kullanılmaktadır.
l = list(range(1,16))
print(l)
# Etkinlik Çözümü:
liste = [-5,-4,-3,-2,-1,0,1,2,3,4,5]
print(liste)
Listelerin (list) eleman sayısını len()
foknsiyonu ile öğrenebiliriz.
l = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"]
print(len(l))
Listelere append()
metodu ile listenin sonuna eklenmek üzere yeni eleman eklenebilir.
l = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"]
l.append("Pazar")
print(l)
Listedeki bir elemanın sırası index()
metodu ile bulunabilir.
l = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"]
print(l.index("Perşembe"))
# Etkinlik Çözümü
isim = "TÜRKİYE"
isim = list(isim)
isim.append (100)
print(isim)
print(isim.index(100))
Listelere insert()
metodu ile listenin istenilen sırasına(index) eklenmek üzere yeni eleman eklenebilir. Insert metodu insert(sıra,değer)
olarak çalışmaktadır.
l = ["Pazartesi","Çarşamba","Perşembe","Cuma","Cumartesi"]
l.insert(1,"Salı")
l.insert(6,"Pazar")
print(l)
Listeden bir elemana değeriyle erişilerek silinebilir. Bunun için remove()
metodu kullanılır. Remove metodunu kullanırken silmek istediğiniz değerin listedeki sırasını bilmenize gerek yoktur. Eğer aynı değerden birkaç tane varsa sırası (index) en küçük olanı (ilk sırada olanı) siler.
l = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar","Ocak","Şubat","Ocak"]
l.remove("Ocak")
print(l)
Listeden bir elemanı sırasına(index) erişilerek silinebilir. Bunun için iki yöntem vardır; pop()
ve del()
metotları kullanılır.
Pop metodu ile belirttiğiniz sıradaki(index) eleman silinir. İndex numarası belirtilmezse listenin sonundaki elemanı siler.
Del metodu ile belirttiğiniz sıradaki(index) eleman silinir. İndex numarası belirtilmezse ilgili liste değişkenini tamamen ortadan kaldırır.
l = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar","Ocak","Ocak"]
l.pop(7)
del l[0]
print(l)
# Etkinlik Çözümü
sayilar = [1,2,3,4,5,6,7,8,9,10]
sayilar.pop(6)
print(sayilar)
sayilar.insert(6,7)
print(sayilar)
Listedeki tüm elemanları clear()
metodu ile silebiliriz. Bu metodla listenin içi boşalır ve ilgili liste değişkeni kullanılmaya devam edilir. Yani liste değişkeni ortadan kalkmaz.
l = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"]
l.clear()
print(l)
Liste elemanları başka bir değişkene copy()
metodu ile liste olarak kopyalanabilir.
l1 = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"]
l2 =l1.copy()
print(l2)
Liste elemanları sort()
metodu ile A'dan Z'ye veya küçükten büyüğe doğru sıralanabilir.
l = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"]
l.sort()
print(l)
l = [3,4,5,1,2,6,7]
l.sort()
print(l)
Liste elemanları sort()
metodu ile Z'den A'ya veya büyükten küçüğe doğru da sıralanabilir.
l = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"]
l.sort(reverse=True)
print(l)
l = [3,4,5,1,2,6,7]
l.sort(reverse=True)
print(l)
Liste elemanları reverse()
metodu ile tersine çevrilebilir.
l = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"]
l.reverse()
print(l)
# Etkinlik Çözümü
isim = "TÜRKİYE"
isim = list(isim)
isim.sort()
print(isim)
isim.sort(reverse=True)
print(isim)
Listedeki elemanlardan kaçar tane olduğu count()
metodu ile bulunabilir.
l = [1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,4,5,6,7]
print(l.count(1))
print(l.count(5))
Listedeki elemanlardan sayısal olarak en büyük veya alfabetik olarak en sonda olan max()
foknsiyonu ile, sayısal olarak en küçük veya alfabetik olarak en önde olan min()
foknsiyonu ile bulunabilir.
l = ["A","B","C","D","E","F","G","Z"]
print(max(l))
print(min(l))
l = [101,345,543,786,908,123,434]
print(max(l))
print(min(l))
Demet demektir. Liste değişken tipi gibi elemanlardan oluşan çok değişkenli veri tipidir. Demetler normal parantez ( ) ile başlar ve biter. İlk elemanın sırası (index) 0'dır. Demetteki elemanların arasında virgül (,) konur. Demette str, int, float, bool veya list elemanları aynı anda olabilir.
Özellikleri:
yazAylari = ("Haziran","Temmuz","Ağustos")
print(yazAylari)
print(yazAylari[1])
print(yazAylari[0:2])
print(type(yazAylari))
Sadece string veya liste veri tipi bir demete dönüştürülebilir. Bunun için tuple()
foknsiyonu kullanılır.
d = "Tükiye 2023"
print(tuple(d),type(tuple(d)),sep="\n")
Demetlerin eleman sayısı len()
foknsiyonu ile bulunabilir.
d = ("Aralık","Ocak","Şubat")
print(len(d))
Demetlerde index()
metodu ile elemanın sırası bulunabilir.
d = ("Aralık","Ocak","Şubat")
print(d.index("Ocak"))
Demetlerde count()
metodu ile hangi elemandan kaç tane olduğu bulunabilir.
d = (1,1,1,1,2,2,2,3,3,3,3,3,3,3,4,4,4,5)
print(d.count(3))
#Etkinlik Çözümü
tc = input("Vatandaşlık Numaranızı Giriniz: ")
ad = input("Tam Adınızı Giriniz: ")
dogum = input("Doğum Tarihinizi Giriniz: ")
veriler = (tc,ad,dogum)
print(veriler)
Küme demektir. Liste değişken tipi gibi elemanlardan oluşan çok değişkenli veri tipidir. Kümeler kıvırcıklı parantez { } ile başlar ve biter. Küme elemanlarında sıra (index) yoktur. Kümedeki elemanların arasında virgül (,) konur. Kümede str, int, float veya bool elemanları aynı anda olabilir.
Özellikleri:
k = {1,2,3,"Türkiye"}
print(k,len(k),type(k),sep="\n")
Sadece string, list veya tuple veri tipi bir kümeye dönüştürülebilir. Bunun için set()
foknsiyonu kullanılır.
s = "Python"
l =[1,2,3]
t=("a","b","c")
print(set(s))
print(set(l))
print(set(d))
Bir sayı kümesi tanımlamak için range()
(aralık) foknsiyonu ile küme tanımlanabilir. Bunun için set()
ve range()
foknsiyonları kullanılır.
k = set(range(1,10)) #1'den 10'a kadar olan sayılardan bir küme oluşturduk.
print(k)
Kümelere add()
metodu ile eleman eklenebilir.
k = {"T","Ü","R","K","İ","Y","E"}
k.add(1923)
print(k)
Kümelerden remove()
metodu ile eleman silinebilir. Silmek istediğiniz eleman yok ise hata verir.
k = {"T","Ü","R","K","İ","Y","E",1923}
k.remove(1923)
print(k)
Kümelerden discard()
metodu ile de eleman silinebilir. Silmek istediğiniz eleman yok ise hata vermez.
k = {"T","Ü","R","K","İ","Y","E",1923}
k.discard("İ")
k.discard("Y")
k.discard("E")
k.discard(2023)
print(k)
Kümeler clear()
metodu ile temizlenebilir.
k = {"T","Ü","R","K","İ","Y","E",1923}
k.clear()
print(k)
Kümeler update()
metodu ile birleştirilebilir veya union()
ile birleşik yeni bir küme oluşturulabilir.
k1 = {"T","Ü","R","K"}
k2 = {"İ","Y","E"}
k3 = k1.union(k2)
print(k1,k3,sep="\n")
k1.update(k2)
print(k1)
Kümelerin intersection()
metodu ile kesişimleri, difference()
metodu ile farkları bulunabilir.
k1 = {"P","Y","T","H","O","N"}
k2 = {"F","A","Y","T","O","N"}
print(k1.intersection(k2))
print(k1.difference(k2))
#Etkinlik Çözümü
kelime = "TÜRKİYE CUMHURİYETİ"
kelime = set(kelime)
tahminler = []
tahminler.append(input("1. Harfi Giriniz: ").upper())
tahminler.append(input("2. Harfi Giriniz: ").upper())
tahminler.append(input("3. Harfi Giriniz: ").upper())
tahminler.append(input("4. Harfi Giriniz: ").upper())
tahminler.append(input("5. Harfi Giriniz: ").upper())
tahminler = set(tahminler)
print(kelime.intersection(tahminler))
Kısıtlanmış küme demektir. Liste değişken tipi gibi elemanlardan oluşan çok değişkenli veri tipidir. Kısıtlanmış kümeler bir listenin başına frozenset()
foknsiyonu girilmesi ile oluşur. Küme elemanlarında sıra (index) yoktur. Kümedeki elemanların arasında virgül (,) konur. Kümede str, int, float veya bool elemanları aynı anda olabilir.
Özellikleri:
fs = frozenset(["pazartesi","salı","çarşamba","perşembe","cuma","cumartesi",1,2,3,4,5,6])
print (fs)
#Etkinlik Çözümü
lisanslar = set(["ABC-123-XYZ","DEF-456-WYZ","GHI-789-ZWX"])
print(lisanslar)
Sözlük demektir. Küme değişken tipi gibi fakat 2 boyutlu elemanlardan oluşan çok değişkenli veri tipidir. Sözlükler kıvırcıklı parantez ile başlar ve biter. Sözlüklerde her eleman 2 öğeden oluşur. İlki 'key' (anahtar), ikincisi 'value' (değer)'dir. Öğelerin arasına : konur. Eleman sıraları değiştirilemez, ekleme çıkarma yapılabilir. Sözlüklerde öğelerin arasında virgül (,) konur. Sözlükte str, int, float veya bool elemanları aynı anda olabilir.
Örnek kısıtlanmış küme veri tipi değişkeni:
sozluk = {"Python":"Bir programlama dilidir.",
"Yazar":"Guido Van Rossum",
1994:"Python'ın yayınlandığı yıl.",
2018:"Van Rossum'un Python yönetiminiden istifa ettiği yıldır."}
print (sozluk["Yazar"])
Sözlüğe sozluk[anahtar]=Değer
ile yeni eleman (anahtar:değer) (key:value) ikili olarak eklenir. Bu yöntemle eklenen değerler son eleman olarak eklenir.
sayilarinKaresi = {1:1,2:4,3:9,4:16}
print(sayilarinKaresi)
sayilarinKaresi[9]=81 #9 key'i ile 81 value'sini ekledik.
print(sayilarinKaresi)
Sözlükten del
deyimi ile eleman silinebilir.
sayilarinKaresi = {1:1,2:4,3:9,4:16}
del sayilarinKaresi[3]
print(sayilarinKaresi)
Sözlükten eleman silmek için pop()
metodu kullanılır. Bu metot kullanılırken parantez içine silincek anahtar(key) yazılır.
sayilarinKaresi = {1:1,2:4,3:9,4:16}
print(sayilarinKaresi)
sayilarinKaresi.pop(3) #3 key'ine sahip eleman ikilisini sildik
print(sayilarinKaresi)
update()
fonksşyonu ile bir sözlüğü başka bir sözlüğün verileriyle güncelleyebilir(ekleyebilir) bu işlemi string değerlerle de yapabilirsiniz.
sayilarinKaresi = {1:1,2:4,3:9,4:16}
eklenecekler = {5:25,6:36,7:49}
sayilarinKaresi.update(eklenecekler)
print(sayilarinKaresi)
#update'i string değerlerle kullanabilirsiniz.
sayilarinKaresi.update(Sekiz='AltmışDört', Dokuz='SeksenBir')
print(sayilarinKaresi)
Sözlükteki bir anahtarın değeri get()
fonksiyonu ile alınabilir.
sayilarinKaresi = {1:1,2:4,3:9,4:16}
print(sayilarinKaresi.get(4))
#bu içiçe (nested) bir şekilde de kullanılabilir
matPuanlari = {"Ada":{"1.Yazılı":80,"2.Yazılı":90},"Asya":{"1.Yazılı":70,"2.Yazılı":85},"Mete":{"1.Yazılı":95,"2.Yazılı":100}}
print(matPuanlari.get("Asya").get("2.Yazılı"))
#Etkinliğin Çözümü
baskentler = {
"Türkiye":"Ankara",
"Azerbaycan":"Bakü",
"Türkmenistan":"Aşkabat",
"Kazakistan":"Astana", #yanlış varsa update ile düzeltiniz.
"Özbekistan":"Taşkent",
"Kırgızistan":"Bişkek",
"Tataristan":"Kazan"
}
print(baskentler.get("Tataristan"))
Bir liste türündeki (liste, demet, küme) değişken dizisi fromkeys()
sözlük anahtarı olarak dönüştürülebilir. Hatta iki farklı liste türündeki değişken dizisi sözlük anahtarı ve değeri olarak birleştirilebilir.
harfler = ["A","B","C","Ç"]
kod = ("UTF-8")
harflerinKodu = dict.fromkeys(harfler,kod)
print(harflerinKodu)
harfler = ["A","B","C","Ç"]
harflerinKodu = dict.fromkeys(harfler) #ikinci parametre boş bırakılırsa value değeri boş olarak oluşur
print(harflerinKodu)
harfler = ["A","B","C","Ç"]
harflerinKodu = dict.fromkeys(harfler,"TÜRKÇE") #ikinci parametre sabit olarak girilirse value değeri girilmiş olur.
print(harflerinKodu)
#Etkinliğin Çözümü
gunce = {
10.10.2022:"Merhaba günlük bugün günlerde 3 Ekim ve Bilişim dersinde Python isimli bir dil olduğunu öğrendik.",
17.10.2022:"Merhaba günlük bugün her programlamada dilinde varolan temel kavramların olduğunu öğrendik.",
24.10.2022:"Merhaba günlük bugün değişkenlerin (verilerin) çeşitli tiplerde olabileceğini öğretti bize öğretmenimiz.",
31.10.2022:"Merhaba günlük bugün değişkenlerle çeşitli işlemler yapmayı öğredik. Mesela değer atama, toplama, birleştirme vb.",
07.11.2022:"Merhaba günlük bugün 'eğer öyleyse-değilse' karar yapısını öğrendik.",
14.11.2022:"Merhaba günlük bugün sürekli tekrlanan işleri döngüler ile yapmayı öğrendik.",
}
print(gunce.get(31.10.2022))
Operatör (İşleç) : Bilgisayarda işlemleri yürütüp gerçekleştiren (sonuçlandıran) öğelerdir. Python programlama dilinde:
Programlama dillerinde değişkenlerinin değerlerinin belirlenmesi için kullanılan operatörlerdir.
OPERATÖR | İŞLEVİ | AÇIKLAMA | ÖRNEK | ÇIKTI |
---|---|---|---|---|
= | Eşitle | Değişkene yazılan değeri eşitler. Sağdaki değeri soldaki değişkene atar. | i=2 | 2 |
+= | Toplayarak Eşitle | Değişkenin varolan değerine eşittirin sağındaki değeri ekleyerek eşitler. | i+=10 | 12 |
-= | Çıkararak Eşitle | Değişkenin varolan değerinden eşittirin sağındaki değeri çıkararak eşitler. | i-=5 | 7 |
*= | Çarparak Eşitle | Değişkenin varolan değerini eşittirin sağındaki değerle çarparak eşitler. | i*=8 | 56 |
/= | Bölerek Eşitle | Değişkenin varolan değerini eşittirin sağındaki değere bölerek eşitler. | i/=4 | 14 |
%= | Kalana (Mod'a) Eşitle | Değişkenin varolan değerini eşittirin sağındaki değere bölerek kalana eşitler. | i%=8 | 6 |
//= | Bölüm'e Eşitle | Değişkenin varolan değerini eşittirin sağındaki değere bölerek bölüme eşitler. | i//=3 | 2 |
Atama operatörleri için örnekler:
i=16
print(i)
i+=4
print(i)
i-=5
print(i)
i*=2
print(i)
i/=3
print(i)
i%=6
print(i)
i//=3
print(i)
#Etkinliğin Çözümü
enBuyuk3 = 999
enBuyuk2 = 99
enBuyuk1 = 9
yas = int(input("Yaşınızı giriniz: "))
print(((enBuyuk3-enBuyuk2)/enBuyuk1*4)%yas+5)
Programlama dillerinde aritmetik (matematiksel) işlemlerinin yapılabilmesi için kullanılan operatörlerdir.
OPERATÖR | İŞLEVİ | AÇIKLAMA | ÖRNEK | ÇIKTI |
---|---|---|---|---|
+ | Toplama | Sayısal değişkenleri (integer, float vd.) matematiksel olarak toplar, sayısal olmayanları (string, list vd.) birleşitirir. | 3+5 "3"+"5" |
8 '35' |
- | Çıkarma | Sayısal değişkenleri (integer, float vd.) matematiksel olarak çıkarır, sayısal olmayanlarda (string, list vd.) hata verir. | 2023-1923 | 100 |
* | Çarpma | Sayısal değişkenleri (integer, float vd.) matematiksel olarak çarpar, sayısal olmayanlarda (string, list vd.) değişkeni kere yazdırır. | $$10*5$$ $$"C"*3$$ |
50 'CCC' |
/ | Bölme | Sayısal değişkenleri (integer, float vd.) matematiksel olarak böler, bölme işleminin sonucu her zaman 'float' tipidir. | 8/4 | 2.0 |
// | Bölüm | Sayısal değişkenleri (integer, float vd.) matematiksel olarak böler ve bölüm kısmını verir. İşleminin sonucu her zaman işleme sokulan veri tipidir. | 13//5 13.5//5 |
2 2.0 |
% | Kalan | Diğer adı mod almadır. Sayısal değişkenleri (integer, float vd.) matematiksel olarak böler ve kalan kısmını verir. İşleminin sonucu her zaman işleme sokulan veri tipidir. | 13%5 | 3 |
** | Üssü | Sayısal değişkenleri (integer, float vd.) matematiksel olarak kuvvetini verir. İşleminin sonucu her zaman işleme sokulan veri tipidir. | 5**3 | 125 |
Aritmetiksel operatörler için örnekler:
toplam = 16+5
birlestirme = "16"+"5" #string olan verileri '+' işleci ile kullanırsak stringleri yanyana birleştirir.
fark = 16-5
carpim = 16*5
cogaltma = "16"*5 #string olan verileri integerler ile çarparsak string'i integer kadar yazmış oluruz.
bolme = 16/5
bolum = 16//5
kalan = 16%5
karesi = 16**2
print ("Toplam:{}\nBirleştirme:{}\nFark:{}\nÇarpım: {}\nBölme: {}\nBölüm: {}\nKalan: {}\nKaresi; {}\nÇoğaltılmış String: {}"
.format(toplam,birlestirme,fark,carpim,bolme,bolum,kalan,karesi,cogaltma))
sum()
fonskiyonu ile alınır. Örnek: sum(1,3,5,7,12)max()
fonskiyonu kullanılır.min()
fonskiyonu kullanılır.abs()
fonskiyonu ile alınır.divmod()
fonskiyonu kullanılır. Örnek: divmod(10,3) yazarsak (3,1) olarak sonuç çıkar.round()
fonskiyonu kullanılır. Ondalık kısmı 5 ve 5'ten yukarı ise yukarı değilse aşağı yuvarlar.pow()
fonskiyonu kullanılır. Örnek: pow(5,2)range()
fonskiyonu kullanılır. Örnek: range(-10,10)bin()
fonskiyonu kullanılır.oct()
fonskiyonu kullanılır.hex()
fonskiyonu kullanılır.#Roket Etkinliğinin Çözümü
rokethizi = 532000
ekvator = 6378
pi = 3.14
cevre = 2*pi*ekvator
esure = 60*cevre/rokethizi #dakikaya çevirmek için ile çarptım.
print ("Dünyanın ekvator hizasındaki çevresini",esure,"dakikada tamamlar.")
#Roket Etkinliğinin Şık Çözümü
h,r,p = 532000,6378,3.14
print ("Dünyanın ekvator hizasındaki çevresini",round(60*2*p*r/h,2),"dakikada tamamlar.")
#Etkinliğin Çözümü
baba = int(input("Babanızın yaşını giriniz: "))
anne = int(input("Annenizin yaşını giriniz: "))
kendim = int(input("Kendi yaşınızı giriniz: "))
mevcut = int(input("Evde toplam kaç kişi yaşıyor: "))
print(((baba-anne+kendim)*mevcut)%kendim**2)
Gömülü olarak kullanamadığımız matematiksel fonksiyonları barındırır. import math
veya from math import *
olarak aktarılabilir.
math.ceil()
fonskiyonu kullanılır.math.floor()
fonskiyonu kullanılır.math.copysign()
fonskiyonu kullanılır. Örneğin math.copysign(5,-12) yazarsak sonuç -5 olur.math.fabs()
fonskiyonu ile alınır.math.factorial()
fonskiyonu kullanılır.math.fmod()
fonskiyonu kullanılır. Özellikle negatif sayılarda doğru sonuç verir.math.fsum()
fonskiyonu kullanılır.math.gcd()
fonskiyonu kullanılır. Örnek: math.gcd(sayi1,sayi2,sayi3)math.pi()
fonskiyonu kullanılır.math.sqrt()
fonskiyonu kullanılır.Rassalık (rasgele) işlemlerini yapmamızı sağlayan fonksiyonları barındırır. import random
veya from random import *
olarak aktarılabilir.
random.random()
fonskiyonu kullanılır.random.uniform()
fonskiyonu kullanılır. Örnek: random.uniform(1,20)random.randint()
fonskiyonu kullanılır. Örneğin random.randint(1,100) ile 1 ile 100 sayıları arasında rasgele bir sayı üretilir.random.randrange()
fonskiyonu kullanılır. randint()'ten farkı, aralıkta belirli bir artış vererek rassal sayı ihtimalini biçimlendiririz. Örneğin random.randrange(0,100,5) ile 0 ile 100 sayıları arasında 0'dan başlayarak 5'er 5'er artan sayılardan rasgele bir sayı üretilir.random.shuffle()
fonskiyonu kullanılır. Örnek random.shuffle(liste_adi)random.choice()
fonskiyonu kullanılır. Örnek random.choice(liste_adi)random.sample()
fonskiyonu kullanılır. Örnek random.choice(liste_adi,secilecek_eleman_sayisi)Matematikteki temel istatistiksel işlemleri (aritmetik ortalama, mod medyan vb.) içeren fonksiyonları barındırır. import statistics
veya from statistics import *
olarak aktarılabilir.
statistics.mean()
fonskiyonu kullanılır.statistics.fmean()
fonskiyonu kullanılır. Örnek: statistics.fmean(sayilar,agirlıiklar)statistics.geometric_mean()
fonskiyonu kullanılır.statistics.harmonic_mean()()
fonskiyonu kullanılır.statistics.mode()
fonskiyonu kullanılır.statistics.median()
fonskiyonu kullanılır.statistics.median_low()
fonskiyonu kullanılır.statistics.median_high()
fonskiyonu kullanılır.statistics.median_grouped()
fonskiyonu kullanılır.statistics.stdev()
fonskiyonu kullanılır. Eğer popülasyon için hesaplanacaksa statistics.pstdev()
kullanılır.statistics.variance()
fonskiyonu kullanılır. Eğer popülasyon için hesaplanacaksa statistics.pvariance()
kullanılır.statistics.covariance()
fonskiyonu kullanılır.statistics.correlation()
fonskiyonu kullanılır.statistics.linear_regression()
fonskiyonu kullanılır.Programlama dillerinde değişkenleri&değerleri karşılaştırarak Doğru (True) veya Yanlış (False) bulma operatörüdür. Karşılaştırma işleçlerinden True veya False (boolean değer) haricinde bir çıktı olmaz.
OPERATÖR | İŞLEVİ | AÇIKLAMA | ÖRNEK | ÇIKTI |
---|---|---|---|---|
== | Eşit mi? | Eşittirlerin sağındaki ve solundaki değerleri karşılaştırır. Eşitse True, değilse False değeri verir. | "TR"=="TR" 3==5 |
True False |
!= | Farklı mı? | Eşittirlerin sağındaki ve solundaki değerleri karşılaştırır. Farklıysa True, değilse False değeri verir. | "TR"!="TR" 3!=5 |
False True |
< | Küçük mü? | Eşittirlerin sağındaki ve solundaki değerleri karşılaştırır. Soldaki sağdakinden küçükse True, değilse False değeri verir. Sadece sayısal değerler için kullanılır. | 3<5 5<3 |
True False |
<= | Küçük veya Eşit mi? | Eşittirlerin sağındaki ve solundaki değerleri karşılaştırır. Soldaki sağdakinden küçük veya eşitse True, değilse False değeri verir. | 5<=5 5<=3 |
True False |
> | Büyük mü? | Eşittirlerin sağındaki ve solundaki değerleri karşılaştırır. Soldaki sağdakinden büyükse True, değilse False değeri verir. Sadece sayısal değerler için kullanılır. | 3>5 5>3 |
False True |
>= | Büyük veya Eşit mi? | Eşittirlerin sağındaki ve solundaki değerleri karşılaştırır. Soldaki sağdakinden büyük veya eşitse True, değilse False değeri verir. | 5>=5 5>=7 |
True False |
Karşılaştırma operatörleri için örnekler:
sonuc = 3==5
print(sonuc)
sonuc = 3!=5
print(sonuc)
sonuc = "TÜRKİYE"=="TR"
print(sonuc)
sonuc = "TÜRKİYE"!="TR"
print(sonuc)
print("------")
sonuc = 3<5
print(sonuc)
sonuc = 3>5
print(sonuc)
sonuc = 3<=5
print(sonuc)
sonuc = 3>=5
print(sonuc)
Değişkenlerin veya değerlerinin 'ne' olduğu veya 'ne' içerdiği ile ilgili karşılaştırmalardır.
KARŞILAŞTIRMA | TİP | AÇIKLAMA | ÖRNEK | ÇIKTI |
---|---|---|---|---|
is | Kimlik | İki değişkenin veya nesnenin aynı olması durumunda TRUE değeri verir. Değilse False. | a is a | True |
is not | Kimlik | İki değişkenin veya nesnenin farklı olması durumunda TRUE değeri verir. Değilse False. | a is not a | False |
in | Üyelik | Solundaki değişken veya nesne, sağındaki değişkenin veya nesnenin içinde var ise TRUE değeri verir. Değilse False. | "Türkiye" in "i" | True |
not in | Üyelik | Solundaki değişken veya nesne, sağındaki değişkenin veya nesnenin içinde yok ise TRUE değeri verir. Değilse False. | "Türkiye" not in "i" | False |
Kimlik ve üyelik türü karşılaştırmalara örnekler verelim.
s1 = "İSTİKLAL HARBİ"
s2 = "KURTULUŞ SAVAŞI"
q = "U"
print(s1 is s2, s1 is not s2, s1 in q, s2 not in q)
KARŞILAŞTIRMA | TİP | AÇIKLAMA | ÖRNEK | ÇIKTI |
---|---|---|---|---|
endswith() | string | Değişken belirli bir değer ile bitiyorsa TRUE değeri verir. Değilse False. | "TR".endswith("R") | False |
startswith() | string | Değişken belirli bir değer ile başlıyorsa TRUE değeri verir. Değilse False. | "TR".startswith("T") | True |
isalnum() | string | Değişken tamamen harf veya rakamlardan oluşuyorsa TRUE değeri verir. Değilse False. | "TR1923".isalnum() | True |
isalpha() | string | Değişken tamamen harflerden oluşuyorsa TRUE değeri verir. Değilse False. | "TR1923".isalpha() | False |
isnumeric() | string | Değişken tamamen rakamlardan (float veya integer) oluşuyorsa TRUE değeri verir. Değilse False. | "1920".isnumeric() | True |
isdecimal() | string | Değişken tamamen ondalık sayılardan oluşuyorsa TRUE değeri verir. Değilse False. | "19.23".isdecimal() | True |
isdigit() | string | Değişken tamamen rakamlardan oluşuyorsa TRUE değeri verir. Değilse False. | "1923".isdigit() | True |
islower() | string | Değişkendeki tüm harfler küçükse TRUE değeri verir. Değilse False. | "TR".islower() | False |
isupper() | string | Değişkendeki tüm harfler büyükse TRUE değeri verir. Değilse False. | "TR".isupper() | True |
istitle() | string | Değişkendeki tüm harfler büyük harfle başlıyor ve diğerleri küçükse TRUE değeri verir. Değilse False. | "TR".istitle() | False |
isspace() | string | Değişken tamamen boşluklardan oluşuyorsa TRUE değeri verir. Değilse False. | "TR".isspace() | False |
print("TÜRKİYE".endswith("E"))
print("TÜRKİYE".startswith("X"))
print("TÜRKİYE1923".isalnum())
print("TÜRKİYE".isalpha())
print("1923".isnumeric())
print("19.23".isdecimal())
print("1923".isdigit())
print("TÜRKİYE".islower())
print("TÜRKİYE".isupper())
print("Türkiye".istitle())
print(" ".isspace())
Birden fazla karşılaştırma işleci kullanılacağı zaman karşılaştırmaların birlikte test edilmesini sağlayan operatörlerdir. "VE(and) (bütün durumlar birlikte doğruysa)", "VEYA(or) (bütün durumlardan en az biri doğruysa)" ve "DEĞİL(not) (durumun tersi)" olarak 3 tanedir. Sonuçları her zaman True veya False olur.
OPERATÖR | İŞLEVİ | AÇIKLAMA | ÖRNEK | ÇIKTI |
---|---|---|---|---|
and | VE | Koşulların birlikte doğru olmasını test eder. Hepsi doğru ise True değeri verir. Herhangi birinin yanlış olması False değerini verir. | "TR"=="TR" and "TR"!="TC" | True |
or | VEYA | Koşulların herhangi birinin doğru olmasını test eder. Herhangi biri doğru ise True değeri verir. Hiçbiri doğru değilse False değerini verir. | "TR"=="TR" or "TR"!="TC" | True |
not | DEĞİL | Koşulun tersini test eder. Tersi doğru ise True değeri verir. Yanlış ise False değerini verir. | "TR"=="TR" or "TR"!="TC" | True |
i = 1923
s = "TR"
l = ["T","Ü","R","K","İ","Y","E",1923]
print (i==1923 and s=="TR")
print (i==19 and s=="TR")
print (i==19 or s=="TR")
print (not i==19 or not s=="TR")
print (not i==1923 and not s=="TR")
print (not i==1923 or not s=="TR")
print (s in l and i in l)
print (s in l or i in l)
Bilgisayarlar, her türlü bilgiyi bit adı verilen ikili rakamlar akışı olarak depolar. Bu bitler arasında karşılaştırmalar bitsel operatörler ile yapılır. Devre kartları gibi fiziksel cihazları kontrol etmede, sıkıştırma, şifreleme ve hata algılama gibi algoritmaları uygulamak için bitsel operatörleri kullanılır. Mantıksal operatörler gibidir.
OPERATÖR | İŞLEVİ | AÇIKLAMA | ÖRNEK | ÇIKTI |
---|---|---|---|---|
& | and | Karşılıklı bitleri kontrol ederek ikisi de 1 olanları açar, diğerlerini kapatır. | 10 & 10 10 & 5 |
10 0 |
I | or | Karşılıklı bitleri kontrol ederek herhangi biri 1 olanları açar, diğerlerini kapatır. | 10 l 10 10 I 5 |
10 15 |
^ | xor | Karşılıklı bitleri kontrol ederek karışılıklı 0-0, 1-0 veya 0-1 olanları açar, diğerlerini kapatır. | 10 ^ 10 10 ^ 5 |
0 15 |
~ | not | Karşılıklı bitleri kontrol ederek tersine çevirir. | ~10 ~5 |
-11 -6 |
a = 10
b = 5
c=10
print(a&b)
print(a&c)
print(a|b)
print(a|c)
print(a^b)
print(a^c)
print(~b)
Bitsel operatörlerin çalışma mantığı (Zaczyński, 2020):
Python'da standart olan (gömülü olan) modüller ile print(), input(), len() gibi fonksiyonları kullanmaktayız.
Bunların haricinde python ile birlikte gelen ama gömülü olmayan yani kodlama esnasında içeri aktarmamız (import) gereken kütüphaneler de var. Bunlar 'math', 'random', 'time', 'os' 'turtle', 'tkinter' vb. kütüphanelerdir. Tam listesi için buraya bakınız. Bunlar haricinde kullanılabilecek kütüphaneler için https://pypi.org/ sitesinden tarama yapabilirsiniz. Buradaki komutları sisteminizdeki komut isteminden çalıştırarak kütüphaneleri indirebilirsiniz. Şu an bu kısımda 'bazı' kütüphaneleri ele alacağız. Fakat konu ilerledikçe ilgili yeni kütüphaneleri de ele alacağız.
Kütüphaneler 3 farklı şekilde import edilebilir.
from kütüphane_adi import fonksiyon_adi
şeklindeimport kütüphane_adi
şeklinde
**3. import kütüphane_adi as takma_ad
şeklindefrom a import b
yazarsak a kütüphanesinin b fonksiyonunu kodlarımızda b()
olarak kullanırız. Bu kullanım ile başka bir kütüphaneden aktarılan başka bir fonksiyon ile isimlerinin çakışmayacağından emin olamayız. Bu sebeple pek tercih edilmemelidir.import a
yazarsak a kütüphanesinin b fonksiyonunu a.b()
olarak kullanabiliriz. Bu durumda başka kütüphanelerle isim karışıklığının önüne geçilmiş olur.as
deyiminden sonra bizim yazdığımız isim olur. Bu şekilde adı uzun olan kütüphanelerin adını kıslatarak kullanabiliriz. Örneğin import statistics as st
yazarsak statistics kütüphanesinin mean fonksiyonunu st.mean()
olarak yazabiliriz.Süre (Saat, Saniye), Tarih (Gün, Ay, Yıl) vb. elemanlarla işlemler yapmamızı sağlayan fonksiyonları barındırır.
import time
veya from time import *
ile import datetime veya from datetime import * olarak aktarılabilir.
Python için zamanın başlangıç noktası (epoch: belirli, kesin tarih) 1 Ocak 1970 olarak belirlenmiştir.
time.time()
fonskiyonu ile alınır.time.gmtime()
fonksiyonu ile float tipinde saniye olarak verilen süreyi 1 Ocak 1970 tarihine ekler ve yıl, ay, gün, saat, dakika, saniye, haftanın günü, yılın günü ve dts olarak 9 farklı değerde çıktı verir. Boş bırakılırsa kodun çalıştığı andaki zamana göre hesap eder. Saat dilimi (GMT) 0 olarak hesaplanır.time.localtime()
fonksiyonu ile sistemdeki saat-tarih bilgileri yıl, ay, gün, saat, saniye vb. olarak çıktı alınır.time.asctime()
fonksiyonu ile "Haftanın Günü, Ay, Gün Sayısı, Saat:Dakika:Saniye, Yıl" olarak çıktı alınır. Parametre olarak sadece gm.time()
fonksiyonunun çıktısına uygun bir girdi alır. Boş bırakılırsa çalıştığı andaki zaman-tarih alınır.time.ctime()
fonksiyonu ile "Haftanın Günü, Ay, Gün Sayısı, Saat:Dakika:Saniye, Yıl" olarak çıktı alınır. Parametre olarak saniye cinsinden float/integer değer girilir. Boş bırakılırsa çalıştığı andaki zaman-tarih alınır.time.sleep()
fonksiyonu ile "bekle" blokları gibi kodların çalışmasını istediğimiz sürede durdururuz. Örnek: time.sleep(2) 'devamındaki kodu çalıştırmadan önce 2 saniye bekler.time.strftime()
fonksiyonu ile asctime() fonksiyonuna ait bilgileri parçalayarak elde edebiliriz. Örneğin: print(time.strftime(%A)) ile haftanın tam gün adını (Sunday, Monday vb.) alırız. Bu fonksiyonun parametreleri:time.strftime(%a)
Hafta Günü Kısaltılmıştime.strftime(%A)
Hafta Gün Tam Adıtime.strftime(%b)
Ayın Kısaltılmış Adıtime.strftime(%B)
Ayın Tam Adıtime.strftime(%c)
Tam Tarih, Saat Ve Zaman Bilgisitime.strftime(%d)
Sayısal Olarak Güntime.strftime(%j)
Yılın Kaçıncı Günü Olduğutime.strftime(%m)
Sayısal Olarak Aytime.strftime(%U)
Kaçıncı Hafta Olduğutime.strftime(%y)
Yılın Son İki Rakamıtime.strftime(%Y)
Yılın Dört Haneli Tam Halitime.strftime(%x)
Tam Tarih Bilgisitime.strftime(%X)
Tam Saat Bilgisidatetime.date(yyyy,aa,gg)
fonskiyonu ile girilen değerler ISO formatında tarihi elde edilir. Sistemdeki günü almak için datetime.date.today()
metodu da vardır.datetime.time(saat,dakika,saniye,milisaniye)
fonksiyonu ile girilen değerler parametrede görülen formatta zaman elde edilir. Bu parametreler tamamen girilmek zorunda değildir. Sadece dakika belirlemek datetime.time(minute=5) gibi 5 dakika tanımlayabilirsiniz:datetime.datetime(yyyy,aa,gg)
fonskiyonu ile tarih (date) ve saat (time) birlikte olarak elde edilir. Ayrıca sonunda milisaniye (microsaniye) değeri de bulunur.datetime.timedelta()
fonksiyonu ile tarih işlemleri (ekleme vb.) yapılır. Örneğin bir tarih tipinde değişkene 2 gün eklemek için: ekleme=tarih+datetime.timedelta(days=2) yazılır.datetime.date.weekday()
fonksiyonu ile parametre olarak girilen değerin haftanın günü cinsinden çıktısı verilir. Örneğin: datetime.date.weekday(now)strftime()
fonksiyonu datetime kütüphanesinin time ve date fonksiyonları için de kullanılır.Tüm programlama dillerinde karar yapısı ile belirli bir koşulun gerçekleşmesi veya gerçekleşmemesi durumunda yapılacak işlemler sıralanır. Tüm dillerde temel karar yapısı if
bloğudur.
"if" kelime olarak "eğer" anlamına gelmektedir. "Eğer şart gerçekleşirse (doğruysa-True) veya gerçekleşmezse (yanlışsa-False)" şeklinde çalışır. Koşul yapıları boolean veri tipi ile çalışır. Şart gerçekleşmişse True, gerçekleşmemişse False değeri kabul eder ve koşula göre işlem bloğuna gider. "if" kullanılan ifadenin sonuna ":" işareti getirilmezse blok çalışmaz, program hata verir.
ates = 39
if ates>37.5: print("Ateş Yüksek") #ateş 39 olduğu için bu print çalışır.
if ates<=37.5: print("Ateş Normal") #ateş 39 olduğu için bu print çalışmaz.
Eğer if
ifadesinden sonra bir satırdan daha fazla kod yazılacaksa yazılan if
'in alt satırından ve bir tane girinti (indent) ile başlayarak yazılır. Bu girinti mantığı python'ın tamamında vardır ve sonu :
ile biten deyimlerden sonra alt satıra geçince bir girinti (indent) yapmak gerekmektedir. Örnek:
ates = 39
durum = "Düşük"
if ates>37.5:
durum="Yüksek"
print("Ateşiniz: ",durum)
if ates<=37.5:
durum="Düşük"
print("Ateşiniz: ",durum)
Koşul yapısı olan if
kullanılırken eğer ortada 2 ihtimal var ise tekrar if bloğu ile şart yazmaya gerek yoktur. Bunun için else
bloğu kullanılır. Else 'Değilse' anlamına gelir. Örnek:
ates = 39
if ates>37.5: print("Ateş Yüksek")
else: print("Ateş Normal") #else bloğu
durum = "Düşük"
if ates>37.5:
durum="Yüksek"
print("Ateşiniz: ",durum)
else: #else bloğu
durum="Düşük"
print("Ateşiniz: ",durum)
Eğer if kullanırken ortada 2 ihtimalden daha fazla ihtimal varsa elif
(eğer değilse) kullanımı ile şartlar birbirine bağlanır. elif
ile bir şartın gerçekleşmediği durumda diğer şarta bakar, gerçekleştiği durumda bakmaz. Örnek:
ates = 39
durum = "Düşük"
if ates>37.5:
durum="Yüksek"
print("Ateşiniz: ",durum)
elif ates<=35: #elif bloğu, öncesindeki şartın gerçkleşmediği durumda çalışır.
durum="Düşük"
print("Ateşiniz: ",durum)
else:
durum="Orta"
print("Ateşiniz: ",durum)
#Yukarıdaki örneği elif ile yapmazsak mantıksal karşılaştırma ile yapabiliriz.
ates = 39
durum = "Düşük"
if ates>37.5:
durum="Yüksek"
print("Ateşiniz: ",durum)
if ates<=35:
durum="Düşük"
print("Ateşiniz: ",durum)
if ates>35 and ates<=37.5: #and işleci
durum="Orta"
print("Ateşiniz: ",durum)
#Art arda birçok elif kullanılabilir.
puan = 73
if puan>=0 and puan<45: print("Zayıf")
elif puan>=0 and puan<55: print("Geçer")
elif puan>=0 and puan<70: print("Orta")
elif puan>=0 and puan<85: print("İyi")
elif puan>=0 and puan<=100: print("Pekiyi") #son blokta else kullanmadık çünkü 100'den büyük not girilince "pekiyi" yazmaması gerekir.
else: print("Lütfen 0-100 arasında not giriniz!")
Yukarıdaki örneği elif değil if
ile yaparsanız elif
'in önemini anlamış olursunuz.
İç İçe If kullanılabilir. Koşul içine koşul eklenebilir. Unutulmaması gereken bir üst düzeydeki koşulu gerçekleşmesine bağlı olarak gerçekleşir.
if puan>=0 and puan<=100:
if puan<45: print("Zayıf")
elif puan<55: print("Geçer")
elif puan<70: print("Orta")
elif puan<85: print("İyi")
else puan<=100: print("Pekiyi")
else: print("Lütfen 0-100 arasında not giriniz!")
if
yapısı string, integer, float, boolean, list gibi veri tiplerinde de kullanılabilir. Örnekler:
sifre = input("Şifre Giriniz: ")
sifreTekrar = input("Şifrenizi Tekrar Giriniz: ")
if sifre == sifreTekrar: print("Şifre onaylandı.")
if sifre != sifreTekrar: print("Şifreleri aynı giriniz.")
yas = int(input("Lütfen yaşınızı giriniz: "))
if not yas>=11: print("Bu oyunu oynayamazsınız.") #eğerdeğilse kalıbını kullandık.
else: print("Bu oyun için uygun yaştasınız, yönlendiriliyorsunuz...")
yas = int(input("Lütfen yaşınızı giriniz: "))
sonuc = yas>=11 #burada sonuc true veya false boolean tipi bir değer alır.
print(sonuc)
if sonuc: print("Bu oyun için uygun yaştasınız, yönlendiriliyorsunuz...")
else: print("Bu oyunu oynayamazsınız.")
i = int(input("0'dan 9'a kadar bir rakam yazınız."))
liste = [0,1,2,3,4,5,6,7,8,9]
if i in liste: print(i," sayısını girdiniz.")
else: print("0-9 arasında bir sayı girmediniz.")
ePosta = input("e-Posta Adresinizi Giriniz: ")
if not "@" in list(ePosta):
print("E-posta adresinde @ işareti olmak zorundadır.")
Genellikle dallanma veya ön şartlar gerektiren durumlarda kullanılır. Örneğin öğrencinin notu girilirken 0 ile 100 arasında ise geçerli bir puanı vardır ve bu puanlar arasında "Pekiyi - Zayıf" olarak değerlendirmeler alır. Fakat notu 0 ile 100 arasında değilse bu not geçerli değildir. Burada unutulmaması gereken ilk if bloğunun şartı gerçekleşmezse içerideki if bloklarının çalışmayacak olmasıdır.
#nested if yapısı
yas=int(input("Yaşınızı Giriniz: "))
if yas>=1 and yas<=17:
if yas>=6:
if yas<=11: print("Tahminen ilkokul öğrencisidir.")
if yas<=14 and yas>11: print("Tahminen Ortaokul öğrencisidir.")
if yas>14: print("Tahminen Lise öğrencisidir.")
else:
if yas>=4: print("Tahminen Anaokulu öğrencisidir.")
else: print("Okula veya anaokuluna başlama çağı gelmemiştir.")
else: print("Okul çağı bitmiş bir öğrencidir. Üniversiteye gidiyor olabilir.")
#Örnek problemin çözümü
kuladi = "abcd@gmail.com"
sifre = "12345"
girilen_kuladi = input("Kullanıcı Adınızı Giriniz: ")
girilen_sifre = input("Şifrenizi Giriniz: ")
if kuladi == girilen_kuladi and sifre == girilen_sifre:
print ("Giriş Başarılı")
else:
print ("Yanlış Kullanıcı Adı veya Şifre")
#Örnek problemin farklı (nested) çözümü
kuladi = "abcd@gmail.com"
sifre = "12345"
girilen_kuladi = input("Kullanıcı Adınızı Giriniz: ")
if kuladi != girilen_kuladi:
print ("Böyle bir kullanıcımız bulunmamaktadır.")
else:
girilen_sifre = input("Şifrenizi Giriniz: ")
if sifre != girilen_sifre:
print ("Yanlış Şifre Girdiniz. Tekrar baştan deneyiniz.")
else:
print ("Giriş Başarılı.")
Döngü: Bir program içerisinde bir işlem tekrarlayan şekilde yapılması gerektiğinde kodları tek tek yazmak yerine kullanılan yapılardır. İki tür döngü vardır. Sayaçlı döngüler (for
), yani kaç kere döneceği belli olan döngüler ve koşullu döngüler (while
), yani koşul gerçekleşene kadar (kaç kere döneceği belli değil belki 1 belki 99) tekrarlayan döngüler.
Kodun belirli bir sayıda tekrar etmesi gereken durumlarda kullanılan döngü türüdür. Örnekler:
for i in range(6): print(i) #0'den 5'e kadar ekrana sayıları yazar. i varsayılan olarak 0'dır.
for i in range(1,10): print(i) #1'den 9'a kadar ekrana sayıları yazar.
for i in range(-10,11): print(i) # -10'dan 10'a kadar ekrana sayıları yazar.
for i in range(1,21,2): print(i) # 1'den 20'ya kadar olan sayıları 2'şer atlayarak yazar (1-3-5-7...)
for i in range(0,21,2): print(i) # 0'dan 20'ya kadar olan sayıları 2'şer atlayarak yazar (0-2-4-6...)
for i in range(0,21,3): print(i) # 0'dan 20'ya kadar olan sayıları 3'er atlayarak yazar (0-2-4-6...)
For
döngüsü listedeki elemanlar içinde de döndürülebilir. Bu şekilde kullanılınca listenin eleman sayısı kadar döner ve her döngüde listenin bir elemanını ele alır.
gunler = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"]
for i in gunler: #for döngüsünde aksi belirtilmedikçe ilk olarak 0'dan başlar.Yani i=0 olur.
print (i)
gunler = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"]
for i in gunler:
if i.startswith("P"): print (i)
ozelKarakterler = ["!","'","+","-","*","/","%","&","(",")","=","?",".",";",":"]
guvenliParola = input("Güvenli Bir Parola Giriniz: ")
for karakter in guvenliParola:
if not karakter in ozelKarakterler:
print("Güvenli Şifre için özel karakterler kullanılmalıdır. Örnek:")
print(ozelKarakterler)
else: print("Tebrikler Güvenli Şire Oluşturuldu")
ciftSayilar =[]
son = int(input("Kaça kadar olan çift sayılar lazım?: "))
for i in range(0,son,2):
ciftSayilar.append(i)
print(ciftSayilar)
#üstteki algoritmanın farklı bir çözümü
ciftSayilar =[]
son = int(input("Kaça kadar olan çift sayılar lazım?: "))
for i in range(son):
if i%2==0: ciftSayilar.append(i)
print(ciftSayilar)
Döngüyü belirli bir adımda durdurmak ve çıkmak isterseniz break
deyimi (komutu) ile durdurmak ve bir sonraki döngü adımına geçmek isterseniz continue
deyimi (komutu) ile yapabilirsiniz. Bilgisayarın sonraki satıra geçmesini istediğiniz yerlerde pass
deyimi (komutunu) kullanabilirsiniz. continue
deyimi döngüyü başa sararken pass
deyimi sadece bulunduğu satırı atlatır.
Bu deyimlerden pass
ve break
her yerde kullanılabilir fakat continue
deyimi sadece koşul (if-elif-else
) ve döngü yapılarında kullanılabilir.
#girilen sayının asal sayı olup olmadığını test edelim
sayi = int(input("Asal testine sokulacak sayıyı giriniz: "))
for i in range(2,sayi):
if sayi%i==0:
print("Asal Değildir")
break
print("Break çalıştı ise buradan sonrası artık çalışmaz ve döngüden tamamen çıkar dolayısıyla bu satır ekrana gelmez.")
if i==sayi-1: print("Asaldır")
#girilen sayının asal sayı olup olmadığını test edelim
sayi = int(input("Asal testine sokulacak sayıyı giriniz: "))
for i in range(2,sayi):
if sayi%i!=0:
if i==sayi-1: print("Asaldır")
continue
print("Contiune çalışınca buradan sonrası artık çalışmaz, bir sonraki döngüye geçer.Dolayısıyla bu satır ekrana gelmez.")
else:
print("Asal Değildir.")
break
#Asal sayı probleminin çözümü
asal = "Evet"
for i in range(2,201): #Range fonksiyonu ile başlangıç ve bitiş aralığını belirlenir.Son sayıyının bir eksiğine kadar tekrarlar.
for k in range(2,i):
if i%k == 0:
asal = "Hayır"
break
else: asal = "Evet"
if asal =="Evet": print (i)
#Örnek problemin farklı çözümü
asal = "Evet"
asallar = []
for i in range(2,201):
for k in range(2,i):
if i%k == 0:
asal = "Hayır"
break
else: asal = "Evet"
if asal =="Evet": asallar.append (i)
print (asallar)
#Etkinlik çözümü
for i in range(1,11):
if i==1 or i==10:
print ("* "*20)
else:
print ("*"," "*35,"*")
#Etkinlik çözümü
en = int(input("En'i Giriniz: "))
boy = int(input("Boy'u Giriniz: "))
for i in range(1,boy+1):
if i==1 or i==boy:
print ("* "*en)
else:
print ("*"," "*(en*2-(boy//2)),"*")
Koşul sağlandığı-olduğu sürece tekrar eden döngü türüdür. Koşulun sağlandığı her kontrolden sonra döngü içindeki işlemler bir kez yapılır. Koşulun sağlanmadığı durumda döngüye girilmez. Koşuldan önce 'not' getirilerek "koşul sağlanmadığı sürece tekrar eden döngü" mantığı ile de döngü yapılabilir.
Sağlanması imkansız bir durum yaratarak sürekli döngü haline getirebilirsiniz. Örnekler:
# çalıştıktan sonra 3'ten geriye sayan sonrasında "BAŞLA" yazdıran algoritmayı kodlayınız.
import time
gecenSure = 0
while gecenSure<3:
time.sleep(1) #1 saniye beklettik.
gecenSure+=1 #saniyeyi 1 saniye bekledikten sonra hemen artırdık.
if gecenSure==3: # 3.saniye oldu ise ekrana yazdırsın ve bir sonraki döngüye giremeyeceği için "BAŞA" yazsın.
print("Geçen Süre:",gecenSure,"Saniye...","BAŞLA")
else:
print("Geçen Süre:",gecenSure,"Saniye...")
#toplamı 1923 olan iki sayı yazılana kadar tekrar eden döngü
i = 1923
toplam = 0
while toplam!=i:
toplam = 0
sayi1=int(input("1.Sayıyı giriniz: "))
sayi2=int(input("2.Sayıyı giriniz: "))
toplam = sayi1+sayi2
if toplam!=i: print ("Girdiğiniz sayıların toplamı: ",toplam,"\n1923'ü bulana kadar tekrar ediniz.")
else: print("Tebrikler!")
#toplamı 1923 olan iki sayı yazılana kadar tekrar eden döngü (FARKLI ÇÖZÜM)
i = 1923
toplam = 0
while toplam!=i:
toplam = 0
for j in range(1,3):
toplam+=int(input("{}.Sayıyı giriniz: ".format(j)))
if toplam!=i: print ("Girdiğiniz sayıların toplamı: ",toplam,"\n1923'ü bulana kadar tekrar ediniz.")
else: print("Tebrikler!")
# while döngüsünde not, break ve contiune kullanılabilir.
eposta = "abcd@hotmail.com"
sifre = "abcd1234"
giris ="Başarısız"
denemeSayisi = 0
while not giris=="Başarılı":
if denemeSayisi ==3:
print ("3 kere başarısız deneme yaptığınız için bağlantınız banlanmıştır.")
break
s1 = input("Kullanıcı E-Posta Giriniz: ")
s2 = input("Şifre Giriniz: ")
denemeSayisi +=1
if s1!=eposta or s2!=sifre: continue
if s1==eposta and s2==sifre:
print("Yönlendiriliyorsunuz.")
giris="Başarılı"
#Sayı bulma oyunu çözümü
alt,ust,durum,sayac = 1,100,"Bulunmadı",1
print(f'{alt} ile {ust} arasında bir sayı rasgele seçiniz.')
while durum=="Bulunmadı":
if (ust-alt)%2==0: orta=(ust-alt)//2 #fark çift sayı ise bölümü atynen alıyoruz.
else: orta=(ust-alt)//2+1 #fark tek sayı ise bölümü yukarı yuvarlıyoruz.
cevap=input(f'{sayac}.Soru: Tuttuğunuz sayı {alt+orta-1} sayısından büyük mü? (E/H): ').upper()
if cevap=="E": alt+=orta
else: ust-=orta
if alt==ust: durum="Bulundu"
sayac+=1
print(f'Tuttuğunuz sayı: {alt} sayısıdır.')
#Sayı bulma oyunu çözümü (for ile)
import math #sayıyı yukarı yuvarlamak için math kütüphanesinden ceil fonksiyonunu kullanacağız
print ("1 ile 100 arasında bir sayı aklınızdan tutunuz.")
cevap,sayi="E",50
cevap=input(f'1.Soru: Tuttuğun sayı {sayi} sayısından büyük mü? (E/H)').upper()
for i in range(2,8):
if cevap=="E":
sayi+=int(math.ceil(50/2**(i-1)))
cevap=input(f'{i}.Soru: Tuttuğun sayı {sayi} sayısından büyük mü? (E/H)').upper()
else:
sayi-=int(math.ceil(50/2**(i-1)))
cevap=input(f'{i}.Soru: Tuttuğun sayı {sayi} sayısından büyük mü? (E/H)').upper()
if sayi==1 or sayi==99: break
if cevap=="E": print("Tuttuğunuz sayi: ",sayi+1)
else: print("Tuttuğunuz sayi: ",sayi)
Döngülerde ve karar yapılarında (if, for ve while) bir de 'pass' deyimi(komutu) vardır. Bu deyim genelde taslak kodlar yazarken kullanılır. Continue deyimi(komutu) gibidir fakat contiune deyimi(komutu) döngüyü başa döndürürken pass deyimi ile satır es geçilir sonraki satırdan devam eder.
i=1
while i<15
if i%2==0:
pass
else:
print(i," sayısı tek sayıdır.")
i+=1 #i'yi kendimiz manuel olarak artırdık. While döngüsünde sayaç olmadığı için.
#kelebek motifi while döngüsü
satir=1
sonsatir=12
while satir<=sonsatir:
if satir<=int(sonsatir/2): print("*"*satir," "*(sonsatir-2*satir),"*"*satir)
else: print("*"*(sonsatir-satir)," "*(satir-(int(sonsatir/2)))*2,"*"*(sonsatir-satir))
satir+=1
#kelebek motifi for döngüsü
sonsatir=12
for i in range(1,sonsatir+1):
if i<=int(sonsatir/2): print("*"*i," "*(sonsatir-2*i),"*"*i)
else: print("*"*(sonsatir-i)," "*(i-int((sonsatir/2)))*2,"*"*(sonsatir-i))
#hızlı integer listeler oluşturmak için
liste = [i for i in range(1,11)] #bu örnek bir kompakt sözdizimidir.
print(liste)
#listelerden istenilen elemanları seçmek için
liste = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"]
print([eleman for eleman in liste if "a" in eleman]) #bu örnek bir kompakt sözdizimidir.
#listelerden istenilen elemanları seçmek için
liste = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"]
print([eleman for eleman in liste if eleman.endswith("a")]) #bu örnek bir kompakt sözdizimidir.
#birden çok değişkeni aynı anda atama
i,s,f,l = 1923,"TÜRKİYE",23.04,["A","N","A","V","A","T","A","N"]
print(i,s,f,l,sep="\n")
#liste tipi değişkenler (list,tuple,set,dictionary) için kompakt söz dizimleri
sayilar = [i for i in range(1,11)] #1'den 10'a kadar olan sayılardan bir liste oluşturduk.
karesi = [j**2 for j in sayilar] #'sayilar' listesindeki sayıların karesinden yeni bir liste oluşturduk.
print(karesi)
#enumerate() fonksiyonu ile for döngüsünü kullanarak liste tipi elemanlara sıralı sayılar atanabilir.
plakalar = ["İstanbul","İzmir","Kastamonu"]
for i,j in enumerate(plakalar,34):
print(i,j)
#zip fonksiyonu ile liste tipi değişkenler (list,tuple,set,dictionary) birleştirilir.
meyveler = ["muz","elma","karpuz"]
adetler = [5,8,2]
kilolar = [1.5, 2.1, 3.8]
for meyve, adet, kilo in zip(meyveler,adetler,kilolar): #birleştirme yapılırken listelerdeki en az eleman sayısı kadar eleman birleştirilir.
print(f"Meyve adı: {meyve}, Adet: {adet}, Kilo: {kilo}")
Programlama dilinde fonksiyonlar belirli görevleri yaparak sonucunu döndüren bir ifade bloğudur. Şimdiye kadar gördüğümüz print()
, input()
, len()
vb. öğeler fonksiyondur. Fonksiyonlar tekrar tekrar yapılan işleri yeniden yazmamak, ortak görevleri bir araya getirmek veya çok özel durumları gerçekleştirmek için kullanılır. Böylece temiz, basit, anlaşılır ve profesyonel bir kod yazabiliriz.
Fonksiyonlar def
deyimi ile başlanarak yazılır. Fonksiyonlar girdi olarak parametreler kullanır, çıktı olarak ise bir ifade bloğu ortaya çıkarır. Fonksiyonlardan çıkış deyimi return
'dür. Bu deyim aynı zamanda fonksiyon dışına aktardığımız değeri de döndürür.
Parametre, fonksiyonun değer üretmesi için gerekli değer veya değişken girdileridir.
Fonksiyon Yapısı:
global
değişkenler kodun tamamında geçerli olan değişkenlerdir. Fonksiyonlar sayesinde her fonksiyon içinde (yerel (local
)) yeni değişkenler oluşturabiliriz. Fonksiyon içinde oluşturduğumuz local
değişken isimleri global değildir ve programın başka bir yerinde (ana programda veya başka fonksiyonda) yeniden aynı değişken isimleri kullanılabilir.
Örneğin, bir programda yüzlerce for döngüsü kullanılır. Fonksiyonları kullanmazsak her for döngüsü için farklı bir global sayaç değeri tanımlamak gerekir. for i in ..., for x in ...., for y in ....., gibi. Fakat bu kodları fonksiyon halinde yazarsak her bir fonksiyonda for i in..., for i in..., şeklinde kullanabiliriz çünkü i değerleri birbirinden etkilenmez.
Örnek Fonksiyonlar:
#Parametresiz fonksiyon örneği
def merhaba():
print ("Merhaba Fonksiyonlar")
return
merhaba()
#Parametreli fonksiyon örneği
def islem(i1, i2):
sonuc = (i1*i2) + (i1//i2)
return (sonuc)
islem(10,2)
#Fonksiyonlardaki değişkenler fonksiyon dışında tanınan bir değişken değildir. (Global değildir)
def islem(i1, i2):
sonuc = (i1*i2) + (i1//i2)
return (sonuc)
islem(10,2)
print(sonuc) #sonuc değişkeni fonksiyon içinde tanımlamdığı için dışarıda tanınmaz. bu satır hata verir. kapatmak için başına # koyunuz
#Parametreli fonksiyonlarda girdi değişken tipini belirleme
def asal(sayi: int): #parametre olarak değişken tipi belirleyerek girdi parametresini integer
durum = "Asal"
for i in range(2,sayi):
if sayi%i==0:
durum = "Asal Değil"
break
return (print(durum))
asal(int(input("Bir Tam Sayı Giriniz: ")))
#Parametreli fonksiyonlarda uygun olmayan girdi değişken tipi ile hata verir.
def asal(sayi: int): #parametre olarak değişken tipi belirleyerek girdi parametresini integer olarak
durum = "Asal"
for i in range(2,sayi):
if sayi%i==0:
durum = "Asal Değil"
break
return (durum)
asal(float(input("Bir Tam Sayı Giriniz: "))) #parametre olarak uygun değişken tipi vermezsek program hata verir. (Bkz. float)
#Fonksiyonlarda parametreleri argümanlarla (değeri belirli olan değişken) çalıştırmak.
def islem(sayi: int, yil=2022):#parametre olarak değişken tipi belirleyerek girdi parametresini integer olarak
dYili = yil-sayi
return (print(f'Doğum yılınız: {dYili}'))
islem(int(input("Yaşınızı Giriniz: "))) #parametre 1 tane verdik ama fonksiyon tanımında 2 tane girdi var; biri parametre (sayi) diğeri argüman (yil)
Fibonacci dizisi, her sayının kendinden önceki ile toplanması sonucu oluşan bir sayı dizisidir. Fibonacci dizisi herhangi iki sayıdan başlayabilir. Fibonacci sayı dizisindeki sayıların birbirleriyle oranı olan ve altın oran denilen 1,618 sayısı ise doğada, sanatta ve hayatın her alanında görülen ve estetik ile bağdaştırılan bir sayıdır. Ayrıca Pascal Üçgeninde de fibonacci sayı dizisi bulunmaktadır.
Aşağıdaki görselde daha iyi anlaşılır:
#Tavşan Sorusu - Fibonacci Serisi Çözümü
def fibonacci(n: int):
terim1,terim2=0,1
if n!=1:
for i in range(2,n+1):
fibDegeri=terim1+terim2
terim1,terim2 = terim2,fibDegeri
else: fibDegeri=terim1+terim2
return(fibDegeri)
print(fibonacci(12)) #12.Ay'ı istediği için 12'yi girdik
#Fibonacci serisi
def fibonacci(n: int):
terim1,terim2=0,1
if n!=1:
for i in range(2,n+1):
fiboDegeri=terim1+terim2
print(f'{i}.terim: {fiboDegeri}')
terim1,terim2 = terim2,fiboDegeri
else:
fiboDegeri="1. Terim: ",terim1+terim2,""
return(fiboDegeri)
fibonacci(int(input("Fibonacci'nin kaç terimini yazdıralım?(Giriniz): ")))
#Etkinlik Çözümü
def pascal(n: int):
for i in range(1,n + 1):
m = 1;
for j in range(1,i + 1):
print(m, end =" ")
m = int(m * (i - j) / j)
print("")
return
pascal(int(input("Kaçıncı satıra kadar yazılacak, giriniz: ")))
Fonksiyon içinde fonksiyon kullanarak oluşturulan yapılardır. En dıştaki fonksiyonda kullanılan değişkenler daha içerde olan fonksiyonlar tarafından kullanılabilir. Sadece iç fonksiyonda kullanılan değişken 'yerel olmayan (nonlocal
)' olarak adlandırılır. Fonksiyon içinde tanımlanan fonksiyonlar varsayılan olarak dış dünyaya kapalıdır ve sadece tanımlandıkları fonksiyon içinde geçerlidirler. Örnekler:
def yetkiliMi(kullanici:str, sayfa:str):
def yetkiler(kullanici):
kullanicilar = {
"root":["AYARLAR","ANASAYFA","KULLANICILAR","TALEP","İŞLEM","MESAJ","İLETİŞİM"],
"admin":["ANASAYFA","KULLANICILAR","TALEP","İŞLEM","MESAJ","İLETİŞİM"],
"ogretmen":["TALEP","İŞLEM","MESAJ","İLETİŞİM"],
"ogrenci":["TALEP","İLETİŞİM"]
}
return kullanicilar.get(kullanici)
if sayfa in yetkiler(kullanici): return "Evet"
else: return "Hayır"
print("Yetkili Mi? ",yetkiliMi(input("Kullanıcı Adınızı Giriniz: ").lower(),input("Erişmek İstediğiniz Sayfa Adını Giriniz: ").upper()))
#Etkinlik Çözümü
def parcalama (soru):
start = 0
parcala = []
dortIslem=["+","-","*","/"]
for sayac in range(0,len(soru)):
if soru[sayac] in dortIslem:
parcala.append(int(soru[start:sayac]))
parcala.append(soru[sayac])
start = sayac + 1
if sayac == len(soru)-1: parcala.append(int(soru[start:sayac+1]))
def islem(parcalanmis):
sayac = 0
while sayac < len(parcalanmis):
if parcalanmis[sayac] == "*" or parcalanmis[sayac] == "/":
if parcalanmis[sayac] == "*": sonuc = parcalanmis[sayac-1]*parcalanmis[sayac+1]
if parcalanmis[sayac] == "/": sonuc = parcalanmis[sayac-1]/parcalanmis[sayac+1]
for i in range (1,4): parcalanmis.pop(sayac-1)
parcalanmis.insert(sayac-1,sonuc)
sayac-=1
sayac += 1
sonuc = parcalanmis[0]
for i in range (0,len(parcalanmis)-1):
if parcalanmis[i] == "+": sonuc+=parcalanmis[i+1]
if parcalanmis[i] == "-": sonuc-=parcalanmis[i+1]
return sonuc
return islem(parcala)
print(parcalama(input("İşlemi giriniz: ")))
Ek Bilgi:
Fonksiyonlar çağrılabilir şekilde (fonksiyon()
) kullanıldığında ilgili fonksiyonun return
ifadesindeki değeri döndürürler. Fakat fonksiyonları çağırmadan (yani fonksiyon
olarak) 'işlevini' bir değişken gibi kullanabiliriz. Bu yöntem bir fonksiyona başka bir fonksiyonu parametre olarak verirken kullanılır. Örnek:
# standart 'çağrılan' fonksiyon biçimi
def topla(a,b):
sonuc = a+b
return print(sonuc)
topla(3,5)
# çağrılmadan kullanılan fonksiyon biçimi
def topla(a,b):
sonuc = a+b
return sonuc
def carp(f,g): # f ve g adında 2 parametre aldık.
sonuc = f(g,5)*g # f parametresini fonksiyon olarak yolladığımızı bildiğimiz için
# onu kendi atandığı fonksiyonunu yerine getirmesi için parametreli olarak çağırdık.
return sonuc
fonk = topla # topla fonksiyonunu 'fonk' değişkenine atadık.
# 'fonk' değişkeni artık kendisine verilen parametreleri işlevini aldığı fonksiyon ile işleyebilecek bir durumda.
print(carp(fonk,10))
Esasında bu yaptığımız işlemin sonuç olarak şundan farkı yok.
# çağrılarak kullanılan fonksiyon biçimi
def topla(a,b):
sonuc = a+b
return sonuc
def carp(a,g): # f ve g adında 2 parametre aldık.
sonuc = topla(a,5)*g #fonksiyonu çağırarak kullandık.
return sonuc
print(carp(10,10))
# bunu şu şekilde yapmak daha sabit ifadelerle mümkün fakat dinamikliğe ihtiyacınız olduğu zamanlarda işlevsel değil.
def topla(a,b):
sonuc = a+b
return sonuc
def carp(a,g): # f ve g adında 2 parametre aldık.
sonuc = a*g #fonksiyonu çağırarak kullandık.
return sonuc
print(carp(topla(10,5),10))
Bir fonksiyona başka bir fonksiyonun işlevini dinamik bir şekilde aktrabilmek için fonksiyonu bir değişkene atayarak o değişkeni fonksiyon yerine dinamik olarak kullanmak iyi bir yöntem.
Ana programdaki (global
deki) değişkenler kodun tamamında geçerli, fonksiyon içindeki değişkenler (local
dekiler) ise sadece ilgili fonksiyonunda geçerli, kodun bütününde (global
de) geçerli değildir. Fakat bir fonksiyon içinde globaldeki değişken ismi ile aynı isimde bir local
değişken varsa fonksiyon o değişkeni local
olarak ele alır ve local
değeri üzerinden işlem yapar. Bu durumda global
olan değişkene erişilemez gibi hissedebilirsiniz. Fakat üst hiyeraşideki değişkeni fonksiyon içinden tanımlamak, erişmek, kullanmak ve değiştirmek gerekebilir. Bu durumda global
ve nonlocal
deyimlerini kullanabiliriz. Örnekler:
#global, local ve nonlocal değişkenlerin yerlerini öğrenelim.
g = "Ana Programdaki Değişken (Global)"
def yerel():
l = "Yerel Değişken (Local)"
def yerelOlmayan():
nl = "Yerel Olmayan Değişken (Non Local)"
return
return
print(g) #hata vermez, ekrana basılır.
print(l) #hata verir.
print(nl) #hata verir.
#global ve local'de aynı isimde değişken varsa fonksiyon local olanı ele alır.
g = "Ana Programdaki Değişken (Global)"
def yerel():
g = "Yerel Değişken (Local)"
return print("yerel() ile basılan g değeri: ",g)
print("print(g) ile basılan g değeri: ",g) #ana programdaki g (globalde olan)
yerel() #fonksiyondaki g (localde olan)
#global ve local'de aynı isimde değişken yoksa fonksiyon global olanı ele alır.
g = "Ana Programdaki Değişken (Global)"
def yerel():
l = "Yerel Değişken (Local)"
return print("yerel() ile basılan g değeri: ",g)
print("print(g) ile basılan g değeri: ",g) #ana programdaki g (globalde olan)
yerel() #fonksiyondaki g (globalde olduğu için fonksiyonda da geçerli olan)
Örneklemek gerekirse:
#global, local ve nonlocal değişkenlere erişelim
g = "Ana Programdaki Değişken (Global)"
def yerel():
global l #globalde geçerli olacak 'l' değişkenini fonksiyon içinde tanımladık
l = "Yerel'den tanımlanan bir global değişken" # 'l' artık global bir değişken
global g #globaldeki g değişkenine eriştik
g = "İçeriden Global değişkene eriştik ve değişkeni değiştirdik" #globaldeki g değişkenini değiştirdik
x = "Şu an yerel olan, fakat yerel olmayan iç fonksiyondan erişip değişeceğimiz değişken" #bunu iç fonksiyonda manipüle edeceğiz.
def yerelOlmayan():
nonlocal x
nl = "Yerel Olmayan Değişken (Non Local)"
x = nl + " Local'in Yerine Geçti ! Tadaaa"
return print("'nl'yi yazdırdık: ",nl)
yerelOlmayan() #iç fonksiyonu da çalıştıralım ve x değişsin.
return print("'x'i yazdırdık: ",x)
yerel() #Fonksiyonu çalıştırmazsak fonksiyon içinde yaptığımız işlemler gerçekleşmez. x ve nl değişkenleri bu satırla print olur. (return ettiğimiz için)
print("'g'yi yazdırdık: ",g) #hata vermez. "Ana Programdaki Değişken (Global)" çıktısını beklemeyin.
print("'l'yi yazdırdık: ",l) #hata vermez. Yerelden ana programda geçerli bir değişken oluşturduk.
Kendi kendini çağıran fonksiyonlara özyinelemeli (recursive) veya özyineli fonksiyonlar denilir. Özyinelemeli fonksiyonlar, ileri bilgisayar uygulamalarında çok kullanılır. Çoğunlukla, döngülerle çözülebilen problemler, özyinelemeli fonksiyonlarla çok daha kolay olarak çözülebilir (Karaçay, 2015)
Özyinelemeli Fonksiyon Çalışma Mantığı:
Yukarıdaki Örnek-1'de görüleceği üzere özyinelemeli fonksiyonda artık fonksiyonun yinelenmemesi gereken duruma özgü bir koşul (base case) ifadesi ile kendini yineletmeyen 'return' değeri verilerek fonksiyondan çıkılır ve sonuç gönderilir.
Örnek-2'de ise fonksiyon yinelenmesi gereken duruma özgü koşul (recursive case) ifadesi ile yineletilir, koşula uymadığı durumda kendini yineletmeyen 'return' değeri ile fonksiyondan çıkılır ve sonuç gönderilir.
Özyinelemeli fonkiyonların belirli bir şekli yoktur, farklı şekillerde de yapılabilir fakat konsept hepsinde aynıdır.
#tavşan sorusunun (fibonacci serisi) özyinelemeli çözümü
def fibonacci(n):
if n<3: return 1 # Base Case(Temel Durum) 3'ten küçük olunca yinelenmeyen return yazıyoruz.
#Neden 'n<3'; çünkü n=(2,1) olunca n-1=(1,0) n-2=(0,-1) dolayısıyla geriye doğru giderek ilk terime gelmiş olduk. Yinelemenin bitmesi gerek.
#Neden 'return 1'; çünkü ilk terime geldik ve ilk terim her halükarda 1.
return fibonacci(n-1)+fibonacci(n-2)
print(fibonacci(12)) #12. Ayda olacak tavşan sayısı, 12.Terim
#sıfırdan girilen pozitif sayıya kadar olan sayıların toplamını hesaplayan bir özyinelemeli fonksiyon yazalım
def toplam(sayi):
if sayi == 1: return 1 # Base Case(Temel Durum) 1'e gelince yinelenmeyen return yazıyoruz
return sayi + toplam(sayi - 1) # Recursive Case (Yineleten Durum) sayımızı her yinelemede birer azaltarak ve toplayarak yineliyoruz
print(toplam(int(input("Pozitif Bir Sayı Giriniz: "))))
#sıfır'dan girilen negatif sayıya kadar olan sayıların toplamını hesaplayan bir özyinelemeli fonksiyon yazalım
def toplam(sayi):
if sayi == -1: return -1 # Base Case(Temel Durum) -1'e gelince yinelenmeyen return yazıyoruz
return sayi + toplam(sayi + 1) # Recursive Case (Yineleten Durum) sayımızı her yinelemede birer artırarak ve toplayarak yineliyoruz
print(toplam(int(input("Negatif Bir Sayı Giriniz: "))))
#Girilen pozitif sayıya kadar olan sayıları çarpan bir özyinelemeli fonksiyon yazalım (faktöriyel bulma)
def carpim(sayi):
if sayi == 1: return 1 # Base Case(Temel Durum) 1'e gelince yinelenmeyen return yazıyoruz. Neden 0 değil de 1, 0 çarpmada yutan eleman.
return sayi * carpim(sayi - 1) # Recursive Case (Yineleten Durum) sayımızın bir eksiğini her yinelemede önceki sonuçla çarparak yineliyoruz.
print(carpim(int(input("Pozitif Bir Sayı Giriniz: "))))
#sayılar için len() foknsiyonu kullanılmıyor malum. Basamak hesaplamak için bir özyinelemeli fonksiyon yazalım
def basamak(sayi):
if sayi%10 < 1: return 0 # Base Case(Temel Durum) sayının 10'a bölümünden kalan ondalıklı olunca yinelenmeyen return yazıyoruz
return basamak(sayi/10) + 1 # Recursive Case (Yineleten Durum) sayının tam kısmını bölme işlemiyle bir azaltarak (ondalıklayarak) ve +1 ile yineliyoruz
print(basamak(int(input("Bir Sayı Giriniz: "))))
#Pascal üçgeni için bir özyinelemeli fonksiyon yazalım
def pascal(n):
satir = [1]
if n == 1:
print(len(satir),".Satır: ",satir)
return satir
islenenSatir = pascal(n-1)
for i in range(len(islenenSatir)-1):
satir.append(islenenSatir[i] + islenenSatir[i+1])
satir += [satir[0]]
print(len(satir),".Satır: ",satir)
return satir
pascal(int(input("Kaçıncı Satır'a Kadar Üçgen Oluşacak: ")))
Nesne yönelimli programlama şöyle açıklanabilir; martı, güvercin, baykuş, ağaçkakan, yarasa gibi kuşlar vardır, buradaki 'kuş' kavramı herhangi bir kuşu belirtmez, soyut bir kavram olarak zihinlerimizde yer edinmektedir. Bu örnekten yola çıkarak; 'baykuş', 'ağaçkakan', 'yarasa' nesneleri, 'kuş' sınıfı ifade eder. Nesne olarak her bir kuş'un (martı, baykuş, ağaçkakan, yarasa) da nitelikleri (ağırlığı, beslenme türü, yaşam alanı) ve metotları (saldırma, beslenme, uçma) vardır.
Bazı programlama dilleri (python'da buna dahil) bu yapıyı kullanmaktadır. Sınıf yapısı ile;
Kendisine ait veri türlerini belirleyeceğimiz ve bu veri türleriyle yeni nesneler üretmemizi sağlayan yapılara sınıf denir. Sınıfları oluşturmak için class
deyimi kullanılır. Sınıf dışına çıkmak için sadece girintiden (intend) çıkmanız yeterlidir. Aşağıda ilkel şekilde bir sınıf oluşturup ve niteliklerini belirleyelim.
#bir class oluşturalım
class birey(): #class'ı oluşturduk
isim = "" #nitelikleri (attributes) girdik
tcNo = 0 #nitelikleri girdik
yas = 0 #nit"elikleri girdik
cins = "" #nitelikleri girdik
#metotlar
#bir class'tan yeni bir class üretelim ve devraldığı niteliklere ek yeni nitelikler ekleyelim.
class birey(): # temel class'ı oluşturduk (üst sınıf-base class veya parent class)
isim = ""
tcNo = 0
yas = 0
cins = ""
#metotlar
class ogrenci(birey): # birey class'ından yeni bir 'ogrenci' class'ını türettik (alt sınıf-sub class veya child class)
isim = ""
tcNo = 0
yas = 0
cins = ""
okul = "" #yeni nitelikler
ogrNo = 0 #yeni nitelikler
seviye = 0 #yeni nitelikler
sube = "" #yeni nitelikler
class ogretmen(birey): # birey class'ından yeni bir 'ogretmen' class'ını türettik (alt sınıf-sub class veya child class)
isim = ""
tcNo = 0
yas = 0
cins = ""
okul = "" #yeni nitelikler
brans = "" #yeni nitelikler
kidem = 0 #yeni nitelikler
Yukarıdaki örnekte 'birey' sınıfının nitelikleri ve metotları 'ogrenci' sınıfı ve 'ogretmen' sınıfı tarafından class ogrenci(birey):
ve class ogretmen(birey):
ifadeleri ile devralınmıştır. Bu durumda 'birey' sınıfı 'üst sınıf (parent class)', 'ogrenci' ve 'ogretmen' sınıfı 'alt sınıf (child class)' olmaktadır.
Belirli bir sınıftan türetilen, kendisine has veri türleri ve değerleri olan, bu değerler doğrultusunda istenen davranışları sergileyen varlıklardır. Bir nesne üretmek için değişken tanımlar gibi nesne = sinif_adi()
ifadesini yazmanız yeterlidir. Örnek:
class birey(): #class'ı oluşturduk
isim = ""
tcNo = 0
yas = 0
cins = ""
#metotlar
#metotlar
#bir nesne (object) oluşturalım
nesne = birey() #bir nesne oluşturduk. Bu nesne 'birey' sınıfının niteliklerine sahip oldu (devraldı) ve metotlarını gerçekleştirebilir.
print(nesne) #print ile nesnemizin 'ram belleğimizdeki' adresi görüntülenir. eğer nesnemize ait nitelikleri görmek istiyorsak:
print(nesne.isim) #veya
print(nesne.tcNo) #şeklinde yazmak gerekir
class birey(): #class'ı oluşturduk
isim = ""
tcNo = 0
yas = 0
cins = ""
#metotlar
#bir nesne (object) oluşturalım
nesne1 = birey() #bir nesne oluşturduk.Bu nesne 'birey' sınıfının niteliklerine sahip oldu (devraldı) ve metotlarını gerçekleştirebilir.
nesne1.isim = "Mehmet Akif ERSOY"
nesne1.tcNo = 12345679800
nesne1.yas = 14
nesne1.cins = "E"
Bir sınıfa ait nesnenin bazı işlevlere sahip olması gerekir ki bunlara metot denir. Yani bir nesnenin gerçekleştirebileceği sınıfına ait fonksiyonlar metottur. Örnek:
#bir class ve class'a ait nitelikler (attributes) ve metotlar (methods) oluşturalım
class birey(): #class'ı oluşturduk
#nitelikleri oluşturuyoruz
isim = ""
tcNo = 0
yas = 0
cins = ""
#metot oluşturalım
def bireyKonus(self): #Buradaki 'self' 'kendisi' demektir. Hangi nesne çağrıldıysa onun 'kendini' göstermesini istiyoruz.
print(f'Ben {self.isim}. TC Numaram {self.tcNo}. Yaşım {self.yas}. Cinsiyetim {self.cins}.')
#ilk nesnemizi oluşturalım
birey1 = birey()
#ilk nesnemizin niteliklerini belirleyelim
birey1.isim = "Mehmet Akif ERSOY"
birey1.tcNo = 12345678900
birey1.yas = 14
birey1.cins = "E"
#ilk nesnemizde metotları kullanalım
birey1.bireyKonus()
Yukarıdaki yöntem ilkel ve 'class' felsefesine aykırı bir kullanım ama 'class' yapısını anlamak için anlaşılabilir bir örnek.
Bu ilkel ve işleri zorlaştıran mantıkla 'class' yapıları kullanılmaz. Nesnenin oluştuğu sınıfa ait olan nitelikleri otomatik çalışan (çağrılmadan kendi kendine çalışan) metotlarla işlenebilir. Bunun için genel olarak iki tür metot kullanılır; YAPICI ve YIKICI metotlar.
__init__
): Bir nesne oluşturulduğu anda (ogrenci1=ogrenci()
) otomatik çalışan metottur. Genellikle sınıfa ait oluşturulan nesnelerin niteliklerine değer atadığımız işlevdir. Python için bu işlev '__init__()
' metodudur.
# yapıcı metotla nesne oluşturma
class birey(): #class'ı oluşturduk
def __init__(self,isim,tcNo,yas,cins): # yapıcı metot oluşturalım
# zarif ifade ile
self.isim, self.tcNo, self.yas, self.cins = isim, tcNo, yas, cins
print("Nesne Oluşturma Başarılı! Nesnenin RAM Bellek'teki Adresi: ",self)
def bireyKonus(self): #Buradaki 'self' 'kendisi' demektir. Hangi nesne çağrıldıysa onun 'kendini' göstermesini istiyoruz.
print(f'Ben {self.isim}. TC Numaram {self.tcNo}. Yaşım {self.yas}. Cinsiyetim {self.cins}.')
#nesnemizi oluşturalım ve yapıcı metot sayesinde niteliklerini atayalım
birey1 = birey("Mehmet Akif ERSOY",12345678900,14,"Erkek")
#nesnemizde metotları kullanalım
birey1.bireyKonus()
__del__
): Bir nesne silindiği anda (del ogrenci1
) otomatik çalışan metottur. Genellikle sınıfa ait nesnenin tüm nitelik vb. değerlerinin silinmesi için kullanılan işlevdir. Ama şunu ifade etmek gerekir ki Python'da 'Garbage Collector' vardır. Yani çöp temizleyicisi demektir ve bir değişken/nesne silinince veya aynı isimde yeni bir değişken/nesne oluşturulduğunda otomatik olarak eskisini RAM'den temizler ve belleğimizde boşuna yer kaplamaz. Bu özellik her programlama dilinde yoktur. Bu sebeple nesne veya veriyi del
ile sildikten sonra onun bellekte kapladığı alanı da boşaltmanız gerekir. Bu metot esasında bu işlem için kullanılır ve Python'da 'Garbage Collector' özelliği olduğu için yıkıcı metot nadiren kullanılır. Fakat örneklendirelim.# yıkıcı metotla nesne yok etme
class birey():
def __init__(self,isim,tcNo,yas,cins):
self.isim, self.tcNo, self.yas, self.cins = isim, tcNo, yas, cins
print("Nesne Oluşturma Başarılı! RAM Bellekteki Adresi: ",self,sep="\n")
def __del__(self): #yıkıcı metot 'del' komutu ile otomatik çalışır.
print("Nesne Silme Başarılı! Boşaltılan RAM Bellek Adresi: ",self,sep="\n")
birey1 = birey("Mehmet Akif ERSOY",12345678900,14,"Erkek")
#nesnemizi yıkıcı metot ile silelim
del birey1
Yukarıdaki örnekten Python'un Garbage Collector'unu anlamak için şunu yapabilirsiniz. Koddan en son satırdaki del birey1
deyimini kaldırınız. Ardından aynı kodu birkaç kez çalıştırınız. İlk çalıştırma haricindeki tüm çalıştırmalarda __del__
metodunun çalıştığını göreceksiniz. del birey1
yazmadığınız halde neden metot çalıştı diye merak ediyor olabilirsiniz. Açıklaması şöyle birey1 nesnesi siz kodu ilk çalıştırdığınızda RAM Bellekte adresini aldı. Aynı kodu tekrar çalıştırdığınızda RAM Bellek'te zaten birey1 için yer ayrılmış olduğu için Python 'Garbage Collector' özelliği ile aynı isimdeki değişken için önceden ayrılan bu belleği boşaltmak için kendisi otomatik olarak yıkıcı metodu kullanıyor. Çünkü önceki çalıştırmada değişkene ayrılan bellek adresi aynı değişkene yeniden değer atanması (çalıştırılması) sebebiyle kullanılmayacak ve boşuna RAM Bellekte yer kaplayacak. Eğer her çalıştırmada farklı bir nesne adı girerseniz (örneğin birey2 veya birey3 olarak) 'Garbage Collector' yıkıcı metodu çağırmaz ve sadece nesne oluştu mesajı alırsınız.
Sınıf yapısını ilk anlattığımız örnekte sınıflardan alt sınıflar türetmiştik. Örnek olarak birey-öğrenci-öğretmen sınıfları oluşturmuştuk ve öğrenci ile öğretmen sınıfını 'birey' sınıfından class ogrenci(birey):
ve class ogretmen(birey):
ifadeleri ile türetmiştik. Bu örnekte birey üst sınıf ondan türetilenler onun alt sınıfı olmuştu.
Python'da bir sınıftan (üst sınıf) kalıtım ile başka bir sınıf (alt sınıf) türettiğiniz zaman, alt sınıftan oluşturulan nesne üst sınıfa ait nitelikleri ve metodları miras alır, yani alt sınıftan bir nesnede üst sınıfa ait nitelik ve metotları kullanabiliriz.
# KALITIM - MİRAS Örneği
class birey(): #bir sınıf oluşturduk
def __init__(self,isim,tcNo,yas,cins):
self.isim, self.tcNo, self.yas, self.cins = isim, tcNo, yas, cins
def bireyKonus(self): #Buradaki 'self' 'kendisi' demektir. Hangi nesne çağrıldıysa onun 'kendini' göstermesini istiyoruz.
print(f'Ben {self.isim}. TC Numaram {self.tcNo}. Yaşım {self.yas}. Cinsiyetim {self.cins}.')
class ogrenci(birey): # birey sınıfından yeni alt sınıf türettik
def __init__(self,isim,tcNo,yas,cins,okul,ogrNo,seviye,sube):
# ilk 4 değişken birey sınıfından KALITIM - MİRAS alındığı için kodu tekrar etmeyip birey'in init'ine gönderiyoruz
birey.__init__(self,isim,tcNo,yas,cins)
#yukarıda yazdığımız birey.__init__(self,isim,tcNo,yas,cins) ifadesi sabit olarak 'birey' sınıfına gönderme yapmaktadır.
#fakat programcı dinamik bir şekilde hangi üst sınıf ise adını yazmadan göndermesi daha zariftir.
#bunun için super() fonksiyonu kullanılır. Örnek:
# super().__init__(isim,tcNo,yas,cins) yazılabilir.
self.okul, self.ogrNo, self.seviye, self.sube = okul, ogrNo, seviye, sube #ogrenci sınıfına ait nitelikleri burada girdik.
def ogrenciKonus(self):
print(f'Sınıfım {self.seviye}-{self.sube}.')
#nesnemizi oluşturalım
ogrenci1 = ogrenci("Mehmet Akif ERSOY",12345678900,14,"Erkek","BİLSEM",355,7,"A")
#nesnemizin kendi sınıfından ve üst sınıfından kalıtım ile aldığı NİTELİKLERE erişelim.
print(ogrenci1.tcNo) #üst sınıfından nitelik
print(ogrenci1.ogrNo) #kendi sınıfından nitelik
#nesnemizin kendi sınıfından ve üst sınıfından kalıtım ile aldığı METOTLARA erişelim.
ogrenci1.bireyKonus() #üst sınıfından metot
ogrenci1.ogrenciKonus() #kendi sınıfından metot
Kalıtım (Miras) özelliği yapısı sayesinde bir sınıfa yeni özellik eklemek istediğimizde sıfırdan bir sınıf oluşturmamıza gerek kalmaz. Böylece üst sınıfın metotlarını veya niteliklerini türettiğimiz sınıfta (alt sınıf) yeninden yazmayız, üst sınıftan kalıtım ile erişerek kullanırız.
Kapsülleme bir sınıfa ait niteliklerin veya metotların erişimine kısıtlama getirmedir. Bazı nitelik veya metotlara erişimi kısıtlamak güvenlik açısından gerekli olabilir. Bir programlama dilinde niteliği veya metodu 'Erişim Belirleyiciler (Acces Modifiers)' ile kapsülleriz. Erişim belirleyiciler:
self.isim
) 'açık' ilan edilmiş olur. Sınıfın öğeleri varsayılan olarak herkese açıktır.# Açık (Public): Öğeler (nitelik, metot) için erişim belirleyicisi (alt çizgi) yok.
class calisan():
def __init__(self,sicilNo,isim,maas):
self.sicilNo, self.isim, self.maas = sicilNo, isim, maas
def goruntule(self):
print(f'Sicil No: {self.sicilNo}. İsim: {self.isim}. Maaş: {self.maas}.')
#nesnemizi oluşturalım ve niteliklerini atayalım
calisan1 = calisan(102,"Ahmet ALINTERİ",9500)
# sınıfa ait metotlara ve niteliklere DIŞARIDAN erişebiliyoruz.
calisan1.goruntule()
# sınıfa ait nitelikleri DIŞARIDAN değiştirebiliyoruz.
calisan1.maas = 13500
print("DIŞARDAN DEĞİŞİM SONRASI: ")
calisan1.goruntule()
_
(Örnek: self._isim
) erişim belirleyicisi eklenerek öğe 'korumalı' olarak bildirilir.# Korumalı (Protected): Öğeler (nitelik, metot) için erişim belirleyicisi tek alt çizgi var.
class havaAraci():
def __init__(self,uretici,model,seriNo):
self.uretici, self.model, self._seriNo = uretici, model, seriNo # seriNo niteliğini korumalı ilan ettik.
def _goruntule(self): # goruntule metodunu korumalı ilan ettik.
print(f'Üretici: {self.uretici}. Model: {self.model}. Seri No: {self._seriNo}.')
class siha(havaAraci):
def __init__(self,uretici,model,seriNo,muhimmat):
super().__init__(uretici,model,seriNo)
self._muhimmat = muhimmat # muhimmat niteliğini korumalı ilan ettik.
def tamOzellik(self):
self._goruntule()
print(f'Muhimmat: {self._muhimmat}.')
#nesnemizi oluşturalım ve niteliklerini atayalım
h1 = siha("TUSAŞ","Aksungur","TR1923-1",6)
# Normalde aşağıdaki kodlarla dışarıdan bu bilgilere erişememem gerekirken önüne tek alt çizgi konulunca erişilebiliyor.
# Yani python'da 'korumalı' sınıfının öğelerine dışarıdan da erişilebiliyor ve değiştirilebiliyor. Teorik olanın uygulaması yok.
print(h1._seriNo)
print(h1._muhimmat)
h1._goruntule()
# korumalı ilan edilenler dışarıdan değiştiriledebilir.
h1._seriNo = "TR2023-100"
h1._muhimmat = 18
print(h1._seriNo)
print(h1._muhimmat)
h1._goruntule()
__
(Örnek: self.__isim
) erişim belirleyicisi eklenerek öğe 'özel' olarak bildirilir. Teorik olarak en güvenli erişim belirleyicisidir.# Özel (Private): Öğeler (nitelik, metot) için erişim belirleyicisi çift alt çizgi var.
class musteri():
def __init__(self,tcNo,isim,sube,para):
self.tcNo, self.isim, self.sube, self.__para = tcNo, isim, sube, para # para niteliğini özel ilan ettik. Dışarıdan erişilemez.
print("Müşteri Oluşturma Başarılı! Müşteri Tipi:",type(self).__name__)
def __goruntule(self): # goruntule metodunu özel ilan ettik. Dışarıdan erişilemez.
print(f'TC No: {self.tcNo}. İsim: {self.isim}. Şube: {self.sube}. Para: {self.__para}.')
def paraEkle(self,miktar):
self.__para += miktar # özel ilan edilen 'para' niteliğine içeriden erişilebilir.
print("Para Ekleme Başarılı!")
self.__goruntule() # özel ilan edilen 'goruntule' metoduna içeriden erişilebilir.
#nesnemizi oluşturalım ve niteliklerini atayalım
m1 = musteri(123,"Asya TOPRAK","Üsküdar",1260)
#nesnemizin gizli ilan edilen öğelerine dışardan erişmeye çalışalım.
print(m1.__para) # bu satırdan hata alacaksınız. Çalıştırıp görün ve bu satırı silin.
m1.__goruntule() # bu satırdan da hata alacaksınız. Çalıştırıp görün ve bu satırı da silin.
#müşterimize açık ilan edilen paraEkle() metodu ile para ekleyelim ve sonucu görelim.
# m1.paraEkle(4000) # satırın başındaki hashtagi silerek çalıştırın. Dışardan erişemediğimiz öğelere içeriden erişebilir olduğunu görün.
'Korumalı' sınıfını anlatırken ifade ettiğimiz "Guido van ROSSUM " Eğer programcının ihtiyacı varsa programdaki tüm öğelere erişebilmelidir." fikrini savunduğu için bu erişim belirleyicisi Python'da işlevini yerine getirmez." fikri üzere 'Özel' olarak ilan ettiğimiz öğelere de bir şekilde erişmek mümkünüdür. Python dil yapısında herşey bir nesnedir çünkü. Bu durumda her nesnenin ardından bir sınıf eki vardır. Yani nesne._sınıfAdı__özelÖğe
ile gizli öğelere de erişebilir ve değişebiliriz. Örnek :
# Özel (Private): Öğeler (nitelik, metot) için erişim belirleyicisi çift alt çizgi var.
class musteri():
def __init__(self,tcNo,isim,sube,para):
self.tcNo, self.isim, self.sube, self.__para = tcNo, isim, sube, para # para niteliğini özel ilan ettik. Dışarıdan erişilemez.
print("Müşteri Oluşturma Başarılı! Müşteri Tipi:",type(self).__name__)
def __goruntule(self): # goruntule metodunu özel ilan ettik. Dışarıdan erişilemez.
print(f'TC No: {self.tcNo}. İsim: {self.isim}. Şube: {self.sube}. Para: {self.__para}.')
def paraEkle(self,miktar):
self.__para += miktar # özel ilan edilen 'para' niteliğine içeriden erişilebilir.
print("Para Ekleme Başarılı!")
self.__goruntule() # özel ilan edilen 'goruntule' metoduna içeriden erişilebilir.
#nesnemizi oluşturalım ve niteliklerini atayalım
m1 = musteri(123,"Asya TOPRAK","Üsküdar",1260)
#nesnemizin gizli ilan edilen öğelerine dışardan isim bulanıklaştırmayıerişmeye çalışalım.
m1._musteri__goruntule()
Bunu ifade etmemin sebebi eğer gerçekten gizli olmasını istediğiniz öğeler varsa Python bunu karşılamamaktadır. Guido van ROSSUM bunu şöyle açıklamıştır: (Slashdot.org, 2013)
Özel öğlere erişimle ilgili daha detaylı bilgi için 'Python İsim Bulandırma (Pyhton Name Mangling)' özelliğini araştırabilirsiniz..
Çok biçimlilik aynı isimdeki bir işlevin (metot veya fonksiyon) uygulandığı öğeye göre farklı işlem yapmasına denir. Temel olarak 'Farklı İşlem' dediğimiz şey işlevde kullanılan parametrelerin veri türleri ve argüman sayısıdır.
Örnekleyecek olursak şimdiye kadar birçok kez kullanmış olduğumuz len()
fonksiyonunu ele alalım. len()
fonksiyonuna karakter dizisi (str
) gönderilirse onun karakter sayısını, liste (list
) gönderilirse onun eleman sayısını, sözlük (dict
) gönderilirse onun anahtar değeri sayısını bize verir. Yani aynı isimdeki fonksiyon, parametrenin veri tipine göre çok biçimli şekilde işlem yapar. Peki bu nasıl yapılıyor? Şu şekilde:
class kopek():
def __init__(self,tur):
self.tur = tur
def bilgi(self):
print("Ben",type(self).__name__,"sınıfında,",self.tur,"türündeyim.")
def sesVer(self):
print("Hav hav!")
class kedi():
def __init__(self,tur):
self.tur = tur
def bilgi(self):
print("Ben",type(self).__name__,"sınıfında,",self.tur,"türündeyim.")
def sesVer(self):
print("Miyav!")
# Yukarıdaki sınıflarda aynı isimde farklı işleve sahip metodlarımız mevcut.
# Şimdi birkaç tane hayvan oluşturalım.
hayvanlar = [kopek("Kurt Köpeği"),kopek("Kangal"),kedi("Ankara Kedisi"),kedi("Van Kedisi")]
#Şimdi farklı sınıf olmasına rağmen her sınıfta aynı isimde metot olduğu için nesneyle bağlantılı olarak kullanır.
for hayvan in hayvanlar:
hayvan.bilgi()
hayvan.sesVer()
'Üst Sınıf' - 'Alt Sınıf' ilişkisinin olduğu yani 'Kalıtım-Miras' yoluyla oluşturulan sınıflarda çok biçimlilik nasıl olur?
Kalıtım-Miras konusunu anlatırken "... alt sınıflar üst sınıfların niteliklerini ve metotlarını miras alır, yani alt sınıftan bir nesnede üst sınıfa ait metotları kullanabiliriz." diye ifade etmiştik. Peki her iki sınıfta da aynı metot var ise Python hangisini işletir? Tabiki de ait olduğu birincil sınıfın metodunu kullanır. Üst sınıfında bulunan aynı isimdeki metodu 'Geçersiz Kılar (Method Overriding)'.
class hayvan():
def __init__(self,tur):
self.tur = tur
print("Nesne Oluşturma Başarılı!: ",self.tur)
def bilgi(self): # Bu metot alt sınıfta olmadığı için alt sınıftaki nesne tarafından kalıtım-miras alınır.
print("Ben",type(self).__name__,"sınıfında,",self.tur,"türündeyim.") # Bu metodun geçersiz alt sınıfta geçersiz kılınmamıştır.
def sesVer(self): # Bu metot alt sınıfta da olduğu için, eğer nesne birincil olarak alt sınıfa aitse 'GEÇERSİZ KILINIR'
print("Hayvanların çeşitli sesleri olur.") # Bu metot geçersiz kılınacağı için ekrana hiç basılmayacak.
class kopek(hayvan):
def __init__(self,tur):
super().__init__(tur)
def sesVer(self): # Üst sınıftaki metodu geçersiz kılan metot.
print("Hav hav!")
class kedi(hayvan):
def __init__(self,tur):
super().__init__(tur)
def sesVer(self): # Üst sınıftaki metodu geçersiz kılan metot.
print("Miyav!")
# Yukarıdaki sınıflarda aynı isimde farklı işleve sahip metodlarımız mevcut.
# Şimdi birkaç tane hayvan oluşturalım.
hayvanlar = [kopek("Kurt Köpeği"),kopek("Kangal"),kedi("Ankara Kedisi"),kedi("Van Kedisi")]
#Şimdi farklı sınıf olmasına rağmen her sınıfta aynı isimde metot olduğu için nesneyle bağlantılı olarak kullanır.
for eleman in hayvanlar:
eleman.bilgi()
eleman.sesVer()
Soyutlama, fonksiyonların veya metotların nasıl çalıştığını öğrenmek yerine yalnızca girdi ve çıktılarına odaklanarak kodun daha sade ve anlaşılır olmasını sağlamaktır. Örneğin televizyon kumandasındaki düğmeleri kullanırsınız ama arkasındaki işlemlerin nasıl gerçekleştiğini görmezsiniz. Daha farklı bir örnekle, araç kullanmanız için size 'hız göstergesi', direskiyon', 'vites kolu', 'gaz pedalı', 'fren', 'debriyaj' gibi girdi-çıktı birimleri verilmiştir. Size düşen bu birimleri kullanarak araç sürmektir. Soyutlama tüm sınıfların veya metodların akılda tutulamayacağı büyük projelerde, eklenti yüklenebilen uygulamalarda, API oluşturmada vb. kullanılır. Soyut sınıf; somut işlevi olmayan bir sınıftır ve ondan oluşacak sınıfların 'planı'dır. Soyut sınıflar, soyut metodlar içerebilir.
Soyutlama Python'da gömülü olarak mevcut değildir, kullanmak için 'abc' kütüphanesinden ABC
ve abstractmethod
yapılarının içeri aktarılması gerekir. Bunun için from abc import ABC, abstractmethod
veya import abc
ile içeri aktarılır. İçeri aktarılan ABC
soyutlama yapılmak istenen sınıfların üst sınıfı olarak kullanılır. abstractmethod
ise metodlar için dekoratör olarak kullanılır. Örnek:
from abc import ABC, abstractmethod
class ogrenci(ABC): #soyut temelli 'ogrenci' sınıfı
def __init__(self,isim,ogrNo):
self.isim, self.ogrNo = isim, ogrNo
@abstractmethod #dekoratör ile metodu soyutlaştırdık. 'Soyut Metot'
def konus(self):
print(f"Ben: {self.isim}, Okul Numaram: {self.ogrNo}")
ogr = ogrenci("Nazım",123) # Soyut sınıftan bir nesne somutlaştıramazsınız. Hata alırsınız.
ogr.soyle() # Soyut sınıfın soyut metodunu, alt sınıflarından eğer aynı isimde bir metot yoksa somutlaştıramazsınız. Hata alırsınız.
from abc import ABC, abstractmethod
from random import randint
class oyuncu(ABC): #soyut temelli bir sınıf
def __init__(self,isim,takim,can): # Soyut sınıfta Normal metot.
self.isim, self.takim, self.can = isim, takim, can
print("Nesne Oluşturuldu: ",self.isim)
@abstractmethod #dekoratör ile metodu soyutlaştırdık.
def darbe(self,can): # Soyut metot. Kalıtım-miras alınsa bile alt sınıfta bu metot yoksa da üst sınıftakine ERİŞEMEZ.
self.can -= randint(1,70)
print("Darbe aldı! Kalan Can:",self.can)
def canEkle(self): # Soyut sınıfta Normal metot. Kalıtım-miras alınınca alt sınıfta bu metot olmasa da üst sınıftakine erişir.
self.can += randint(1,20)
print("Can Eklendi! Mevcut Can:",self.can)
class antiteror(oyuncu):
def __init__(self,isim,takim="AT",can=100): #can ve takim'i argüman yaparak sabit atadık.
super().__init__(isim,takim,can)
def darbe(self):
super().darbe(self)
p1 = antiteror("Mete Han")
p1.darbe() # 'darbe()' soyut sınıfta 'SOYUT' bir metot olduğu için alt sınıfta aynı metot olmazsa üst sınıftaki metot miras alınmaz ve çalışmaz.
p1.canEkle() # 'canEkle()' soyut sınıfta 'NORMAL' bir metot olduğu için alt sınıfta olmasa da üst sınıftan miras alır ve çalışır.
Yukarıdaki örnekten de göreceğiniz gibi, soyut sınıf oluşturmanın en temel farkı alt sınıfın üst sınıftaki 'soyut' metodu miras ile kalıtım alarak gerçekleştirememesi, yani somutlaştıramamasıdır. Fakat aynı isimdeki metot alt sınıfta mevcut ise soyut sınıftaki soyut metot çağrılabilir.
Ayrıca soyut sınıftaki işlemler alt sınıftaki işlemlerin bir şablonudur. Bu sebeple yeni oyuncu türleri türetsek de aynı işlemler için tekrar kod yazmaya gerek yok. Herhangi bir değişiklik olduğunda ilgili tüm sınıflarda bu kodları değişmek yerine soyut sınıfta değişmek yeterli gelir.
Python'da fonksiyonların bir adı olur ve onunla çağrılır. Fakat tek işleme sahip bir fonskiyona ihtiyacınız varsa def
ve return
ile iki satıra çıkmak yerine kompakt bir şekilde bunu halletmek daha zariftir. Ayrıca iç içe fonksiyolar yerine daha karışık olmayacak bir şekilde fonksiyon içinde fonksiyon gerekince lambda
deyimini kullanmak da yine zarif ve kullanışlıdır. Lambda
deyiminde anahtar kelime 'Tek İşlemli Fonksiyon' olmasıdır. Örneklemek gerekirse:
#bir sayının karesini lambda ile alalım
karesi = lambda sayi: sayi**2
print(karesi(5))
#bir metni tersten lambda ile tersten yazdıralım
ters = lambda kelime: kelime[::-1]
print(ters("1923"))
print(ters("EYİKRÜT"))
print(ters("TALAT"))
#bir sayıyı float yapma
flt = lambda sayi: float(sayi) if str(sayi).isnumeric() else print("Sayıya çevrilemez!")
print(flt(6))
print(flt("ABC"))
print(flt("578"))
print(flt(85.75))
Lambda
fonksiyonuna anonim fonksiyon denir.
Lambda
deyimi eğer fonksiyon içinde kullanılırsa fonksiyonun gerektirdiği parametre gibi lambda için de ayrıca parametre girilmesi gerekir. Örnek:
#fonksiyon içinde lambda
def ussu(n):
return lambda x : x**n
print(ussu(2)(5))
Dekoratörler, bir fonksiyonu başka bir fonksiyon ile giydirmek (bezemek, süslemek) veya birbirini bağlamak için kullanılır.
Yani def topla():
isminde bir fonksiyon ile verilen sayıları toplayacağınız bir işleviniz olduğunu düşünelim. Bu toplama işleminden önce verilen değerlerin sayı olup olmadığını kontrol etmek istiyorsunuz. Bunun için de def sayiKontrol():
isimli bir fonksiyonunuz var. sayiKontrol()
fonksiyonu her topla()
fonksiyonu 'çalışmadan önce' çalışması gerekiyor. Dolayısıyla bunu her seferinde yazmak yerine işlem zamanını ayarlamak için dekoratör kullanabiliriz. Buna bir fonksiyona başka fonksiyonların işlevlerini eklemek (bezemek-süslemek-dekore etmek) denir. Örnek:
map(fonksiyon,dongulenecek_veri)
olarak kullanılır ve parametre olarak aldığı fonksiyona, parametre olarak aldığı döngü oluşturulabilecek bir verinin her elemanını fonksiyona göndererek sonucu verir. Sonuç doğal olarak genellikle bir nesnedir. list()
fonksiyonu ile listeye dönüştürülerek print()
edilebilir. Örnek olarak:
# gönderilen her elemanı stringe çeviren fonksiyon
elemanlar = [1,2,3,4,5,6,7,8,9,0]
print(list(map(str,elemanlar)))
# gönderilen her elemanı 2'lik sayı sisteminde yazan fonksiyon
def ikili(n):
return str(bin(n))[2:]
print(list(map(ikili,range(1,10))))
# veya
print(list(map(lambda n: str(bin(n))[2:],range(1,10))))
# gönderilen her elemanın karesini alarak listeye dönüştüren fonksiyon
print(list(map(lambda x: x**2,range(1,10))))
# gönderilen her elemanın büyük harf yaparak listeye dönüştüren fonksiyon
s = "tbmm"
print(list(map(lambda x: x.upper(),s)))
filter(fonksiyon,dongulenecek_veri)
olarak kullanılır ve parametre olarak aldığı döngü oluşturulabilecek bir verinin her elemanını parametre olarak aldığı fonksiyona göndererek uyanların sonucunu verir. Sonuç doğal olarak genellikle bir nesnedir. list()
fonksiyonu ile listeye dönüştürülerek print()
edilebilir. Örnek olarak:
# gönderilen her elemanın 4'ün katı ise filtreleyen ve listeye dönüştüren fonksiyon
print(list(filter(lambda x: x%4==0,range(1,41))))
# gönderilen her elemanın eğer nümerik ise filtreleyen ve listeye dönüştüren fonksiyon
liste = [1923,"2023","TÜRKİYE","TFX-600",44]
print(list(filter(lambda x: str(x).isnumeric(),liste)))
# gönderilen her elemanın eğer yaşı 17'den büyük ise filtreleyen ve listeye dönüştüren fonksiyon
ogrenciler = {
"Mete":18,
"Asya":15,
"Oğuz":25,
"Aysu":17
}
print(list(filter(lambda x: str(x) if (ogrenciler[x]>17) else None,ogrenciler)))
Python'daki hatalar üç türden olabilir. 'Sözdizimi (syntax)' hataları, 'İstisnalar (Exceptions)' ve programın hataları 'Bug'. 'Bug' olarak ifade ettiğimiz programın hataları programda herhangi bir hata bloğuna sebep olmaz ama program doğru şekilde çalışmamış olur. 'Bug' türünden hataları bulmak için genelde programı kullananlardan 'geri bildirim (feedback)' alınır. Örneğin girilen iki sayının bölümünü bulmak için sayıları int()
ile tam sayıya çeviriyorsanız float()
tipinde girilen sayılar da tam sayıya çevrileceği için yanlış sonuç alırsınız fakat program herhangi bir hata yükseltmez. Yani 7/3.5 işlemi için 2.0 bulacağınıza 2.3333333333333335 sayısını elde edersiniz.
Sözdizim hataları oluştuğunda ise program tamamen durur ve kodun değiştirilmesi gerekir. Fakat 'İstisnalar' programcı tarafından programı durdurmadan akışı değiştirecek şekilde üstesinden gelinebilir. 'İstisnalar' bir sözdizim hatası değildir, programın yürütülmesi esnasında ortaya çıkan (yükseltilen) durumlardır. Örneğin iki sayıyı birbirine bölerken, bölen sayı sıfır olursa bölünemez ve bu durumdan dolayı 'Sıfıra Bölünme İstisnası' durumu yükselir. Başka bir örnekle, bir sayı (int) ve karakter dizisi (str) toplanmaya çalışılırsa 'Değer İstisnası' durumu yükselir.
Bazı istisnalar try:
ve except:
ile kontrol edilebilir. try:
çalışma mantığı şu şekildedir. İstisna çıkması ihtimali olan kodlar yazılmadan önce başa try:
(dene) yazılır ardından kod blokları yazılır.Bloklar bittikten sonra except:
deyimi yazılır ve istisna çıkması durumunda çalışması istenen kod blokları yazılır. Eğer try:
ile yazdığınız kod bloklarında bir istisna çıkmazsa program normal olarak yürütülür. Ama istisna çıkarsa programınız durdurulmaz, bunun yerine except:
bloğu içinde yazdığınız kodlar çalışır. Yani programdaki istisnayı kontrol ederek çalışma akışını değiştirebilirsiniz. Örnek:
def islem(a,b):
try:
sonuc = a/b
print(sonuc)
except:
print("Bir hata çıktı.")
islem(10,0)
Yukarıdaki örnekte gördüğümüz gibi program sonlanmadı ve bize istisnanın çıktığı durumdaki istisna bloğu olan except:
bloğundaki kodları çalıştırdı. Fakat bu istisnayı yakalamak ve onu düzeltmek istiyorsak esasında ortaya çıkabilecek istisnaların ne olduğunu da tahmin edebilmemiz (yordayabilmemiz) gerekir. Bu sebeple istisnaların bir isimleri vardır. Bunu şu şekilde görebiliriz:
def islem(a,b):
try:
sonuc = a/b
print(sonuc)
except Exception as hata: # istisnanın türünü 'hata' isimli değişkene atadık ve hatanın ne olduğunu artık görebiliriz.
print("Bir hata çıktı. Hata Adı:", hata.__class__.__name__,", Açıklaması:",hata)
islem(10,0)
Yukarıdaki örnekte:
islem(10,0)
için ZeroDivisionError
istisnası alırsınız. Çünkü hiçbir sayı 0'a bölünmezislem(10,"A")
için TypeError
istisnası alırsınız. Çünkü "A" harfi hiçbir sayıyı bölemez.islem(10,"A")
ve sonuc = float(a)/float(b)
için ValueError
istisnası alırsınız. Çünkü "A" harfi flolat'a çevrilemez.islem(10,5)
ve sonuc = a/c
için NameError
istisnası alırsınız. Çünkü 'c' isminde bir değişken tanımlı değil.try:
, except:
ifadeleri arasında yazılanlarda 'istisna' kontrolü yapılır. Yani try:
dışındaki bir kod bloğu için istisna kontrolü sağlamış olamazsınız. Örnek olarak yukarıdaki kod örneğinde islem(10,5)
yerine issslem(10,5)
yazarsanız alacağınız NameError
istisnası try:
- except:
bloğu dışında olduğu için kontrol dışı kalır. Ayrıca yapısı itibariyle her istisna da try:
- except:
ile kontrol edilemez. Python'daki tüm hata ve istisnalar için şuraya bakabilirsiniz: https://docs.python.org/2/library/exceptions.html#exception-hierarchy
İstisnalardaelse:
ve finally:
deyimleri kullanılabilir. İstisna yakalamayı denedik (try:
) ama bulunamadı ise else:
ile akışın devamı getirilebilir veya finally
deyimi ile hata yakalansa da yakalanmasa da yapılması istenen işlemler yazılabilir. Örnek:
try:
class calisan():
def __init__(self,sicilNo,isim,maas):
#sicilNo'yu tamsayıya çevirdik ama gelen parametre "A" olduğu için ValueError hatası yükselecek
self.sicilNo, self.isim, self.maas = int(sicilNo), isim, maas
def goruntule(self):
print(f'Sicil No: {self.sicilNo}. İsim: {self.isim}. Maaş: {self.maas}.')
calisan1 = calisan("A","Ahmet ALINTERİ",9500)
except Exception as hata:
s = "Çalışan Oluşturma Başarısız!\nHata: "+hata.__class__.__name__+"\nAçıklama: "+str(hata)
else:
s = "Çalışan Oluşturma Başarılı"
calisan1.goruntule()
finally:
print(s)
İstisna yakalandıktan sonra else:
ve finally:
ile akış değiştirilebilir ama esasen programcının programı en az hata yükseltecek şekilde tasarlaması ve ona göre ifade etmesi gerekir. Programdaki olası hata veya istisnaları önlemek esaslardan biridir. Ayrıca yakalanan istisna için çözüm varsa çözümü program tasarımında uygulaması gerekir. Örnek:
def islem(a,b):
try:
sonuc = float(a)/float(b)
except ValueError:
print("Virgül-Nokta Hatası Kontrol Ediliyor...")
if "," in (a+b):
print("Virgül-Nokta Hatası Bulundu!")
a=a.replace(",",".")
b=b.replace(",",".")
print("Virgül-Nokta Düzeltmesi Yapıldı!")
islem(a,b)
else:
print("Girdiğiniz elemanlardan biri sayıya çevrilemiyor.Elemanlar: ",a,",",b)
islem(input("Bolunecek sayıyı giriniz: "),input("Bolen sayıyı giriniz: "))
except ZeroDivisionError:
print("Bir sayı sıfıra bölünemez.")
islem(input("Bolunecek sayıyı giriniz: "),input("Bolen sayıyı giriniz: "))
except Exception as hata:
print("Hata Yakalandı! Çıkan Hata: ",hata.__class__.__name__,"Açıklaması: ",hata)
else:
return print(sonuc)
islem(input("Bolunecek sayıyı giriniz: "),input("Bolen sayıyı giriniz: "))
Programlama dillerinde assert
yani 'iddia etme' bir hata ayıklama aracıdır. Programın yanlış çalışmasını engellemek için programcının varsayımlarını iddia etmesidir. assert
ile bir ifadenin doğruluğu if
gibi kontrol edilir ve eğer doğru (True) ise kodlar çalışmaya devam eder, eğer yanlış (False) ise AssertionError
istisnası yükseltir ve programın akışını durdurulur. Örneğin TC Numarasını doğrulayacağız:
try:
def tcDogrula(tc):
assert tc.isnumeric(), "TC No Sayılardan Oluşmalıdır!"
assert tc[0]!="0", "TC No'nun İlk Hanesi '0 (Sıfır)' Olamaz.!"
assert len(tc)==11, "TC No 11 Haneli olmak zorundadır!"
tek = sum([int(tc[i]) for i in range(0,len(tc)-2,2)]) #tek basamakları topladık
cift = sum([int(tc[i]) for i in range(1,len(tc)-2,2)]) #çift basamakları topladık
assert int(tc[9]) == (7*tek-cift)%10, "Girilen TC No'nun 10.Basamağı Doğrulanamadı!" #10.basamak algoritması
assert int(tc[10]) == sum([int(tc[i]) for i in range(len(tc)-1)])%10, "Girilen TC No'nun 11.Basamağı Doğrulanamadı!" #11.basamak algoritması
print("TC No Geçerli")
tcDogrula(input("TC No giriniz: "))
except AssertionError as hata:
print(hata)
assert
deyimi try
-except
ile kullanılmak zorunda değildir. try
-except
ile kullanılınca 'Asseriton Error' istisnası diğer istisnalarda da olduğu gibi kırmızı ekran vermeden kontrol edilebilmektedir. Örnek:
#Örneğin sisteme kayıt olurken kullanıcı adının varolanlardan farklı olarak belirtilemesini sağlayalım
def kayitOl(kulAdi):
kullanilanlar = ["admin","root","teknikdestek","info","kurumsal"]
assert kulAdi.lower() not in kullanilanlar, "Bu kullanıcı adı zaten kullanılmaktadır. Başka birtane seçiniz."
kayit = KulAdi
print("Kayıt Başarılı!")
kayitOl(input("Kayıt olmak için kullanıcı adınızı giriniz: "))
assert
deyiminin kullanımı ile ilgili bilinmesi gerekenler:
assert
deyimi programın geliştirilme sürecindeki kaynak kodları deneme çalıştırmalarındaki hata ayıklama aracıdır (debugging). Bitmiş, derlenmiş ve sürüm haline getirilmiş programın çalışma süreçlerinde (runtime) dikkate alınmazlar. Yani kaynak kodun bir parçası gibi derlenmezler.assert
deyimi ile programcının iddiası (varsayımı) doğrulanmazsa (False) programın geri kalan kodları çalıştırılmaz. Hata bloğuna gidilir. Yani geliştirme sürecinde gereksiz yere kod çalıştırmaz ve geliştirme sürecini hızlandırır, kaynakları tüketmez.assert
ile yükseltilen her istisna 'Assertion Error' sınıfında olduğu için 'Assertion Error' istisnasından farklı olarak gerçekleşebilecek 'TypeError', 'ValueError' gibi istisnalar için 'kırmızı ekran' alınır.Sadece geliştirme sürecinde (debug) hata yükselttiği için assert
deyimi yerine her çalışma zamanında çalışacak şekilde istisna sınıfını belirterek istisnayı biz yükseltirsek daha uygun hata kontrolü yapmış oluruz.
İstisna veya hata yükseltmek Python'da raise
deyimi ile yapılır. raise
deyimi de try
- except
olmadan kullanılabilibir fakat istisna (hata) kontrolü yapmak için try
- except
ile kullanırız. Örnek:
try:
def tcDogrula(tc):
if not tc.isnumeric(): raise TypeError("TC No Sadece Rakamlardan Oluşur!")
if tc[0] == "0": raise ValueError("TC No Sıfır ile Başlayamaz!")
if len(tc)!=11: raise TypeError("TC No 11 Hanelidir!")
tek = sum([int(tc[i]) for i in range(0,len(tc)-2,2)]) #tek basamakları topladık
cift = sum([int(tc[i]) for i in range(1,len(tc)-2,2)]) #çift basamakları topladık
#10.basamak algoritması
if int(tc[9]) != (7*tek-cift)%10: raise Exception("Girilen TC No'nun 10.Basamağı Doğrulanamadı!")
#11.basamak algoritması
if int(tc[10]) != sum([int(tc[i]) for i in range(len(tc)-1)])%10: raise Exception("Girilen TC No'nun 11.Basamağı Doğrulanamadı!")
print("TC No Geçerli")
tcDogrula(input("TC No giriniz: "))
except TypeError as hata:
print(hata)
except TypeError as hata:
print(hata)
except Exception as hata:
print(hata)
Yukarıda da gördüğünüz gibi raise
deyimi ile hangi istisnanın yükseltileceğini biz belirliyoruz ve açıklamasını giriyoruz. raise
deyimi try
- except
ile birlikte gerçek sürümde de (gerçek çalışma zamanında) hata kontrolü içn kullanılır. Yani assert
kod yazım esnasında, raise
ise yayımlanan sürümde kullanılır. Ayrıca siz kendinize ait bir istisna sınıfını da yine raise
ile oluşturabilirsiniz.
class Hata(Exception): #Exception sınıfından alt bir 'Hata' isminde sınıf türettik.
def __init__(self,aciklama="Bir 'Hata' Çıktı!"):
if not aciklama == None: self.aciklama = aciklama
def __str__(self):
if not self.aciklama == None:
return self.aciklama
else:
return "Özel Hata Çıktı"
try:
veri = "A"
if not veri.isnumeric():
raise Hata("Verimiz ancak ve ancak sayı olabilir!")
except Hata as aciklama:
print(aciklama)
Dosya (Bilgisayar Dosyası): Disk üzerinde saklanan ve belirli büyüklüğü (bayt) olan verilerin oluşturduğu bir veri bütünüdür (yapısıdır). Dosyaları düzenli bir şekilde içerisinde tuttuğumuz klasörler bir dizin (path)'dir. Örneğin Windows işletim sisteminin kurulduğu klasör C:\Windows\
dizinidir. Sürücülerimizin yüklendiği klasör C:\Windows\System32\
dizinidir. Dizinler tek başına bir veriyi ifade etmediği için boyutları yoktur. İçerisinde barındırdığımız dosyalar ile büyüklüğü artar. Ayrıca klasörlerin veya dizinlerin bir uzantısı olmaz, o sadece bir yolu ifade eder.
Dosyaların ise dizinlerden farkı bir veri yapısı olmaları ve uzantısının olmasıdır. Örneğin .txt , .csv , .jpg , .png
gibi uzantılar sadece dosyalarda yani içerisinde veri içeren yapılarda olur. Metin dosyaları, resim dosyaları, program dosyaları, ayar dosyaları vb. dosyalar uzantısına göre tanımlanır.
Dosya bütünlüğü disk üzerinde [başlık (header) - veri - bitiş göstergesi (eof)]
ile belirlenir. Başlık kısmında başlangıç adresi, dosya başlık vb. birçok bilgi varken veri kısmında verinin binary içeriği mevcuttur. Bitiş göstergesi (end of file) ise verinin binary olarak tamamlanıp bittiğinin göstergesidir.
Örneğin bizim Python ile yazdığımız kodları çalıştırmamız için disk üzerine kaydetmemiz gerekir. Bu dosyanın uzantısı .py'dir ve uzantısından Python dosyası olduğu anlaşılabilir. Bir dosyayı çalıştırdığımızda (çift tıkladığımızda) onu disk üzerinden belleğe (RAM) çağırmış oluruz. İşletim sistemimiz de bu dosya türünü yürütebilecek bir program ile başlangıcından sonuna kadar (başlangıç adresi - bitiş göstergesi) dosyamızın verilerini yürütür. Python'da dosyalara open()
fonksiyonu ile erişilir.
Python'da open()
fonksiyonu ile bilgisayarınızda var olan bir dosyaya erişebilir, görüntüleyebilir, içeriğini değiştirebilir, yeni bir dosya oluşturabilir veya bir dosyayı silebilirsiniz. Şimdi çalıştırdığımız Python dosyası ile aynı dizinde (klasörde) olan bir metin dosyası oluşturalım. Eğer çalıştığınız python dosyasının nerede kayıtlı olduğunu bilmiyorsanız 'Dosya->Farklı Kaydet' seçeneği ile erişebileceğiniz bir yere kaydediniz.
dosya = open("metin_dosyasi.txt","w",encoding="utf-8") #dosyamızı oluşturduk ve açtık.
dosya.close() #dosyamızı kapattık.
Yukarıda yazdığımız kod çalıştırılınca, python dosyamız ile aynı dizinde bir metin_dosyasi.txt
dosyası oluşturur. Burada "w"
parametresiyle dosyayı yazma (write) modunda açtığımızı belirttik. Ayrıca encoding="utf-8"
parametresiyle dosyayı Türkçe karakterleri tanıyacak şekilde encode (kodla-çöz) ettik. Bu erişim parametresi ile eğer dizinimizde böyle bir dosya mevcut ise dosyanın üzerine yazarak sıfırdan yeni bir dosya açar. Yani eski dosyadaki veriler kaybolur. Dosyalara erişirken kullanabileceğimiz parametreler ve açıklamaları aşağıdaki gibidir.
ERİŞİM PARAMETRESİ | MOD | AÇIKLAMA | DOSYA VARSA | DOSYA YOKSA | İMLEÇ |
---|---|---|---|---|---|
"r" | Okuma | Dosyayı sadece okuma modunda açar. Dosyanın içeriğini değiştiremezsiniz. | İçeriğini koruyarak açar. | Hata verir. | Başta |
"r+" | Okuma Yazma |
Dosyayı okuma ve yazma modunda açar. Dosyayı okur veya dosyanın içeriğini değiştirebilirsiniz. | İçeriğini koruyarak açar. | Hata verir. | Başta |
"w" | Yazma | Dosyayı sadece yazma modunda açar. İçeriğini değiştirebilirsiniz fakat dosyada okuma işemleri yapamazsınız. Eğer dosya mevcutsa dosyadaki verileri sıfırlar (siler) ve boş şekilde açar. |
İçeriğin üzerine yazarak yenisini oluşturur. Eski içerik kaybolur. | Yenisini Oluşturur. | Başta |
"w+" | Okuma Yazma |
Dosyayı okuma ve yazma modunda açar. Eğer dosya mevcutsa dosyadaki verileri sıfırlar (siler) ve boş şekilde açar. |
İçeriğin üzerine yazarak yenisini oluşturur. Eski içerik kaybolur. | Yenisini Oluşturur. | Başta |
"a" | Yazma | Dosyayı sadece yazma modunda açar. Dosyada okuma vb. işemler yapamazsınız. Eğer dosya mevcutsa dosyadaki verileri silmeden en sonuna ekleme yapacak şekilde getirir. |
İçeriğini koruyarak açar. | Yenisini Oluşturur. | Sonda |
"a+" | Okuma Yazma |
Dosyayı okuma ve yazma modunda açar. Eğer dosya mevcutsa dosyadaki verileri silmeden en sonuna ekleme yapacak şekilde getirir. |
İçeriğini koruyarak açar. | Yenisini Oluşturur. | Sonda |
Dosyaları açtıktan sonra kapatmazsak farklı işlemler için dosyaya erişmesi gereken kodun geri kalanındaki ifadeler veya farklı programlar dosyaya erişemeyebilir. Bu sebeple okuma-yazma hataları yükselebilir. Bu sebeple açtığımız dosyalar ile işimiz bitince kapatmak öneme sahiptir. Python'da dosyaları yukarıdaki örnekte olduğu gibi close()
metodu ile kapatırız. Her seferde close()
metodunu kullanmak can sıkıcı olabileceği için with
deyimi daha işlevseldir.
open()
fonksiyonunu with
deyimi ile kullanırsak dosya işlemleri yaparken dosyayı her seferinde kapatmanıza gerek kalmaz. Çünkü deyimin kendine ait __enter()__
ve __exit()__
metodları vardır ve fonksiyonu kullanınınca bu işlemler otomatik gerçekleşir. Örnek kullanım:
with open("metin_dosyasi.txt","w",encoding="utf-8") as dosya:
pass #burada dosya.metot() olarak istediğimiz işlemleri yapabiliriz.
#with deyiminin girintisinden çıkınca dosya otomatik olarak kapanır. Yani dosya.close() olur.
with
deyimi esasında fonksiyonlar veya class'lar gibi __enter()__
ve __exit()__
metodu olan birçok yapıyla da kullanılabilir. Sadece dosya işlemlerine özgü bir yapı değildir.
Açtığımız dosyaya 'string' tipinde eklemeler yapmak için write()
metodunu, 'string' veya 'list' tipinde eklemeler yapmak için writelines()
metodunu kullanırız. Şimdi write()
ve writelines()
için bir örnek yapalım.
with open("metin_dosyasi.txt","w",encoding="utf-8") as dosya: #Dosyamızı yazma modunda açtık, eğer dosya mevcutsa üzerine yazarak sıfırladı.
bilgi = "TÜRKİYE, 1923, Ankara" #yazacağımız bilgileri string değişkene atadık.
dosya.write(bilgi) #string değişkenimizin değerlerini dosyamıza 'yazdık'.
dosya.write("\n") # bir alt satıra geçtik
bilgi = ["ANADOLU","=","ANAYURT"] #list değişkenimizin değerlerini dosyamıza 'yazdık'.
dosya.writelines(bilgi)
Şimdi Python kodlarımızı yazdığımız .py dosyamızın kayıtlı olduğu dizine gidelim ve orada oluşturduğumuz metin_dosyasi.txt
dosyasını açarak içine yazılanları kontrol edelim. Aşağıdaki resimdeki gibi olması gerekir.
İşlediğimiz dosyanın içindeki bilgileri dizine gidip açmaktansa python üzerinden de okuyabiliriz. Bunun için önce 'imleç' mantığını ifade edelim. Yukarıdaki resimde 'Türkiye'nin başında gördüğünüz '|' işaretine imleç (cursor) denir. Yapacağımız işlemler bu imleç hizasından yapılır. İmleç konumu bu sebeple önemlidir. Şimdi bunu örneklendirelim. Kapattığımız dosyayı okuma modunda tekrar açalım ve read()
metodu ile okuyalım.
with open("metin_dosyasi.txt","r",encoding="utf-8") as dosya: #Dosyamızı okuma modunda açtık, eğer dosya mevcut değilse hata verir.
print(dosya.read()) #dosyamızdaki verileri imlecin konumundan itibaren ekrana bastıralım.
Bu kodlar ile ekrana yukarıdaki resimde yazanlar basılır. Bunun sebebi 'r' erişim modu ile imlecin başta açılmasıdır. Çünkü read()
metodu ile imleçten sonrası ekrana yazılır. İmleç başta olduğu için imleçte sonra yazılanların hepsi basılır. Şimdi imleçten sonraki tüm verileri değil de belirli sayıda karaktere olanları görelim. Bunun için read()
metoduna parametre vermek lazım: read(5)
gibi.
with open("metin_dosyasi.txt","r",encoding="utf-8") as dosya: #Dosyamızı okuma modunda açtık, eğer dosya mevcut değilse hata verir.
print(dosya.read(7)) #dosyamızdaki verileri imlecin konumundan itibaren 7.karaktere kadar ekrana bastıralım.
read(7)
ifadesi ile ekrana sadece TÜRKİYE
yazıldığını görürüz. İmlecin olduğu konumdan itibaren 7 karakter yazdırır.
readlines()
metodu ile dosyamızdaki verilerin her bir satırı bir eleman olacak şekikde 'list' (liste) tipine çevrilir. Bu metot ile satırlar görünmez, her bir satır bir liste elemanı olur. Ekrana yazdırarak görelim.
with open("metin_dosyasi.txt","r",encoding="utf-8") as dosya: #Dosyamızı okuma modunda açtık, eğer dosya mevcut değilse hata verir.
print(dosya.readlines()) #dosyamızdaki verilerin her bir satırın liste elemanı yaparak listeyi ekrana yazdıralım.
readlines()
metoduna parametre verilerek işlem yaptırılabilir. Parametre ile şu şekilde çalışır:
İmlecin bulunduğu satırdan, parametre olarak girilen sayıda karakterin denk geldiği satır dahil olacak şekilde satırları liste elemanı yaparak listeyi oluşturur ve imleci o satırın sonuna alır. Yani yukardaki örnek için 21'e kadar yazlanlarda sadece ilk satırı eleman yapar, 21'den büyük değerler için ilk iki satırı eleman yapar.
with open("metin_dosyasi.txt","r",encoding="utf-8") as dosya: #Dosyamızı okuma modunda açtık, eğer dosya mevcut değilse hata verir.
liste = dosya.readlines(21)
print(liste)
with open("metin_dosyasi.txt","r",encoding="utf-8") as dosya: #Dosyamızı okuma modunda açtık, eğer dosya mevcut değilse hata verir.
liste = dosya.readlines(22)
print(liste)
Buradaki çıktılarda birşeyi farketmişsinizdir. readlines()
metodu kaçış stringlerini de önceki satıra dahil ediyor. Yani kaçış stringlerini görmezden gelmiyor. Şimdi dosyamızdaki satırları for
döngüsü ile yazdıralım.
with open("metin_dosyasi.txt","r",encoding="utf-8") as dosya: #Dosyamızı okuma modunda açtık, eğer dosya mevcut değilse hata verir.
for satir in dosya.readlines():
print(satir)
Farkettiyseniz bu kez kaçış stringi çalıştı. Çünkü her bir elemanı ele alırken string olarak ele aldığı için ilk satırı yazarken sonundaki kaçış stringi çalıştırdı ve alt satıra geçti. Şimdi bunu önleyelim.
with open("metin_dosyasi.txt","r",encoding="utf-8") as dosya: #Dosyamızı okuma modunda açtık, eğer dosya mevcut değilse hata verir.
for satir in dosya.readlines():
satir = satir.replace("\n","")
print(satir)
Python'da imleç kontrolü seek()
metodu ile yapılır. Bütün bu işlemlerin (write(), writelines(), read(), readlines()
) imlece göre yapıldığını unutmayalım. Şimdi imleci 25. byte konumuna yani ikinci satırın başına getirerek tekrar read()
metodu ile okuyalım.
with open("metin_dosyasi.txt","r",encoding="utf-8") as dosya: #Dosyamızı okuma modunda açtık, eğer dosya mevcut değilse hata verir.
dosya.seek(25) #imleci 25. byte konumuna getirdik.
print(dosya.read()) #dosyamızdaki verileri imlecin konumundan itibaren ekrana bastıralım.
Sonuç olarak sadece ANADOLU=ANAYURT
yazmış olması gerekir.
r, r+, w, w+, a, a+
erişim modlarını düşününce imleç konumunun önemini anlamış olduk. Şimdi readlines()
ve writelines()
metotları ile imleç konumunu biraz daha işleyelim. readlines()
ve writelines()
metotları ile imlecin bulunduğu yerden, parametre olarak girilen değerin denk geldiği satır ele alınır ve imleç o satırın sonuna getirilir.
with open("metin_dosyasi.txt","w+",encoding="utf-8") as dosya: #Dosyamızı yazma-okuma modunda açtık.
dosya.writelines("1.Satır") #imleç burada yazılanın sonuna geldi.
dosya.writelines("\n") #imleç burada yazılanın sonuna geldi. (Yani bundan sonrakiler alt satıra geçecek.)
dosya.writelines("2.Satır") #imleç burada yazılanın sonuna geldi.
dosya.writelines("\n") #imleç burada yazılanın sonuna geldi. (Yani bundan sonrakiler alt satıra geçecek.)
dosya.writelines("3.Satır") #imleç burada yazılanın sonuna geldi.
dosya.seek(0) # imleci başa aldık.
print(dosya.readlines(1)) #imleç 0'da idi. İmleçten sonra ilk byte konumuna denk geldiği satırı yazdı ve imleci bu satırın sonuna getirdi.
print(dosya.readlines(1)) #imleç 1.satırın sonunda idi. İmleçten sonra ilk byte konumuna denk geldiği satırı (2.satır) yazdı ve bu satırın sonuna geldi.
print(dosya.readlines(1)) #imleç 2.satırın sonunda idi. İmleçten sonra ilk byte konumuna denk geldiği satırı (3.satır) yazdı ve bu satırın sonuna geldi.
Yukarıdaki çıktından da göreceğimiz üzere imleç her zaman en son yapılan işlemin sonunda konumlanıyor. Bu işlemin yazma veya okuma olması farketmiyor. Bir örnek daha yapalım.
with open("metin_dosyasi.txt","w+",encoding="utf-8") as dosya: #Dosyamızı yazma-okuma modunda açtık.
dortluk = """Korkma, sönmez bu şafaklarda yüzen al sancak;
Sönmeden yurdumun üstünde tüten en son ocak.
O benim milletimin yıldızıdır, parlayacak;
O benimdir, o benim milletimindir ancak."""
dosya.write(dortluk) #imleç dörtlüğü yazdı ve sona geldi.
dosya.seek(0) #imleci başa almazsak sonraki adımdaki 'readlines()' boş olur. Çünkü imleç sonda. İmleç sonrasında birşey yok.
for i in range(len(dosya.readlines())):
if i==0: dosya.seek(0) #for döngüsüne girerken 'readlines()' yaptığımız için imleç sona geldi, onu ilk döngüde başa alıyoruz ki okunacak birşey olsun.
print(dosya.readlines(1))
Eğer dosyada imlecin konumunu öğrenmek istiyorsak tell()
metodunu kullanırız. Örnek:
with open("metin_dosyasi.txt","w+",encoding="utf-8") as dosya: #Dosyamızı yazma-okuma modunda açtık.
dortluk = """Korkma, sönmez bu şafaklarda yüzen al sancak;
Sönmeden yurdumun üstünde tüten en son ocak.
O benim milletimin yıldızıdır, parlayacak;
O benimdir, o benim milletimindir ancak."""
dosya.write(dortluk) #imleç dörtlüğü yazdı ve sona geldi.
print(dosya.tell()) #imlecin konumunu gösterdik.
dosya.seek(44) #imlecin konumunu değiştirdik.
print(dosya.tell()) #imlecin konumunu tekrar gösterdik.
Bir dosyayı sondan kırpmak için truncate()
metodunu kullanırız. truncate()
metodu için imleç kontrol etmenize gerek yoktur. Dosyayı baştan itibaren yazdığınız paratmetredeki byte konumuna kadar korur, geri kalanı budar. Bu sebeple sondan kırpmak diyebiliriz. Örneğin TÜRKİYE
stringinin olduğu bir dosyayı truncate(5)
ile budarsak baştan başlayarak beşinci byte konumuna gelir ve gerisini budar. Sonuç TÜRK
olur. Örnek yapalım.
with open("metin_dosyasi.txt","w+",encoding="utf-8") as dosya: #Dosyamızı yazma-okuma modunda açtık.
misra = "Her şey ben yaşarken oldu, bunu bilsin insanlar."
dosya.write(misra) #imleç misrayı yazdı ve sona geldi.
dosya.seek(0) #imleci başa aldık
print("Dosyanın ilk hali: ",dosya.read())
dosya.seek(0)
sonKelimeBaslangici = str(dosya.readlines()).rfind(" ")+1 #son kelime son boşluktan 1 sonraki karakterden başlar.
dosya.seek(sonKelimeBaslangici) #imlecimizi son kelimenin olduğu başlangıca aldık
sonKelime = dosya.read() # imlecin bulunduğu yerden sona kadar giderek son kelimeyi değişkene atadık.
dosya.truncate(sonKelimeBaslangici-1) #son kelimeyi budadık. Truncate kullanmak için imleç kontrolüne gerek yoktur. Baştan hiza alır, geri kalanı budar.
dosya.seek(0)
print("Dosyanın son hali: ",dosya.read())
print("Silinen veri: ",sonKelime)
truncate()
ile ilgili bir bilgi daha verelim. truncate()
byte konumuna göre budama yaptığı için eğer bir dosyayı truncate(10)
ile budarsanız dosya büyüklüğü 10 Byte olur. Budadığınız bir dosyaya sağ tıklayarak özelliklerinden boyutuna bakarak bunu görebilirsiniz. Farklı dosyalar türleri için truncate()
kullanırsanız eof
silenebileceği için dosyanız geri dönüştürülemez şekilde bozulabilir.
İşletim sistemine ait yetenekleri (dosya-klasör-silme-oluşturma vb.) kullanmamızı sağlayan fonksiyonları barındırır. import os
veya from os import *
olarak aktarılabilir.
os.name()
fonskiyonu kullanılır. (Windows (nt), Linux (posix) vb.)import plaftform
kütüphanesi ile platform.system()
ve sürümü için platform.release()
kullanılabilir. İşletim sistemi derlemesi için platform.version()
kullanılır.os.getcwd()
fonskiyonu kullanılır. Genelde . karakteridir.os.curdir
deyimi kullanılır.os.sep
deyimi kullanılır.os.chdir()
fonskiyonu kullanılır.os.listdir()
fonskiyonu kullanılır.os.pardir
deyimi kullanılır. Genelde .. karakteridir.os.startfile()
fonskiyonu kullanılır. Sadece windows işletim sisteminde çalışır.os.mkdir()
fonskiyonu kullanılır.os.mkdirs()
fonskiyonu kullanılır.os.rename()
veya os.replace()
fonskiyonu kullanılır. Örnek: os.rename(dizinin_Varolan_Adi,dizinin_Yeni_Adi)
os.remove()
fonskiyonu kullanılır.os.rmdir()
fonskiyonu kullanılır.os.removedirs()
fonskiyonu kullanılır.os.stat()
fonskiyonu kullanılır.os.path.dirname()
fonskiyonu kullanılır.os.path.exists()
fonskiyonu kullanılır.os.path.expanduser()
fonskiyonu kullanılır. Örnek: os.path.expanduser('~')os.path.isdir()
fonskiyonu kullanılır.os.path.isfile()
fonskiyonu kullanılır.os.path.join()
fonskiyonu kullanılır.Birkaç örnek yapalım. Örneğin bir python dosyası açmadık ve kabukta (shell) çalışıyoruz ve yeni bir dosya oluşturduk. Fakat dosyayı bulmamız gerekiyor. Python derleyicimizin çalıştığı konum için sırasıyla şunları yazarsak ekranda görüntüleriz.
import os
print(os.getcwd())
Çalıştığımız dizini os.chdir()
ile değiştirelim. Öyle bir dizin yoksa os.mkdir()
ile oluşturalım. Sonrasında os.rmdir()
ile silelim.
import os
from IPython.display import clear_output #Jupyter ile çalışıyorsanız output silmek için.
# DİZİN DEĞİŞTİRME
root = os.getcwd() #mevcut dizini root değişkenine atadık.
print("Şu an çalışılan dizin: ",os.getcwd())
yeni = "D:\\PythonDizini\\" #yeni değişkenine dizin atadık.
print("Yeni dizine geçiliyor...")
if not os.path.isdir(yeni): # Dizin yoksa oluşturacağız.
print("Yeni dizin mevcut değil, oluşturuluyor...")
os.mkdir(yeni) # os.mkdir() ile oluşturduk.
print("Oluşturma Başarılı!")
os.chdir(yeni) #eski dizini yeni dizin ile değiştirdik.
print("Dizin değiştirme başarılı!","Eski dizin: {}".format(root),"Mevcut Dizin: {}".format(os.getcwd()),sep="\n")
# ESKİ DİZİNE DÖNME DEĞİŞTİRME
#Root dizinine dönmeyi soruyoruz.
islem = input("Root dizinine dönmek istiyor musunuz? (E:Evet, H:Hayır)").upper()
os.system("clear") #önceden ekrana basılanları temizliyoruz. (Windows için 'cls' Linux için 'clear')
clear_output(wait=True) #Jupyter için önceden ekrana basılanları temizliyoruz.
if islem == "EVET" or islem == "E":
print("Root dizinine dönülüyor...")
os.chdir(root)
print("Dizin değiştirme başarılı!","Eski dizin: {}".format(yeni),"Mevcut Dizin: {}".format(os.getcwd()),sep="\n")
# OLUŞTURULAN DİZİNİ SİLME
# Oluşturduğumuz klasörü siliyoruz.
islem = input("Oluşturduğunuz klasörü silmek istiyor musunuz? (E:Evet, H:Hayır)").upper()
os.system("cls") #önceden ekrana basılanları temizliyoruz. (Windows için 'cls' Linux için 'clear')
clear_output(wait=True) #Jupyter için önceden ekrana basılanları temizliyoruz.
if islem == "EVET" or islem == "E":
print("Siliniyor...")
os.rmdir(yeni)
print("Dizin silme başarılı!","Silinen Dizin: {}".format(yeni),sep="\n")
Şimdi bilgisayarda kullanıcıya ait ne dosyalar var bakalım. Listeyelim.
import os
root = os.getcwd() #mevcut dizini root değişkenine atadık.
userPath = os.path.expanduser('~') #kullanıcı dizini için '~' giriyoruz.
dDisk = "D:\\"
print("Kullanıcı dosyalarının dizini: ",userPath)
print(f'{userPath} dizinindeki dosya ve klasörler: ')
for eleman in os.listdir(userPath): print(eleman)
print(f'\n{dDisk} dizinindeki dosya ve klasörler: ')
for eleman in os.listdir(dDisk): print(eleman)
print("Şu an içinde çalışılan dizin: ",os.getcwd()) #dizinlerde gezip dosyaları listelesek de Python çalıştığı dizin değişmez.
Python ile .txt
dosyaları standart olarak işlenebilirken .csv
veya .json
dosyalarını işlemek için ek kütüphanelere ihtiyaç vardır. import csv
ile .csv
dosyası işlemlerini, import json
ile .json
dosyası işlemlerini yapabilirsiniz. Bunlar haricinde görüntü dosyaları da ek kütüphaneler ile işlenebilmektedir.
Veritabanı: Elektronik olarak depolanan, yapılandırılmış bilgi veya verilerden oluşan düzenli veri kolesiyonudur. Veritabanı genelde satır ve sütunlardan oluşan ilişkisel tablolardır.
Veritabanı Yönetim Sistemi: Veritabanını yönetmek (oluşturma, erişme, organize etme, güvenliğini sağlama, bilgi ekleme, alma veya güncelleme vb. işler) için kullanılan yazılımlardır.
SQL (Structured Query Language): Veritabanı yönetim yazılımlarının standart olarak kullandığı 'sorgu' dilidir. Veritabanında 'sorgu'lar aracılığıyla bilgiler ekleyebilir, kaldırabilir, güncelleyebilir, arayabilir veya yeni tablolar oluşturabiliriz.
Örneğin bir .txt
dosyasına şu bilgileri yazdığımızı düşünelim:
"29 Ekim 1923 Tarihinde kurulan Türkiye Cumhuriyetinin başkenti kurulduğundan beri Ankara'dır. 1299 Yılında kurulan Osmanlı Devletinin son başkenti ise İstanbul olmuştur."
Burada yazan bilgileri Anadolu coğrafyasında kurulmuş tüm devletler için yazdığımızı düşünelim. Bu bilgiler yapılandırılmamış bir şekildedir ve bu bilgileri projelerimizde kullanmak için yapılandırmamız gerekir. Bu bilgileri şöyle yapılandırdığımızı düşünelim:
DEVLET ADI,KURULUŞ YILI,BAŞKENT
Türkiye Cumhuriyeti,1923,Ankara
Osmanlı Devleti,1299,İstanbul
Bu şekilde daha yapılandırılmış gibi oldu. Bu bilgileri kullanışlı bir hale getirmenin bir diğer yolu da tablo haline getirmektir.
|DEVLET ADI|KURULUŞ YILI|BAŞKENT|
|:-|:-:|:-|
|Türkiye Cumhuriyeti|1923|Ankara|
|Osmanlı Devleti|1299|İstanbul|
İşte verileri daha elverişli bir şekilde kullanabilmek için onları veritabanı şeklinde yapılandırarak yönetmekten geçiyor. Python bunun için standart bir modüle sahiptir. Python'daki sqlite3
modülü ile veritabanı yönetim işlemlerini işleyeceğiz. Python'da import sqlite3
ile veritabanı yönetim sistemini doğrudan projelerimize dahil edebiliriz.
SQLite3 ile Yönetebileceğimiz Veri Tipleri:
Pyhton sqlite3 modülü ile .sqlite3 , .sqlite , .db , .db3
uzantıya sahip veritabanı dosyalarını açabilir veya oluşturabiliriz. Burada .db , .db3
ile daha büyük(çok) ve farklı tipteki verilerden (boolean, datetime vb.) oluşan veritabanları yönetilebilir. Fakat doğrudan çalıştığı işletim sisteminin Windows olması dezavantajdır. Fakat .sqlite , .sqlite3
ile daha küçük çapta veritabanları ile yukarıda saydığımız veri tipleri yönetilebilir. Ayrıca çapraz platformdur. Yani sqlite her platformda (windows, linux, andorid, ios vb.) doğrudan çalışır. Bu sebeple burada yapacağımız örneklerde hangisini kullanırsak kullanalım bir fark bizim açımızdan olmaz. Eğer bir proje hazırlıyorsanız, projeye göre veritabanı dosya türünün ve yönetim sisteminin ne olması gerektiğine karar vermek için daha fazla bilgi sahibi olmanız gerekir.
Ayrıca burada yazdıklarımızın dışında da birçok veritabanı dosya türü mevcuttur. SQL ve NoSQL olarak farklı birçok seçenek projelere göre kullanılmaktadır.
Bir veritabanı oluşturmak ve ona bağlanmak için .connect()
metodu kullanılır. Eğer bağlanmaya çalıştığımız veritabanı mevcut ise onu oluşturmaz sadece bağlanır. Veritabanının oluştuğu yer varsayılan olarak python dosyasının yürütüldüğü dizindir. Örnek:
import sqlite3
#Python dosyamızı çalıştırdığımız dizindeki veritabanına bağlanalım. Eğer böyle bir dosya yoksa oluşturur ve bağlanır.
baglanti = sqlite3.connect('havadurumu.sqlite')
#bağlantıyı kapatır
baglanti.close()
Şu an bir veritabanı dosyası -eğer mevcut değilse- oluşturduk ve bağlandık. Veritabanı ile bağlantıyı kapatmak için .close()
metodu kullanılır. Bir dosyayı kapatmanın önemini 'Dosya İşlemleri' konusunda ifade etmiştik. Aynı önem veritabanı bağlantıları için de geçerlidir.
Bu ifadeyi with
deyimi ile de kullanabiliriz. Veritabanlarını with
deyimiyle kullanırsak blok bitince dosyadaki değişiklikler otomatik olarak uygulanır. Fakat dosya otomatik olarak kapanmaz.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
pass
#bağlantıyı kapatır
baglanti.close()
Eğer siz bir dizin yolu belirterek .connect()
yaparsanız o dizindeki veritabanını açar veya oluşturur. Var olmayan bir dizin için hata yükselir. Bu sebeple varolan bir dizin yolu girmemiz önemlidir. Örnek:
import sqlite3
with sqlite3.connect('D:\OrnekVeriTabanlari\havadurumu.sqlite') as baglanti:
pass
#bağlantıyı kapatır
baglanti.close()
Disk üzerinde bir dosya oluşturmak istemiyorsak Python ile RAM Bellek üzerinde, yani bağlantının çalıştığı sürece varolan, bağlantının kapatılmasıyla kaybolan bir veritabanı da oluşturabilirsiniz. Bu ilk başta faydasız gibi görünse de veritabanı üzerinde işlem yapmadan önce onun bir kopyası üzerinden işlem yapmak verilerinizi korur. Yahut bir veriyi veritabanına işlemeden önce onun üzerinde çeşitli dönüşümler yapmak ve sonrasında kaydetmek için önemlidir. Bellek içi veritabanı bağlantısı optimizasyon ve çeşitli çözümler (güvenlik vb.) sağlar.
RAM bellek üzerinde 'geçici' bir veritabanı bağlantısı oluşturmak için .connect(':memory:')
parametresi ile kullanılır.
import sqlite3
with sqlite3.connect(':memory:') as baglanti:
pass
Burada dikkat etmeniz gereken durum bağlantı kapatıldığı anda veritabanının kaybolmasıdır. with
deyimi ile veritabanı bağlantısı yapınca bloktan çıktığımız anda kapatılacağı için kaybolacağını düşünmemiz gerekir. Eğer bundan kaçınmak istiyorsak with
deyimi olmadan işlemlerimizi yapmalıyız. RAM Bellekte geçici veritabanı oluşturabildiğimiz gibi disk üzerinde de geçici şekilde oluşturabiliriz.
Disk üzerinde 'geçici' bir veritabanı bağlantısı oluşturmak için .connect('')
parametresi ile kullanılır. Bu şekilde disk üzeride geçici bir bağlantı açılmış olur.
import sqlite3
with sqlite3.connect('') as baglanti:
pass
Aynı şekilde bağlantının kapandığı anda oluşan veritabanı kaybolur.
Veritabanında herhangi bir işlem (ekleme,çıkarma,güncelleme vb.) yapmak için öncelikle 'imleç' oluşturmak gerekir. Bunun için de .cursor()
metodu kullanılır. Tablo oluşturma, veri ekleme vb. işlemler için 'imleç' veritabanında satır satır işlem yapma olanağını sağlar. Veritabanında yapılan sorguya dönen sonuçlardan sadece birkaçını işlemek için bütün sonuçları ele almak (ağ trafiği düşünüldüğünde) zaman alıcı ve verikaybı riski oluşturabileceği için imleç oluşturarak satır satır ele almanın daha işlevsel olduğu düşünülebilir. Örnek:
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor()
pass
baglanti.close()
Burada şu bilgiyi de vermek gerekir. Python SQLite3 modülü veritabanı işlemleri için çalıştırdığımız .execute()
gibi (.executemany() , .executescript() vb.
) bağlantı metodları için otomatik olarak bir imleç oluşturur. Ayrıca .cursor()
ile imleç oluşturmanız genelde gereksiz olur. Fakat bizler Python dışındaki genel yapıya hakim olmak için örneklerimizde imleç oluşturalım.
Sqltie veritabanlarını `DB Browser for SQLite` programı ile görüntüleyebilirsiniz. Eğer kullandığınız platforma uygun bir sürüm bulamazsanız https://sqliteonline.com/ sitesinden çevrimiçi olarak kullanıp veritabanınızı görüntüleyebilirsiniz.
Python'da veritabanında yürüttüğümüz işlemlerin veritabanına işlenmesi için .commit()
ile uygulanması gerekir. Eğer .commit()
ile uygulamazsak işlemler veritabanına uygulanmaz ve biz `DB Browser for SQLite` programı ile açıp bakarsak işlemlerin gerçekleşmediğini görürüz.
import sqlite3
#Python dosyamızı çalıştırdığımız dizindeki veritabanına bağlanalım. Eğer böyle bir dosya yoksa oluşturur ve bağlanır.
baglanti = sqlite3.connect('havadurumu.sqlite')
#Burada işlemler yaptığımızı varsayalım
pass
#İşlemleri veritabanına uygulayalım
baglanti.commit()
#bağlantıyı kapatır
baglanti.close()
Bununla birlikte Python'da with
deyimi ile veritabanı bağlantısını açtığınızda blok bitince yürüttüğünüz işlemler otomatik uygulanır. Yani self.commit()
çalışır.
with
deyimi ile veritabanına bağlandıysanız .commit()
kullanmanız gereksiz olur. Eğer with
deyimi olmadan veritabanında işlemler yaptıysanız .commit()
metodu ile bağlantıya uygulamanız gerekir.
with
deyimi kullanmanın artı ve eksi yönleri vardır. Veritabanında işlem yürütmek ve uyglamak hassas bir iştir. Yanlış bir işlem yürütmenizle bütün verileriniz kaybolabilir veya değişebilir ve bunu geriye döndüremezsiniz. Bu sebeple bazı işlemleri kontrol (if
) bloğu ile kontrol ederek veritabanına uygulamak istiyorsanız with
deyimi kullanmamalısınız. Kısacası with
deyimi ihtiyaca yönelik kullanılmalıdır.
Veritabanında herhangi bir işlem (ekleme,çıkarma,güncelleme vb.) yürütmek için .execute()
metodu kullanılır. Veritanbanında işlem yürütmek için SQL ifadeleri (sorgular) yürütülür. .execute()
metodu ile veritabanımızda SQL sorgularını ve ona bağımlı parametreleri yürütebiliriz. .execute()
metodunun kendine ait alt fonksiyonları (yani metodları) da vardır. Şimdi bunlara geçelim.
Veritabanında tabloları CREATE TABLE Tablo_Adi (Sutun_Adlari)
SQL sorgusunu .execute()
metoduyla yürüterek oluştururuz. Eğer veritabanımızda oluşturmak istediğimiz tablo zaten mevcut ise hata yükselir. Bundan kaçınmak için sorgu cümlemizi CREATE TABLE IF NOT EXISTS Tablo_Adi (Sutun_Adlari)
şeklinde 'EĞER MEVCUT DEĞİLSE (IF NOT EXISTS)' olarak ifade etmemiz gerekir. Bu kısımda artık SQL sorgu cümle yapılarını da yavaş yavaş tanıyacağız. Şimdi veritabanımızda bir tablo oluşturalım.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# SQL'de oluşturma, ekleme, silme, güncelleme vb. tüm işlemler için 'sorgu'lar yazlır.
#TABLO oluşturmak için SQL 'sorgu'su yazalım. Sorgumuzu bir string'e atayalım.
tablo =""" CREATE TABLE IF NOT EXISTS HavaDurumu (
Tarih TEXT NOT NULL,
Sehir TEXT NOT NULL,
Sicaklik_Dusuk INTEGER NOT NULL,
Sicaklik_Yuksek INTEGER NOT NULL,
Gokyuzu TEXT
)
"""
imlec.execute(tablo) #İmleç ile SQL Sorgumuzu veritabanımızda yürüttük ve tablo oluşturduk.
baglanti.close()
Yukarıda tablo
değişkenine atadığımız string bir tablo oluşturmak ve sütun eklemek için yazılmış SQL sorgusudur. Bu sorguda dikkat etmeniz gereken yerler:
tuple
veri tipindedir.IF NOT EXISTS
ifadesi kullanılır.NOT NULL
ile ifade edilir. Bu tabloda sadece 'Gokyuzu' sütununa veri girmenin zorunlu olmadığı ifade edilmiştir.SQLite için basit tablo oluşturma ve sütun ekleme sorgusu yukarıdaki gibidir.
Bu ifadeyi dinamik bir şekilde ayrı ayrı yazarak .execute()
ile de yürütebiliriz. Örnek:
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# SQL'de oluşturma, ekleme, silme, güncelleme vb. tüm işlemler için 'sorgu'lar yazlır.
#TABLO oluşturmak için SQL 'sorgu'su yazalım. Sorgumuzu bir string'e atayalım.
tabloAdi = "HavaDurumu"
sutunlar= ["Tarih TEXT NOT NULL",
"Sehir TEXT NOT NULL",
" Sicaklik_Dusuk INTEGER NOT NULL",
"Sicaklik_Yuksek INTEGER NOT NULL",
"Gokyuzu TEXT"]
sorgu = f"CREATE TABLE IF NOT EXISTS {tabloAdi} ({','.join(sutunlar)})"
#İmleç ile SQL Sorgumuzu veritabanımızda yürüttük ve tablo oluşturduk.
imlec.execute(sorgu)
baglanti.close()
Yukarıda yazdığımız SQL sorgu sözdizimi (syntax) SQLite içindir. MySQL, MS SQL, MariaDB, OracleDB, MongoDB, PostgreSQL gibi farklı birçok veritabanı yönetim sistemi vardır. Tüm sistemlerinin SQL sorgu sözdizimi temel olarak birbirine çok benzese de bazı farklarla sözdizimleri (syntax) birbirinden farklıdır.
Veritabanındaki tablolara veriler INSERT INTO Tablo_Adi (Sutun_Adlari) VALUES (Veriler)
ile eklenebilir. Sütun adlarını girmek zorunlu değildir. Sütun adları kısmı eklenmezse varsayılan olarak tablodaki tüm sütunları sırasıyla ele alır. Bu sebeple tablodaki sıralamayı da bilmek gerekir yoksa yanlış işlemlere sebep olabiliriz. Biz genel yapıya uygun olarak sütun adlarını vererek verileri ekleyelim.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
#TABLO oluşturmak için SQL 'sorgu'su yazalım. Sorgumuzu bir string'e atayalım.
tablo =""" CREATE TABLE IF NOT EXISTS HavaDurumu (
Tarih TEXT NOT NULL,
Sehir TEXT NOT NULL,
Sicaklik_Dusuk INTEGER NOT NULL,
Sicaklik_Yuksek INTEGER NOT NULL,
Gokyuzu TEXT
)
"""
imlec.execute(tablo) #İmleç ile SQL Sorgumuzu veritabanımızda yürüttük ve tablo oluşturduk.
# Şimdi 'ekleme' işlemi için SQL Sorgumuzu yazalım ve 'execute' ile veritabanımızda imleç aracılığıyla yürütelim.
imlec.execute("""INSERT INTO HavaDurumu (Tarih,Sehir,Sicaklik_Dusuk,Sicaklik_Yuksek,Gokyuzu) VALUES
("2023.01.01","İSTANBUL",7,13,"Parçalı Bulutlu")
""")
baglanti.close()
Yukarıdaki örnekte sütun adları verilerek veri eklendi. Sütun adlarını tablodaki sırasına göre yazmamıza gerek yok. Fakat verileri işlerken sütun adında belirttiğimiz sütuna veriyi ekler. Mesela yukarıdaki örnekte biz sütun adlarında 'Tarih' ile 'Sicaklik_Yuksek' sütunlarının yerlerini değiştirirsek alttaki 'VALUES' yazan değerlerde de '2023.01.01' ile '13'ün de yerini değişmemiz gerekir. Yoksa '2023.01.01'i 'Sicaklik_Yuksek', 13'ü 'Tarih' olarak kaydeder. Yani:
imlec.execute("""INSERT INTO HavaDurumu (Sicaklik_Yuksek,Sehir,Sicaklik_Dusuk,Tarih,Gokyuzu) VALUES
(13,"İSTANBUL",7,"2023.01.01","Parçalı Bulutlu")
""")
olarak yazılırsa da olur.
Tabloya ekleyeceğimiz verileri sabit bir ifade ile değil de değişken ile dinamik bir şekilde de atayabiliriz. Örnek:
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
#TABLO oluşturma
tabloAdi = "HavaDurumu"
sutunlar= ["Tarih TEXT NOT NULL",
"Sehir TEXT NOT NULL",
"Sicaklik_Dusuk INTEGER NOT NULL",
"Sicaklik_Yuksek INTEGER NOT NULL",
"Gokyuzu TEXT"]
olustur = f"CREATE TABLE IF NOT EXISTS {tabloAdi} ({','.join(sutunlar)})"
imlec.execute(olustur) #İmleç ile SQL Sorgumuzu veritabanımızda yürüttük ve tablo oluşturduk.
#Şimdi ekleme sorgumuzu dinamik bir şekilde (VALUES'den sonra sütun sayısı kadar '?' koyarak) yazalım.
ekle = f"INSERT INTO {tabloAdi} (Tarih,Sehir,Sicaklik_Dusuk,Sicaklik_Yuksek,Gokyuzu) VALUES (?,?,?,?,?)"
#Şimdi sorgumuza iliştireceğimiz verileri tuple olarak sorgumuzdaki tablo sırasına göre yazalım.
veri = ("2023.01.10","ANKARA",2,9,"Çok Bulutlu")
# Şimdi imleç kullanarak sorgu aracılığıyla verileri ekleyelim.
imlec.execute(ekle,veri)
baglanti.close()
Hem sorgumuzu hem de verilerimizi dinamik bir şekilde eklemiş olduk. Bunlardan hangisini dinamikleşmesi işinize geliyorsa o şekilde kullanabilirsiniz.
Şimdi bir veri setini (birçok veriyi) for döngüsü ile işleyelim.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
#TABLO oluşturma
tabloAdi = "HavaDurumu"
sutunlar= ["Tarih TEXT NOT NULL",
"Sehir TEXT NOT NULL",
"Sicaklik_Dusuk INTEGER NOT NULL",
"Sicaklik_Yuksek INTEGER NOT NULL",
"Gokyuzu TEXT"]
olustur = f"CREATE TABLE IF NOT EXISTS {tabloAdi} ({','.join(sutunlar)})"
imlec.execute(olustur) #İmleç ile SQL Sorgumuzu veritabanımızda yürüttük ve tablo oluşturduk.
#Şimdi ekleme sorgumuzu dinamik bir şekilde (VALUES'den sonra sütun sayısı kadar '?' koyarak) yazalım.
ekle = f"INSERT INTO {tabloAdi} (Tarih,Sehir,Sicaklik_Dusuk,Sicaklik_Yuksek,Gokyuzu) VALUES (?,?,?,?,?)"
#Şimdi tablomuza ekleyeceğimiz veri setini tuple'lardan oluşan bir liste olarak sorgumuzdaki tablo sırasına göre yazalım.
veriler = [("2023.01.04","İSTANBUL",5,9,"Bulutlu"),
("2023.01.05","İSTANBUL",4,10,"Parçalı Bulutlu"),
("2023.01.06","İSTANBUL",7,11,"Az Bulutlu"),
("2023.01.04","ANKARA",3,7,"Bulutlu"),
("2023.01.05","ANKARA",2,6,"Çok Bulutlu"),
("2023.01.04","İZMİR",9,13,"Parçalı Bulutlu"),
("2023.01.06","BURSA",5,11,"Parçalı Bulutlu"),
("2023.01.07","KONYA",1,13,"Açık")]
# Şimdi for döngüsü ve imleç aracılığıyla verileri ekleyelim.
for veri in veriler: imlec.execute(ekle,veri)
baglanti.close()
Veritabanındaki tablo ile verileri okumak, seçmek ve bunlar üzerinde işlemler yapmak için yazdığımız sorgularımızın sonuçlarını gidip getiren fetch
metodlarını kullanırız. Bunlardan:
.fetchall()
metodu, sorgumuzun bütün sonuçlarını (bütün satırları) liste olarak getirir..fetchone()
metodu, sorgumuzun bütün sonuçlarından her bir satırı sırayla getirir. Her çalıştığında bir sonraki satırı getirir..fetchmany(n)
metodu, sorgumuzun bütün sonuçlarından istediğimiz kadar satırını (n) liste olarak sırayla getirir. Her çalıştığında bir sonraki satırları (n) liste olarak getirir.import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor()
imlec.execute("SQL Sorgusu")
# Fetch metodları sorgunun '.execute()' edilmesine bağlıdır.
# Bir sorgu veritabanında yürütülmezse fetch metodları boş olarak döner.
# Aynı şekilde yürttüğümüz sorgunun bir sonucu olmazsa yine boş olarak döner.
gelenVeriler = imlec.fetchall()
baglanti.close()
Bir veritabanından veri seçecek olan 'temel' SQL sorgusu SELECT Sutun_Adi FROM Tablo_Adi
olarak yazılır. Örnek verelim.
NOT: Eğer bir önceki adımda tablo oluşturup veri eklediyseniz 'TABLO Oluşturma ve Veri Ekleme Satırlarını' kodlarınıza yazmayınız.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor()
#TABLO oluşturma ve Verileri Ekleme
tabloAdi = "HavaDurumu"
sutunlar= ["Tarih TEXT NOT NULL",
"Sehir TEXT NOT NULL",
"Sicaklik_Dusuk INTEGER NOT NULL",
"Sicaklik_Yuksek INTEGER NOT NULL",
"Gokyuzu TEXT"]
olustur = f"CREATE TABLE IF NOT EXISTS {tabloAdi} ({','.join(sutunlar)})"
imlec.execute(olustur)
ekle = f"INSERT INTO {tabloAdi} (Tarih,Sehir,Sicaklik_Dusuk,Sicaklik_Yuksek,Gokyuzu) VALUES (?,?,?,?,?)"
veriler = [("2023.01.04","İSTANBUL",5,9,"Bulutlu"),
("2023.01.05","İSTANBUL",4,10,"Parçalı Bulutlu"),
("2023.01.06","İSTANBUL",7,11,"Az Bulutlu"),
("2023.01.04","ANKARA",3,7,"Bulutlu"),
("2023.01.05","ANKARA",2,6,"Çok Bulutlu"),
("2023.01.04","İZMİR",9,13,"Parçalı Bulutlu"),
("2023.01.06","BURSA",5,11,"Parçalı Bulutlu"),
("2023.01.07","KONYA",1,13,"Açık")]
for veri in veriler: imlec.execute(ekle,veri)
# Şimdi veri süzecek SELECT'li SQL sorgumuzu yazalım. Şehir sütununu seçelim.
imlec.execute("SELECT Sehir FROM HavaDurumu")
sehirler = imlec.fetchall()
# Fetchall ile seçtiğimiz Sehir sütunundaki tüm satırları 'sehirler' değişkenine atadık. Şimdi sırayla ekrana yazdıralım.
for sehir in sehirler: print(sehir)
# Bu kod ile ekranımızda 3 tane İSTANBUL 2 tane ANKARA 1'er tane İZMİR, BURSA ve KONYA yazmış olması lazım.
baglanti.close()
Burada tek bir sütun elde etttik. İstediğimiz birkaç sütunu elde etmek için sorgumuzu şu şekilde değiştirip yeniden çalıştırabiliriz.
imlec.execute("SELECT Tarih,Sehir,Gokyuzu FROM HavaDurumu")
Eğer tüm sütunları getirmek istiyorsak hepsini yazmak yerine *
joker karakterini kullanmalıyız. En sık kullanılan joker karakterlerden *
tek başına yazılırsa 'herşey' anlamına gelir. Şimdi sorgumuzu şu şekilde değiştirelim.
imlec.execute("SELECT * FROM HavaDurumu")
Bu sorguyu yürüttüğümüzde tablodaki tüm sütun ve satırların seçilmesi, .fetchall()
ile de hepsini ekrana yazdırmış olmamız gerekir. Fakat binlerce veri içeren bir tablo ile çalıştığınızı düşündüğünüzde hepsini fetch
metodu ile etmek mantıksızdır. Bunu .fetchone()
metodunu kullanarak yapmak mümkün.
.fetchone()
ile tüm sorgu sonucunu çekmeden teker teker sırayla getirebiliriz. Mesela ilk 5 tanesini getirelim.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# Şimdi veri süzecek SELECT'li SQL sorgumuzu yazalıWm. Tüm sütunları seçelim.
imlec.execute("SELECT * FROM HavaDurumu")
# Fetchone ile her yürüttüğümüzde bir sonraki satır gelir.
for satir in range(5): print(imlec.fetchone())
# Bu kod ile ekranımızda tablomuzdaki ilk 5 satırı yazmış olması gerekir.
baglanti.close()
Burada her bir sorguyu tek tek çağırarak döngü ile ekrana bastık. Eğer veritabanındaki satırlardan daha fazla sayıda döngü yaparsanız var olmayan her satır için 'None' değer döner, hata vermez. Verileri sabit artanlı bir şekilde çekeceksek .fetchmany()
kullanılır.
.fetchmany()
ile tüm sorgu sonucundan istediğimiz sayıda sonucu sırayla getirebiliriz. Mesela 3'erli olarak getirelim.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# Şimdi veri süzecek SELECT'li SQL sorgumuzu yazalıWm. Tüm sütunları seçelim.
imlec.execute("SELECT * FROM HavaDurumu")
# Fetchmany ile her yürüttüğümüzde bir sonraki satır dizisi gelir.
print(imlec.fetchmany(3))
print(imlec.fetchmany(3))
# Bu kod ile ekranımızda tablomuzdaki ilk 5 satırı yazmış olması gerekir.
baglanti.close()
Burada da veri tabanındaki satırlardan daha fazla sayıda veri çekerseniz olmayan her dizi için boş dizi ('[ ]') döner, hata vermez.
fetch
metodları ile çektiğiniz veri tiplerini farketmişsinizdir. Bunları bir tablo olarak verelim.
|METOT|DÖNEN VERİ TİPİ|ÖRNEK|SATIR UZUNLUĞUNU GEÇİNCE|
|:-:|:-:|:-:|:-:|
|`.fetchall()`|Liste (List), içindeki her eleman Demet (Tuple)| [('satır1_sutun1','satır1_sutun2'),('satır2_sutun1','satır2_sutun2')] |Boş Liste = [ ]|
|`.fetchmany(n)`|Liste (List), içindeki her eleman Demet (Tuple)|[('satır1_sutun1','satır1_sutun2'),('satır2_sutun1','satır2_sutun2')]
[('satır3_sutun1','satır3_sutun2'),('satır4_sutun1','satır4_sutun2')] | Boş Liste = [ ]|
|`.fetchone()`|Demet (Tuple)|('satır1_sutun1','satır1_sutun2')|None|
Bir veritabanından veri seçecek olan 'temel' SQL sorgusuna 'WHERE' ekleyerek sütundaki verileri süzebiliriz.
Kullanımı SELECT Sutun_Adi FROM Tablo_Adi WHERE Sutun_Adi = Aranacak_Veri
şeklindedir. Burada 'Aranacak_Veri' için karakter dizisi veya sayısal değerler gibi SQLite3'ün kabul ettiği veri tipleri girilir. Operatör olarak '=' yerine diğer sayısal operatörler (<,>,<=,>=,<>,!=) de kullanılabilirler.
NOT: Eğer bir önceki adımda tablo oluşturmayıp veri eklemediyseniz 'TABLO Oluşturma ve Veri Ekleme Satırlarını' kodlarınıza ekleyiniz.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# Şimdi veri süzecek SELECT'li SQL sorgumuzu yazalıWm. Tüm sütunlardan Sehir sütununda İSTANBUL yazanları seçelim.
imlec.execute("SELECT * FROM HavaDurumu WHERE Sehir='İSTANBUL'")
suzulenVeri = imlec.fetchall()
for satir in suzulenVeri: print(satir)
# Bu kod ile ekranımızda tablomuzdaki 'Sehir' sütununda 'İstanbul' yazan satırları süzdük.
baglanti.close()
Tablodaki verileri süzerken SQL sorgumuza 'VE (and), VEYA (or), DEĞİL (not)' gibi mantıksal operatörleri de ekleyebiliriz. Örnek:
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# Şimdi veri süzecek SELECT'li SQL sorgumuzu yazalıWm.
imlec.execute("""SELECT * FROM HavaDurumu
WHERE
Sehir='İSTANBUL'
AND
Sicaklik_Dusuk > 5""")
suzulenVeri = imlec.fetchall()
for satir in suzulenVeri: print(satir)
# Bu kod ile ekranımızda tablomuzdaki 'Sehir' sütununda 'İstanbul' yazan VE 'Sicaklik_Dusuk' degeri 5'ten büyük olan satırları süzdük.
baglanti.close()
LIKE
ifadesini WHERE
ile birlikte kullanarak joker karakter gibi işlemler yapabiliriz. Örnek:
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# Şimdi veri süzecek SELECT'li SQL sorgumuzu yazalıWm.
imlec.execute("""SELECT * FROM HavaDurumu
WHERE
Sicaklik_Yuksek > 11
OR
Sehir LIKE '%K%'""")
suzulenVeri = imlec.fetchall()
for satir in suzulenVeri: print(satir)
# Tablomuzdaki 'Sicaklik_Yuksek' sütununda degeri 11'den büyük olanlar VEYA 'Sehir' içinde 'K' harfi olanları süzdük.
baglanti.close()
Bu sorgulardaki yazım bir zorunluluk olmayıp okunurluğu artırmak için bu şekilde yazılmıştır.
IN
ifadesini WHERE
ile birlikte kullanarak, bir sütunda 'içerenleri' veya 'içermeyenleri' seçebiliriz.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# Şimdi veri süzecek SELECT'li SQL sorgumuzu yazalıWm.
imlec.execute("""SELECT * FROM HavaDurumu
WHERE
Tarih LIKE '%2023%'
AND NOT
Sehir IN ('ANKARA','BURSA')""")
suzulenVeri = imlec.fetchall()
for satir in suzulenVeri: print(satir)
# Tablomuzdaki 'Tarih' sütununda degeri '2023' içerenleri VE 'Sehir' içinde 'ANKARA' ve 'BURSA' OLMAYANLARI süzdük.
baglanti.close()
BETWEEN
ifadesini WHERE
ile birlikte kullanarak, bir sütunda 'arasındakileri' seçebiliriz. Mantıken sayısal değerler için kullanılır.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# Şimdi veri süzecek SELECT'li SQL sorgumuzu yazalıWm.
imlec.execute("""SELECT * FROM HavaDurumu
WHERE
Sicaklik_Dusuk BETWEEN 1 AND 4
AND
Gokyuzu != 'Açık'
""")
suzulenVeri = imlec.fetchall()
for satir in suzulenVeri: print(satir)
# Tablomuzdaki 'Sicaklik_Dusuk' degeri 1 ile 4 arasında olanları VE 'Gokyuzu' değeri 'Açık' OLMAYANLARI süzdük.
baglanti.close()
Bir veriyi süzdükten sonra ona ait değerleri değiştirebiliriz. Bunun için 'temel' olarak UPDATE Tablo_Adi SET Sutun_Adi = Yeni_Veri WHERE Sutun_Adi = Secilen_Sutun
kullanılır. Fakat burada dikkat edilecek nokta süzdüğümüz veri kaç satır ise hepsine bu işlemi uygular.
NOT: Eğer bir önceki adımda tablo oluşturmayıp veri eklemediyseniz 'TABLO Oluşturma ve Veri Ekleme Satırlarını' kodlarınıza ekleyiniz.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# Şimdi veri güncelleyecek UPDATE'li SQL sorgumuzu yazalıWm.
imlec.execute("""UPDATE HavaDurumu
SET
Sicaklik_Dusuk = 9,
Sicaklik_Yuksek = 13,
Gokyuzu = 'Açık'
WHERE
Tarih = '2023.01.04'
AND
Sehir = 'İSTANBUL'
""")
#Şimdi veri tabanını tekrar süzerek okuyalım.
imlec.execute("""SELECT * FROM HavaDurumu WHERE Tarih = '2023.01.04' AND Sehir = 'İSTANBUL'
""")
print(imlec.fetchall())
baglanti.close()
Yukarıda süzdüğümüz veri veritabanımızda bir tane olduğu için sadece onu değiştirdi ama çok satırlı veri süzülseydi hepsini değiştirecekti. Örnek:
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# Şimdi veri güncelleyecek UPDATE'li SQL sorgumuzu yazalıWm.
imlec.execute("""UPDATE HavaDurumu
SET Gokyuzu = 'Çok Bulutlu'
WHERE Tarih = '2023.01.04'
""")
#Şimdi veri tabanını tekrar süzerek okuyalım.
imlec.execute("""SELECT * FROM HavaDurumu WHERE Tarih = '2023.01.04'
""")
for satir in imlec.fetchall(): print(satir)
# 2023.01.04 tarihine sahip tüm satırların Gokyuzu durumu "Çok Bulutlu" olarak değişmiş oldu.
baglanti.close()
Esasında bu değişimler tablomuzda bir PRIMARY KEY
(birincil anahtar) ile yapılır. 'PRIMARY KEY' için en bilinen örnek TC Numaramızdır. TC numaramız benzersiz bir anahtar olarak sadece bize aittir. Veritabanlarında o anahtar ile bize ait verilere başvurmuş oluruz. Başka bir örnekle, e-posta hesaplarımızın isimlerinden sadece bir tane vardır, benzersizdir ve bize ait verilere başvurulmasını sağlar. Bu konuya biraz ileride değinmek zorunda kalacağız.
Şimdiye kadar yaptığımız örneklerde veritabanındaki tablo ve sütun adlarını şema olarak bildiğimiz için rahatça kullanabilidik. Bilmesek bile 'SQLiteDatabaseBrowser' ile açıp içindeki tablo ve verileri görebiliyorduk. Bunlara gerek kalmadan yazdığımız kodlarla da bu bilgileri elde etmenin bir yolu var.
Her sqlite veritabanı dosyasında mevcut olan sqlite_master
isminde veritabanının şemasını tutan bir tablo mevcuttur. Bu tablodan veritabanındaki tablolara erişebliriz. SELECT name FROM sqlite_master WHERE type='table';
ifadesiyle kullanılır. Şimdi veritabanımızdaki tablo isimlerini öğrenelim.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
#Şimdi veri tabanındaki anakayıttan tablo bilgilerini alalım.
imlec.execute("SELECT name FROM sqlite_master WHERE type='table';")
for satir in imlec.fetchall(): print(satir)
# Bir tane tablomuz olduğu için sadece onu gösterir. Fakat birkaç tablomuz mevcut olsaydı hepsini gösterirdi.
baglanti.close()
Tablo isimlerini öğrendiğimize göre şimdi de sütun isimlerini öğrenelim. Sütun isimlerini öğrenmek için genelde kullanılan iki yöntem vadır.
.description
bir 'SELECT' içeren sorgunun özniteliğidir (Nesne yaklaşımlı programlamadan hatırlayalım). Bu öznitelik ile yapılan son sorgunun sütun adları alınır. Farketmemiz gereken önemli nokta .description
için bir imleç ve 'SELECT' ile sorgu yapmanın gerekliliğidir. Örnek:
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
#Şimdi veri tabanında sorgu yapalım.
imlec.execute("SELECT * FROM HavaDurumu")
#Bir imleçle 'SELECT' içeren bir sorgu yaptık. Artık .description özniteliğine başvurabiliriz.
tablolar = imlec.description
# Şimdi bu tablolar sırayla ekrana yazdıralım
for tablo in tablolar: print(tablo)
baglanti.close()
.description
özniteliği her zaman 7 elemanlı bir TUPLE
demeti döndürür. Her sütun başlığı 7 elemanlı demetin ilk elemanıdır. Bu sebeple ekrana yazdırırken dilimleyerek yazdıralım.
for tablo in tablolar: print(tablo[0])
.row_factory
ise bir sqlite bağlantısının özniteliğidir. Bu özniteliği, sqlite3'ün .row
adlı özniteliği ile kullanarak tablomuzdaki her satırı DICTIONARY
(sözlük) formatında bir 'nesne'ye çeviririz. Bu 'nesne'nin anahtar (.keys()) değeri sütun adları olurken, değerleri ise satırımızdaki verilerdir ve LIST
tipine çevrilebilir. Tabi yine bunun için de bir tabloya bağlanıp 'SELECT' ile sorgu yapmamız gerekliliktir.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
# Bağlantımızın row_factory özniteliğini sqlite3'ün row özniteliği üzerinden bir nesne olarak atayalım (Dict'e benzeyen bir nesne).
baglanti.row_factory = sqlite3.Row
# Varsayılan olarak '.row_factory' özniteliği ile sadece satırdaki değerler 'tuple' olarak gelir. Bir önceki örneği hatırlayınız.
# Bunun yerine satırdaki verileri ve sütun başlıklarını sutun_adlari ve satirdaki_veriler olarak dict'e benzer bir 'nesne' olarak elde etmek için:
# sqlite3'ün '.Row' özniteliğine atadık. Artık her sorgumuzu '.Row' şeklinde ele alabileceğiz.
# Burada her satırı dict' benzer şekilde ele almamızı sağlayan '.Row' özniteliğidir.
# Neden 'dict'e benzer diyoruz da 'dict' diyemiyoruz. Çünkü 'dict'e ait '.get()', '.items()' gibi metotları kullanamazsınız.
# Çünkü dict değil, benzer bir 'nesne'.
imlec = baglanti.cursor()
imlec.execute("SELECT * FROM HavaDurumu")
# Artık fetch ile sadece bir satır okumamız yeterli, çünkü her satır dict tipinde. Anahtar değerleri ise sütun adlarımız.
satir = imlec.fetchone()
# Şimdi bu dict'in anahtarlarını .keys() ile ekrana yazdıralım.
print(satir.keys())
baglanti.close()
Burada print (satir.keys())
ile sütun adlarını getirdik. Sadece print(satir)
yazarsak belleğimizdeki bir nesnenin adresi gelir. Fakat print(list(satir))
yazarsak satırımızdaki değerleri (values) liste olarak görebiliriz. Şimdi alta yazarak deneyelim.
PRIMARY KEY
ile sileceğimiz veriyi benzersiz değerine göre süzerek doğru işlem yapmış oluruz. Ayrıca PRIMARY KEY
ile alanın boş olamayacağını NOT NULL
sağlamış olduk.
Bu işlem INSERT
işleminin bir varyasyonu olup verileri süzme ifadesi eklemenize gerek kalmadan PRIMARY KEY
mantığıyla başvurulan satırın aynısı anahtarın satırındaki tüm verileri değiştirmenize yarar.
REPLACE INTO Tablo_Adi (Primary_Key_Sutun_Adi, Diger_Sutun_Adi,...) VALUES (Primary_Key,Veri1,...)
şeklinde kullanılır. Örnek:
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# Şimdi veri güncelleyecek UPDATE'li SQL sorgumuzu yazalıWm.
imlec.execute("""REPLACE INTO HavaDurumu (Tarih,Sehir,Sicaklik_Dusuk,Sicaklik_Yuksek,Gokyuzu)
VALUES ('2023.01.07','KONYA',5,13,'Çok Bulutlu')
""")
#Şimdi veri tabanını tekrar süzerek okuyalım.
imlec.execute("""SELECT * FROM HavaDurumu""")
for satir in imlec.fetchall(): print(satir)
baglanti.close()
.executemany(sorgu,dongulenebilir_parametre)
ile veri listemizi for döngüsü kullanmadan sql sorgusuna iliştirerek tabloya ekleyebiliriz. Bu metot esasında .execute(sorgu,parametre)
metodunu içerir. Fakat .executemany(sorgu,dongulenebilir_parametre)
ile veri listemiz otomatik döngüye alınır ve listemizdeki her bir veri sql sorgusuna iliştirilerek yürütülür. Hemen örnek verelim:
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
#TABLO oluşturma
tabloAdi = "HavaDurumu"
sutunlar= ["Tarih TEXT NOT NULL","Sehir TEXT NOT NULL"," Sicaklik_Dusuk INTEGER NOT NULL","Sicaklik_Yuksek INTEGER NOT NULL","Gokyuzu TEXT"]
olustur = f"CREATE TABLE IF NOT EXISTS {tabloAdi} ({','.join(sutunlar)})"
imlec.execute(olustur) #İmleç ile SQL Sorgumuzu veritabanımızda yürüttük ve tablo oluşturduk.
#Şimdi ekleme sorgumuzu dinamik bir şekilde (VALUES'den sonra sütun sayısı kadar '?' koyarak) yazalım.
ekle = f"INSERT INTO {tabloAdi} (Tarih,Sehir,Sicaklik_Dusuk,Sicaklik_Yuksek,Gokyuzu) VALUES (?,?,?,?,?)"
#Şimdi tablomuza ekleyeceğimiz veri setini tuple'lardan oluşan bir liste olarak sorgumuzdaki tablo sırasına göre yazalım.
veriler = [("2023.01.04","İZMİR",9,13,"Bulutlu"),
("2023.01.16","BURSA",5,11,"Parçalı Bulutlu"),
("2023.01.12","KONYA",1,13,"Açık")]
# Şimdi döngü kullanmadan ve imleç aracılığıyla verileri ekleyelim.
imlec.executemany(ekle,veriler)
baglanti.close()
.execute()
veya .executemany()
ile sadece bir sql sorgusu yürütebilirsiniz. Yani hem tablo oluşturma hem de veri ekleme sql sorgularınızı tek bir string'e atayıp onu .execute(sorgu)
ile yürütmemezsiniz. Bu metodlar sadece bir sql sorgusu içeren parametreleri yürütürler.
.executescript()
metodu ile çoklu sql sorgusunu içeren bir ifadeyi tek satırda yürütebilirsiniz.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
# Çoklu SQL sorgumuzu yazalım. Sorgumuzu bir string'e atayalım. SQL İfadeleri sonunda ';' koymayı unutmayınız!
cokluSorgu =""" CREATE TABLE IF NOT EXISTS HavaDurumu (
Tarih TEXT NOT NULL,
Sehir TEXT NOT NULL,
Sicaklik_Dusuk INTEGER NOT NULL,
Sicaklik_Yuksek INTEGER NOT NULL,
Gokyuzu TEXT
);
INSERT INTO HavaDurumu (Tarih,Sehir,Sicaklik_Dusuk,Sicaklik_Yuksek,Gokyuzu) VALUES
("2023.01.01","SAMSUN",10,13,"Çok Bulutlu"),
("2023.01.02","ANTALYA",13,16,"Açık"),
("2023.01.03","GAZİANTEP",6,10,"Bulutlu"),
("2023.01.04","ERZURUM",-4,4,"Çok Bulutlu"),
("2023.01.05","DİYARBAKIR",8,12,"Parçalı Bulutlu");
"""
# Şimdi çoklu sql sorgusu içeren ifademizi 'executescript' ile veritabanımızda imleç aracılığıyla yürütelim.
imlec.executescript(cokluSorgu)
baglanti.close()
.executescript()
metodunu kullanırken dikkat edeceğiniz nokta, parametre olarak verdiğiniz ifadenin 'string' tipinde olmasıdır.
.executescript()
metodu ile birçok sorgudan oluşan sql dosyasını da yürütebilirsiniz. Örnek sql dosyası içeriği.
Yukarıdaki içeriği kopyalayıp not defteri ile boş bir deftere yapıştırıp 'Farklı Kaydet'e tıklayınız. Kayıt türünü 'Tüm Dosyalar' seçtikten sonra 'sqlDosyasi.sql' adıyla çalıştırdığınız Python dosyasının bulunduğu dizine kaydediniz. Ardından şu şekilde python'da yürütünüz.
import sqlite3
with sqlite3.connect('havadurumu.sqlite') as baglanti:
imlec = baglanti.cursor() #İmleç oluşturduk.
#SQL dosyamızı açalım ve okuyup bir değişkene atayalım.
with open("sqlDosyasi.sql","r",encoding="utf-8") as dosya:
sql = dosya.read()
# Şimdi çoklu sql sorgusu içeren dosyamızın içeriğini veritabanımızda imleç aracılığıyla yürütelim.
imlec.executescript(sql)
baglanti.close()
Burada unutulmaması gereken veritabanlarını with
deyimi ile kullanırken yaptığınız işlemlerin otomatik dosyaya uygulanmasıdır. Eğer with
deyimi ile kullanmıyorsanız sql dosya içeriğinizin sonuna COMMIT;
yazarsanız yaptığınız işlemler veritabanına uygulanır.
Eklenecek...
Darnit, J. (2017). Exact Instructions Challenge PB&J Classroom Friendly. Erişim Adresi: https://www.youtube.com/watch?v=FN2RM-CHkuI
GeeksForGeeks, (2022). Algorithms. Erişim Adresi: https://www.geeksforgeeks.org/fundamentals-of-algorithms/
Kara, A. (2020). Algoritma ve Çeşitleri. Erişim Adresi: https://www.datasciencearth.com/algoritma-ve-cesitleri/
Karaçay, T. (2015). C Programlamanın Temelleri, Abaküs, İstanbul, Eylül 2015. isbn:978-6059129183. Erişim Adresi: http://www.baskent.edu.tr/~tkaracay/etudio/ders/prg/c/recursive.pdf
Kaya, E. E. (2021). Fibonacci Dizisinden Altın Orana. Erişim Adresi: https://bilimgenc.tubitak.gov.tr/makale/fibonacci-dizisinden-altin-orana
Slashdot.org (2013). Interviews: Guido van Rossum Answers Your Questionn. Erişim Adresi: https://developers.slashdot.org/story/13/08/25/2115204/interviews-guido-van-rossum-answers-your-questions
Şeker, S. E. (2009). Arama Algoritmaları. Erişim Adresi: https://bilgisayarkavramlari.com/2009/11/23/arama-algoritmalari-search-algorithms/
Torun, C. (2021). Algoritma Nedir, Nerelerde Kullanılır? Erişim Adresi: https://bilimgenc.tubitak.gov.tr/algoritma-nedir
Zaczyński, B. (2020). Bitwise Operators in Python. Erişim Adresi: https://realpython.com/python-bitwise-operators/