# Operators
2**3 –> 2 üzeri 3
22%8 –> 22 mod 8
22 / 8 –> 22 bölü 8 (noktalı sayı)
22 // 8 –> 22 bölü 8 (tam sayı)
3 * 5 –> 3 çarpı 5
5 – 2 –> 5 eksi 2
5 + 2 –> 10
Python’da operation sırasıyla **,*,/,//,% şeklindedir. Parantez içerisine alarak önceliklendirmeyi yönetebilirsiniz
(2+3)*5
Python’da yanlış bir şey yazarsanız bunu parse etmesi mümkün olmadığından Syntax error alırız.
# Data Types
integer : -2 , -1 , 0 , 1
Float : -1.24, -1.0 , 0.0, 0.1,1.2
String : ‘a’, ‘aa’,”
Bazı operetorleri stringlerle beraber kullanabiliriz. Bunlardan + operandı sadece stringle, * operandı ise sadece integerla kullanılabilir.
‘gokhan’+’kesici’ (doğru) , ‘gokhan’*kesici (yanlış)
‘gokhan’ * 2 (doğru), ‘gokhan’ * ‘2’ (yanlış)
# Variable
Değişkene değer ataması = operatörüyle gerçekleştirilir. Değişkenleri bir kutu gibi düşünüp bu kutuya bir isim verip içerisine datanızı yazabilirsiniz
a=2
b=2
a*b
Burada da değişkenler atanan data değerin tipini otomatik alır. Python’da bunu belirtmeye gerek yoktur.
Değişken isimlerinde de bazı önemli kurallar vardır. Örneğin bir değişken adı rakamla başlayamaz gibi. Detay bilgidir bunlar, bu şekilde pek çoğumuz zaten değişken isimlendirmesi yapmıyoruz.
Değişken isimlerinde bilinmesi gereken tek şey büyük küçük yazım önemlidir. Yani case-sensetive’dir değişken adları. a=2 ile A=2 farklı şeylerdir.
# Data tipi değiştirme
Bir sayıyı string’e dönüştürme, bir kesirli sayıyı tam sayıya dönüştürme işlemleri için str(), int(), float() fonksiyonlarını kullanırız.
str(2) –> ‘2’
int(‘2’) –> 2
int(2.2) –> 2
float(2) –> 2.0
# Boolean Values
Boolean bir data tipidir ve 2 çeşit değeri vardır. True veya False. True yerine true yazmak doğru bir yazım şekli değildir. Belirtiği gibi yazılmalıdır.
Değişkene bir atama yapılacaksa aşağıdaki gibi gerçekleştirilebilir.
a = True
# Comparision Operators
2 == 2 –> 2 , 2 ye eşit mi (True)
True != False –> True, False değilse (True)
2 < 1 –> 2, 1 den küçük mü (False)
3 > 2 –> 3, 2 ‘den büyük mü (True)
4 >= 4 –> 4, 4’den büyük veya eşit mi (True)
4 <= 4 –> 4, 4’den küçük veya eşit mi (True)
a is b –> a ile b aynı objeler midir?
# Boolean Operators
True and True –> True
True and False –> False
True or False –> True
True or True –> True
not True –> False
# Augmented Assigment Operator
sayi = 45 sayi += 1 sayi -= 1 sayi *= 2 sayi /=5
# Python Blocks
Python’da her satır blok içerisindedir. Blocklar indentation ile başlar ve indentation 0 oluncaya dek devam ederiz. Bu yüzden ki indendation python’da çok önemlidir.
if ad == 'gokhan': print('Dogru') else: print('Yanlis')
# if / else / elif statements
if ne zamaki condition True ise o zaman çalışır. Eğer koşul False ise if bloğu pas geçilir. True ise : ifadesinin sonrasındaki kodu çalıştırır.
else ne zamanki if pas geçerse yani if bloğu False ise o zaman çalışır.
elif , if eğer True değilse else gelecekken , else içinde koşul yazmak istendiğinde else ve if iç içe açmak yerine tek seferde yazmak yerine kullanabiliriz. e
if ad == gokhan: print('gokhan')' elif soyad == kesici: print('kesici ailesi') else: print('seni tanimiyorum')
# while loop statement
while, True koşulu bozuluncaya kadar bloğundaki kodu çalıştırır.
sayac = 1 while sayac != 5: print(sayac) sayac = sayac + 1
# break statement
while döngüsünden hızlıca çıkmanın yollarından biri break ‘dir.
sayac = 1 while True: if sayac == 5: break print(sayac) sayac = sayac+1
# continue statement
loop içerisinde kullanılır. continue ifadesi ile karşılaşıldığında hemen loop’a döner.
sayac = 1 while sayac < 5: sayac = sayac + 1 if (sayac%2) == 0: continue print(sayac)
# pass statement
Genellikle daha sonradan doldurulacak kod parçaları için kullanılır bu ifade. Özellikle fonksiyon tanımları yapılırken pass yazılır. Hiç bir işlem yapma anlamındadır.
While döngülerinde ise kullanıldığını görebilirsiz.
sayac = 1 while sayac < 5: pass sayac +=1
def myfunc(): pass
# True ve False yerine geçen değerler
Koşullarda bazı değerler false bazı değerler true anlamına gelir.
” –> False
1 –> True
0 –> False
# for and range loop statement
Diyelim ki bir döngüyü ne kadar çalıştıracağınızı biliyorsunuz. Bu durumda for ve range ‘i birlikte kullanabilirsiniz.
Bunun için for , bir değişken adı, in kelimesi, range metodu kullanılır.
for i in range(3): print(i)
# import module
Python’da herhangi bir kütüphaneyi, modülü kullanmak için onu import etmek gerekiyor.
import random for i in range(5): print(random.randint(1,10))
Bir çok modülü yan yana yazarakta import edebiliriz.
import random,sys,os,math
# from import statement
Tüm modülü değilde sadece modül içerisinden bir kısmını import etmek istiyorsanız from import kullanılabilir.
from random import randint for i in range(3): print(randint(1,10))
import komutunu bu şekilde kullandığımızda fark ettiyseniz eğer randint metodunu tek başına kullandık. random.randint() şeklinde değil. Bunun sebebi sadece ilgili kısmı import ettik. Artık python sadece randint metodunu biliyor, random modülünü değil.
# sys.exit()
Bir programı sonlandırmak için sys.exit() metodu kullanılır.
from random import * for i in range(3): a=randint(1,10) if a == 4: import sys sys.exit() print(a)
# Functions
Fonksiyon oluşturmak için aşağıdaki gibi bir tanım gerekir.
def merhaba(): print('merhaba dunya')
Daha sonrasında bu fonksiyonu merhaba() şeklinde çağırabiliriz.
Fonksiyonlar parametre de alabilirler
def merhaba(ad): print('merhaba', ad) merhaba('gokhan')
# Function Return value
Fonksiyonların sonucunda bir değer oluşturup bunun sonucunu dönebilir ve bir değişkene atayabilirsiniz.
def adBul(soyad): if soyad == 'kesici': return 'gokhan' else: return 'bulunamadi' print('Adim', adBul('gokhan'))
# Function Return None value
Bir değer dönmeyen fonksiyonlar NoneType tipinde None değerini dönerler. Diğer programlama dillerindeki null gibi düşünebilirsiniz.
Örneğin print() fonksiyonu bir return değeri dönmez. Ancak tüm fonksiyonlar için pythonda bir return değeri hesaplandığından bu tarz fonksiyonlar için none değerini görebilirsiniz.
adim = print('gokhan') None == adim
# Argümanlar
Fonksiyonlar içerisindeki argümanlar fonksiyonda tanımındaki sıra ile parse edilirler.
print('gokhan', 'kesici', sep=',')
# Local / Global Scope
Bir fonksiyon içerisindeki değişkenler local scope, dışındakiler ise global scope’dur.
a = 2 def goster(): a = 3 print(a) print(a) goster()
Local scope’dan çıkıldığında local variable’lar yok olurlar. Global scope ise program başladığında 1 defa oluşur. Program kapanana variable’lar yok olmaz.
Global scope’daki bir kod local scope’daki bir değişkene erişemezken, local scope’daki bir değişken global scope daki bir değişkene erişebilir. Aşağıdaki koddaki print(b) için hata alacaksınız.
a = 2 def goster(): print(a) b=3 goster() print(b)
Local scope’lar birbirinin değişkenlerine erişemezler.
Local scope ve Global scope isimleri aynı olabilirler, python buna kızmamaktadır.
Bir fonksiyon içerisindeki değişkene global ifadesini getirseniz ifade değişken global olmuş olur.
a = 2 def goster(): global a a=3 goster() print(a)
Eğer bir programda local değişken fonksiyon içerisinde önceden refere edilip aşağıdaki gibi çağrılırsa hata alır. Fonksiyon yazılmış ancak çağrılmadıysa hata almaz. Çünkü def runtime’da değerlendirilir, compile time’da değil.
def goster(): print(a) a=2 a=3 goster()
İç içe fonksiyonların kullanımda da birbirine göre global / local scope ilişkisini kurabilirsiniz.
a = 100 def func1(): a = 99 def func2(): print(a) func2() func1() # 99
# Function Assigment
Python’da fonksiyonlarda birer objedir. Ve yeni bir fonksiyon adına assign edilebilirler.
def goster(): print("gokhan") test = goster test()
# Factory Functions
Bir fonksiyon içerisinde kullanılan başka bir fonksiyonunun return değer olarak verildiği fonksiyonlardır.
def fonksiyon1(a): def fonksiyon2(b): return a*b return fonksiyon2 c = fonksiyon1(2) print(c(5)) # 10
# lambda
Python’da def haricinde bir diğer fonksiyon oluşturma ifadesi de lambda’dır.
Isimsiz fonksiyonlar olması sebebiyle anonymous fonksiyon olarakta bilinir. Lambda fonksiyonlarda return değerini de kullanmayız.
a = lambda y: 2*y print(a(3)) # 6
Kullanımı yukarıda da görüldüğü üzere aşağıdaki gibidir. Tek satırlık ifadelerdir ve tek bir komutu çalıştırırlar.
lambda arguments: expression
Herhangi bir parametre almak zorunda değildir.
a = lambda: 2 print(a()) # 2
# Exception Handling
Bir hata aldığınızda normalde program crash alır. Hatayı handle etmek için ise try / except kullanırız. try bloğu hata aldığında code except’e geçer.
def bol(a): return 6//a try: print(bol(0)) print(bol(2)) except ZeroDivisionError: print('Sifira bolemezsin') print(bol(3))
Yukarıdaki örnekte 6 0’a bölünmez ve except kısmına atlanır ve except’de girilmiş print çalışır. bol(2) fonksiyonu try bloğu hata aldığı için artık çalışmaz. except’den sonra bol(3) fonksiyonuyla devam edilir. Yani try hata aldıktan sonra geriye dönüp kaldığı yerden devam etmez.
# List Data Type
İçerisinde birden fazla sırasıyla değer girilmiş yapıya list denilir.
Liste içerisindeki item’ler virgülle ayrılır ve daha önceden yukarıda öğrendiğimiz data tiplerinden biri olabilirler.
Liste içerisindeki her bir item sırasıyla 0…n şeklinde tam sayılarla index’lenir. Değişkene atanan değer bir liste ise bu index değeriyle listedeki ilgili item çağrılabilir.
ad = [ 'gokhan', 'mehmet', 'yusuf' ] ad [0]
İç içe listelerde yazılabilir, negatif indeksler yazılabilir.
ad = [[ 'gokhan', 'mehmet', 'yusuf' ],['kesici']] ad [0][-2]
Liste içerisinden tek bir kısmı getirmek yerine bir parçayı da getirebiliriz. Parçaları : ile belirtiriz. sol kısımda kalan kısım nerede başladığı sağ kısımda kalan ise nerede bittiğidir. Nerede bittiği kapsam dışıdır. Dahil edilmez.
ad = [ ‘gokhan’, ‘mehmet’, ‘yusuf’ ]
ad [0:2] –> [‘gokhan’,’mehmet’]
ad[0:-1] –> [‘gokhan’,’mehmet’]
ad[:] –> [ ‘gokhan’, ‘mehmet’, ‘yusuf’ ]
ad[:2] –> [‘gokhan’,’mehmet’]
ad[2:] –> [‘yusuf”]
len() fonksiyonu listeler için listedeki item sayısını döner
len (ad) –> 3
Liste içerisindeki değerleri index ‘ler aracılığıyla değişebilirsiniz
ad [1] = ‘metin’
İki listeyi birleştirmek için + operatörünü, listenin replikasını oluşturmak için * operatörünü kullanabiliriz.
[ ‘gokhan’]+ [‘kesici’] –> [‘gokhan’, ‘kesici’]
[‘gokhan’] * 2 –> [‘gokhan’, ‘gokhan’]
Listeden bir değeri kaldırmak için del ifadesini kullanabiliriz
ad = [ 'gokhan', 'mehmet', 'yusuf' ] del ad[2]
for döngüsüyle de listeler kullanılabilir.
for in in ['gokhan',1,2,3] print(i)
Bir değer listede mi değil mi aramak için in veya not in operatörlerini kullanabilirsiniz.
'gokhan' in ['gokhan', 'mehmet'] True
Bir listenin itemlerini sırasıyla başka değişkenlere aktarmak istersek bunun için kısayola mevcut
sayilar = [0,1,2,3] sifir,bir,iki,uc = sayilar
# Methods
Python’da her data tipinin kendi metotları bulunur.
ad = [‘gokhan’,’mehmet’]
ad.index(‘gokhan’)
ad.append(‘yusuf’)
ad.insert(2,’metin’)
ad.remove(‘metin’)
# String Data Type
String’lerde list data tipine benzerdir. Farklı olarak string’deki her karakter string’in bir item’idir.
ad = 'gokhan' ad [0] g in ad
String ile list’in en önemli farklı list de değer değiştirilebilir, kaldırabilir, eklenebilirken, string de kesinlikle item değeri değiştirilemez.
Yani şunu yapamazsınız:
ad [0] = 'g'
# Tuple Data Type
Tuple bir data tipidir. Listeden görünürde ilk farkı köşeli parantez yerine, normal parantez ( ) kullanmasıdır.
ad = ( 'gokhan', 'mehmet')
Tuple’da string gibi item değeri değiştirilemezdir. Hatta hatta eğer tupple item sayınız 1 tane ise bunu python string olarak görecektir. Eğer virgül belirtirseniz ikinci elemanınız yoksa tuple olarak görecektir. Değiştirilemez bir liste istiyorsanız tuple kullanabilirsiniz.
type((‘gokhan’)) –> string
type((‘gokhan’,)) –> tuple
# Tuple – List Converting
Tuple ile List data tiplerini hızlıca birbirine dönüştürmek için list() ve tuple() fonksiyonlarını kullanabilirsiniz.
tuple(list(('gokhan','mehmet'))) list('gokhan') tuple('gokhan')
# Dictionary Data Type
Dictionary data tipi key-value şeklindedir. key ‘ler bir değerle eşleştirilir. Listelerdeki gibi index’ler yine vardır. Ancak index bir integer değil, key’dir. Dictionary data tipinde süslü parantez kullanılır.
kisisel = { 'ad' : 'gokhan', 'soyad':'kesici' } kisisel['ad']
Dictionary’de listede olduğu gibi item’lerin sıralı olmasının bir önemi yoktur. İlk item diye bir kavram yoktur yani. O yüzden dir ki farklı iki değişken farklı sırayla yazılsa da aslında aynı şeylerdir.
a = { 'ad': 'gokhan', 'soyad' :'kesici'} b = { 'soyad':'kesici', 'ad':'gokhan'} a == b
Dictionary data tipinde 3 önemli metot bulunuyor. Bunlar keys(), values(), items(). Bu 3 metot’da farklı data tiplerinde dönerler. Listeye benzerler ama gerçek liste değildirler ve değiştirilemezler.
Bu metotlar for döngüsü içerisinde kullanılabilir.
for i in kisisel.keys(): print(i)
Benzer şekilde in , in not operatörleri dictionary içinde kullanılabilir.
'gokhan' in kisisel.values()
Bir key’in değerini çekmenin bir diğer yöntemi get() metotunu kullanmak. Ancak bu metot, 2 parametrede alabilir. Biri key, diğeri bulamadığunda gösterdiği değer.
kisisel.get('ad') kisisel.get('boy', 'girilmemis)
Dictionary içerisinde eğerki olmayan bir key varsa buna setdefault() metoduyla varsayılan bir değer atayabilirsiniz. Daha sonradan tekrar bir değer atamak isterseniz daha önceden key olacağından bu işlemi gerçekleştirmeyecektir. Örneğin aşağıda a değerine baktığınızda meslek olarak mühendisi göreceksiniz, bilgisayar mühendisini değil.
a = { 'ad':'gokhan', 'soyad':'kesici'} a.setdefault('meslek','muhendis') a.setdefault('meslek','bilgisayar muhendisi')
# Set Data Type
Matematikteki küme yapısını sağlayan data tipidir. Kümeler de immutable yani değiştirilemez objelerdir.
a = {1,2,3,4,5,6} b = {4,5,6}
Matematikteki küme operatörlerini python’da da kullanabilirsiniz
a & b a | b a - b a > b a ^ b
# pprint modülü
Bu modül çıktınızı daha güzel bir formatta sunar. Özellikle dictionary, list gibi data structure ‘ları ile çalışıyorsanız bu modülü kullanmak faydalı olacaktır.
import pprint a = {'ad':'gokhan','soyad':'kesici', 'okul':'iu','meslek':'muhendis'} pprint.pprint(a, width=1)
# String Literal
Python’da stringleri tek tırnak veya çift tırnak içerisinde kullanabilirsiniz.
Bu iki karakteri kullanmanız gerekiyorsa, ‘ şeklinde escape karakteriyle kullanabilirsiniz.
cumle = 'gokhan'in kitabi'
# Raw String
String’in ham halini yani escape karakterleri de gösteren halidir. String’in başına r harfi getirilerek raw yapılabilir.
cumle = r’gokhan’in kitabi’
# Unicode String
Unicode karakterleri kullanmak için string’in başına u harfi getirilir.
ad = u'g\u0222khan'
# Multiline String
\n ile çok satırlı string’ler oluşturulabilir. Python ‘da bunu yapabilmenin diğer başka ve daha kolay yöntemi üç tek tırnak (”’) kullanmak.
print('''sayin gokhan kesici ''' )
# Multiline Comment
Python’da # işaretiyle bir satırlık yorumlar oluşturulabiliyor. Çok satırlık yorum ise üç çift tırnak (“””) kullanmak gerekir..
"""Bu bir yorum satiridir """
# in/not in operators with String
in ve not in operatörü listelerde olduğu gibi string’ler içerisinde de kullanılabilir.
'gokhan' in 'gokhan kesici' True
# String Concatenate
Stringleri birleştirmek için + işareti kullanabilirsiniz.
fullname = 'gokhan' + 'kesici'
+ işareti kullanmadan stringleri yan yana yazsanızda python otomatik olarak iki string’i birleştirecektir.
fullname = 'gokhan' 'kesici'
# String methods
upper() metodu verilen string’i büyük harfe, lower metodu verilen string’i küçük harflere dönüştürür.
'gokhan'.upper() 'GOKHAN'.lower()
isupper(), islower() metotları büyük küçük mü diye stringleri kontrol eder ve boolean bir değer döner.
'gokhan'.islower() 'GOKHAN'.isupper()
isalpha, isalnum, isdecimal isspace, gibi metotlarda sırasıyla sadece harf mi, sadece harf ve sayi mi, sadece sayi mi, sadece boşluk mu gibi kontrolleri sağlar.
'gokhan'.isalpha() '3'.isdecimal()
startswith() ve endswith() metotlarıyla şu string ile başlıyor şu stringle bitiyor mu sorularına yanıt alırsınız.
'gokhan kesici'.startswith('gokhan') 'gokhan kesici'.endswith('kesici')
join() metodunu arasına katmak gibi düşünebilirsiniz. Özellikle liste string ifadelerle kullanılır. ','.join(['gokhan','kesici'])
split() metodu bir string’i böler ve liste haline dönüştürür. Bölünecek string verilmezse default olarak boşlukla böler.
'gokhan,kesici'.split(',')
rjust(), ljust(), center() metotları office programlarından aşina olduğumuz string’i yaslamak için kullanılır. Genişlik değeri içerisinde belirtilecek sayı kadardır.
'gokhan'.rjust(7) 'gokhan'.ljust(7) 'gokhan'.center(8)
# pyperclip module
Sıklıkla kullandığımız clipboard fonksiyonlarını sağlayan bir modüldür. copy() fonksiyonu kopyalama, paste() fonksiyonu ise yapıştırma işlevi görür.
Bu modül python ile birlikte gelmediği için ayrıca indirip yüklemek gerekir.
import pyperclip pyperclip.copy('merhaba') pyperclip.paste()
# Regex
Python’da regex işlemleri gerçekleştirebileceğiniz modülün adı re.
Regex pattern belirlemek için re.compile() metodu kullanılır.
Regex search için ise search() metodu kullanılır. Search metodu match tipinde bir obje döner.
Regex match objesinin group() metodu match eden ifadeyi döner.
import re numara = re.compile(r'\d\d\d\d') ara = numara.search('Bu yil 16000 tane aciklik yayinlandi') print(ara.group())
Regex pattern’inizde regex’lerde sık kullanılan gruplandırma işlemi python’da da yapılabilir, bunlardan herhangi birini seçebilirsiniz.
import re numara = re.compile(r'(\d\d\d\d)-(\d\d\d\d)') ara = numara.search('2018-2019 egitim sezonu') print(ara.group(2))
Tüm grupları bir seferde alabilmek için groups() metodunu kullanabiliriz. Bir tuple döner ve bunu değişkenlere atayabiliriz.
import re numara = re.compile(r'(\d\d\d\d)-(\d\d\d\d)') ara = numara.search('2018-2019 egitim sezonu') a,b = ara.groups() print(a) print(b)
search() metodu ilk eşleşeni getirir. Ancak siz tüm eşleşenleri görüntülemek isteyebilirsiniz. Bu durumda findall() metodunu kullanabilirsiniz. findall() metodu list tipinde bir değer döner.
import re numara = re.compile(r'(\d\d\d\d)') ara = numara.findall('2018-2019 egitim sezonu') for i in ara: print(i)
Eğer regex’i ignorecase yapmak istersek re.I parametresini belirtmek yeterli.
import re numara = re.compile(r'egitim', re.I) ara = numara.findall('2018-2019 EGitim sezonu') for i in ara: print(i)
Üç tırnak’ı çok satırlı stringler oluşturmak için kullanıyorduk. Benzer şeyi regex’ler içinde kullanabiliriz. Bunun için re.VERBOSE parametresini vermek gerekir.
import re numara = re.compile(r'''2018| 2019''',re.VERBOSE) ara = numara.findall('2018-2019 EGitim sezonu') for i in ara: print(i)
re.compile() metodu sadece pattern dışında 1 parametre aldığı için hem ignore case hemde verbose ‘u aktif etmek isterseniz yapmanız gereken bunları pipe ile or’lamak.
import re numara = re.compile(r'''2018| egitim''',re.VERBOSE|re.IGNORECASE) ara = numara.findall('2018-2019 EGitim sezonu') for i in ara: print(i)
.* ifadesi regex’de \n görünceye kadar devam eder. siz .* ‘da \n görsemde devam et devam etmek istiyorsanız DOTALL() metodu kullanılır.
import re numara = re.compile(r'.*',re.DOTALL) ara = numara.search('2018-2019 \n EGitim sezonu') print(ara.group())
Regex ile bulunanları başkalarıyla değiştirmek yani replace yapmak isteyebilirsiniz. Bunun için sub() metodunu kullanabilrsiniz.
import re numara = re.compile(r'100') sonuc=numara.sub('99','100 esittir 100') print(sonuc)
# File Operations
Dosya işlemlerinde en önemli şeylerden biri dosyanın path’ini doğru verebilmek. İşletim sistemlerinde path belirtirken backslash(\), forwardslash (/) şeklinde farklı kullanımı olabileceğinden doğru path’i bilmiyorsanız os.path.join() kullanabilirsiniz.
import os path = os.path.join('usr','bin') print(path)
current working directory ile çalışmak için os.getcwd() metodunu kullanabilirsiniz.
import os cwd = os.getcwd() print(cwd)
Bulunduğunuz directory’i değiştirmek için os.chdir() metodu kullanılabilirsiniz.
import os cwd = os.getcwd() print(cwd) os.chdir('..') print(os.getcwd())
Dizin oluşturmak için os.makedirs() metodunu kullanabilirsiniz.
import os cwd = os.getcwd() os.chdir('..') os.makedirs('fotograflar')
Relative path’i absolute path’e dönüştürmek için os.path.abspath(), tam tersi için ise relpath() kullanabiliriz.. os.path.isabs() metodu ise path’in absoulute olmadığını söyler.
import os print(os.path.isabs(os.path.abspath('..'))) print(os.path.relpath('/Users'))
Bir full path’den dizin path’ni bulmak için os.path.dirname(), dizin altındaki dosya adını bulmak için ise os.path.basename() metotlarını kullanabiliriz. Her ikisini de tek seferde alabilmek için daha güzel bir yöntem ise split() metodu kullanılabilir. split tuple tipinde dönüş yapacaktır iki değeri de.
import os path=r'/home/gokhan/kesici.txt' splitpath = os.path.split(path) print(os.path.dirname(path)) print(os.path.basename(path)) for i in splitpath: print(i)
Bir string’i separatörlere göre ayırabilirsiniz. Bir path değerini sistemin path separatörüyle os.path.sep değişkenini vererekte ayırabilirsiniz.
import os path=r'/home/gokhan/kesici.txt' for i in path.split(os.path.sep): print(i)
Bir dosyanın veya dizinin boyunu öğrenmek için os.path.getsize(), bir dizinin içeriğini listelemek için ise os.listdir() kullanılabilir.
import os path=r'/Users/gokhan/kesici/dosya1.txt' print(os.path.getsize(path)) print(os.path.getsize(os.path.dirname(path))) for i in os.listdir(os.path.dirname(path)): print(i)
Bir path ile çalışmanın sıkıntısı yanlış bir şey yaptığınızda programınızın crash olabilmesi, bu yüzden sıklıkla validasyon gerektiren işlemler gerekiyor çalışırken. Bu yüzden os.path.exists(), os.path.isfile(),os.path.isdir(path) şeklinde kontrolleri yapmamız gerekir.
import os path=[r'/Users/gokhan/kesici/dosya1.txt',r'/Users/gokhan/kesici/'] for p in range(len(path)): if os.path.exists(path[p]): if os.path.isfile(path[p]): print(os.path.getsize(path[p])) else: for i in os.listdir(path[p]): print(os.path.getsize(path[p]+i))
Dosyayı açmak için open() fonksiyonu kullanılır. Bir dosya open ile açıldığında mod parametresi belirtilmezse default olarak read mode ‘da açılır. Herhangi bir şey yazılamaz. O yüzden açarken mod belirmekte fayda var.
path=r'/Users/gokhan/kesici/dosya1.txt' file = open(path, 'r')
Açılan dosyadaki tüm içeriği alıp bir string’e atamak için read() metodu kullanılabilir. Satır satır okumak isterseniz de readlines() metodunu kullanabilirsiniz.
path=r'/Users/gokhan/kesici/dosya1.txt' file = open(path,'r') #filecontent = file.read() filecontent = file.readlines() for i in filecontent: print(i,end='')
write() metoduyla dosya içeriğine iki modla bir şeyler yazabilirsiniz. Biri write mode, diğeri append mode. Write mode dosyanızın üzerine yazacaktır ki bu dosya içeriğinizin kaybolması anlamına gelmektedir. append mode ise mevcut dosya içeriğine ek yapmak istediğinizde kullanmanız gereken mod olacaktır. Bir diğer önemki nokta ise eğer ki path’de açılan dosya yok ise write ve append mode’da yeni boş bir dosya oluşturulacaktır. Tekrar dosya ile işlem yapmak için ise dosyayı close() metoduyla kapatmayı unutmayınız.
path=r'/Users/gokhan/kesici/dosya1.txt' file = open(path,'a') file.write('World\n') file.close()
# shelve module
Data’larınızı kalıcı olarak bir dosyada binary formatında saklamak ve daha sonrasında bunları okuyabilmek istiyorsanız shelve modülü kullanılabilir.
import shelve path='dosya1.txt' sf = shelve.open(path) deneme = ['gokhan','kesici'] sf['deneme'] = deneme sf.close() sf = shelve.open(path) for i in sf.values(): for j in i: print(j) sf.close()
Binary değilde text formatında kayıt için aşağıdaki gibi bir kullanımla da kalıcılık sağlanabilirdir.
kisiler = [{'ad':'gokhan', 'soyad':'kesici'},{'ad':'mehmet', 'soyad':'tan'}] dosya = open('Kisiler.py','w') dosya.write('kisi =' + str(kisiler)) dosya.close() import Kisiler print(Kisiler.kisi[0]['ad'])
# Organizing Files
Dosya kopyalama, taşıma, silme, adını değiştirme işlemlerini python’da shutil (shell utilities) modülü ile yapabiliriz.
Dosya kopyalamak için shutil.copy() metodu kullanılır. Tek bir dosya değilde bir dizin içerisindeki herşeyi kopyalamak için ise shutil.copytree() kullanabiliriz.
import shutil,os os.chdir('/users/gokhan/kesici') shutil.copy('dosya1.txt', '../dosya1copy.txt') shutil.copytree('.', '../yedek')
Dosyayı , dizini taşımak ya da ismini değişmek için shutil.move() metodu kullanılır.
import shutil,os os.chdir('/users/gokhan/') shutil.move('kesici', 'backup')
Dosyayı silmek için os.unlink(), boş bir dizini silmek için os.rmdir(), içi dolu bir dizini silmek için shutil.rmtree() kullanılabilir.
import os,shutil os.chdir('/users/gokhan/backup/') os.unlink('dosya1.txt') os.rmdir('bos_dizin') shutil.rmtree('dolu_dizin')
os.walk() metoduyla bir dizin altındaki tüm alt dizin ve dosyaları çıkarabilirsiniz. os.walk generator tipinde sonuç döner. Generator for döngüsü içerisinde sırasıyla foldername, subfolder, filenames sonuçlarını döner.
import os a = os.walk('/users/gokhan') for foldername,subfolder,filename in a: print(foldername) for fn in filename: print(fn) for sf in subfolder: print(sf)
Bir dosyayı veya dizini sıkıştırmak, zipli dosyayı açmak için python’daki zipfile modülünü kullanabiliriz.
Zip dosyasını okumak için ilk önce bir ZipFile objesi oluşturmamış gerekiyor. ZipFile objesi oluşturmak için zifile.ZipFile() metodu kullanılır. Açılan zip dosyasından istediğimiz bilgiyi çıkarabiliriz.
import os,zipfile os.chdir('/users/gokhan') zip = zipfile.ZipFile('backup.zip') print(zip.namelist()) denemeinfo = zip.getinfo('backup/deneme.txt') print(denemeinfo.file_size) print(denemeinfo.compress_size) zip.close()
Zip dosyası içerisinde tüm dosyaları çıkarmak için extractall() metodu kullanılabilir. Tek bir dosya çıkarmak için ise extract() metodu kullanılabilir.
import os,zipfile os.chdir('/users/gokhan') zip = zipfile.ZipFile('backup.zip') zip.extract('/backup/deneme.txt') zip.extractall() zip.close()
Zip dosyası oluşturmak için write mode’da bir ZipFile objesi oluşturmak gerekiyor. Daha sonra write() metoduyla zipfile içerisine dosya aktarılır.
import os,zipfile os.chdir('/users/gokhan') zip = zipfile.ZipFile('yedek.zip','w') zip.write('backup/deneme.txt', compress_type=zipfile.ZIP_DEFLATED) zip.close()
Zip dosyasına bir şeyler eklemek için append mode ile ZipFile objesi oluşturulup write() metodu kullanılır.
import os,zipfile os.chdir('/users/gokhan') zip = zipfile.ZipFile('yedek.zip','a') zip.write('deneme2.txt') zip.close()
# Debugging
Python’da kodunuzda kendiniz exception’lar yaratabilirsiniz. Bunun için raise Exception() ifadesini kullanabilirsiniz.
a=2 b=int(input()) try: if b==0: raise Exception('b 0 olamaz') print(a/b) except Exception as err: print('Hata: ' + str(err))
Bir hata oluştuğunda pythonda Traceback adı verilen hatanın kaynağını sırasıyla sebebi belirtilir. Traceback’leri bir log dosyası olarak kaydetmek için traceback modulünü ekleyebilirsiniz.
import traceback try: raise Exception('hata mesaji satir 3') except: errfile = open('err.txt','w') errfile.write(traceback.format_exc()) errfile.close()
Koşul oluşturup false alma durumunda hata fırlatmanın kolay yöntemlerinden biri de assert ifadesini kullanmaktadır. Asset koşulu doğru ise koda devam edilir, doğru değilse False dönüyorsa bu durumuda Assert mesajı yayınlanarak hata fırlatılır. Debug yaparken bu tarz kontroller koymak işe yarayabilir.
a=2 b=int(input()) assert b!=0, '0 a bolunemez' print(a/b)
Loglama için logging modülünü kullanabiliriz. basicConfig() metodu ile yapılandırma gerçekleştirebiliriz.
import logging logging.basicConfig(level=logging.INFO, format=' %(asctime)s - %(levelname)s - %(message)s') logging.info('Program basladi') print(2*3) logging.info('Program bitti')
Loglama yaptınız ve logları ekrana sadece gerekli olduğunda getirmek istiyorsanız, loglamayı gerektiğinde disable hale getirebilmemiz gerekir. Bunun için logging.disable() metodunu kullanılırız. Disable metodunda belirttiğiniz seviyenin altındaki loglar disable olacaktır.
import logging logging.basicConfig(level=logging.INFO, format=' %(asctime)s - %(levelname)s - %(message)s') logging.disable(logging.INFO) logging.info('Program basladi') print(2*3) logging.info('Program bitti')
Log mesajlarını kategorize edebilirsiniz. DEBUG, INFO, WARNING, ERROR, CRITICAL kategorileri bulunmaktadır. Loglama seviyeniz yapılandırmanızda DEBUG ise diğer level deki logları görebilirsiniz. CRITICAL ‘da ise sadece critical loglar görülebilir.
import logging logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s') logging.disable(logging.WARNING) logging.debug('i am Debug') logging.info('i am Info') logging.warning('i am Warning') logging.error('i am Error') logging.critical('i am Critical')
Logları ekrana değilde bir dosyaya yazmak için ise logging yapılandırmasında filename parametresine dosya adını belirtmemiz yeterlidir. Loglama dosyası üzerine write modda değil append modda eklemelerini gerçekleştirir.
import logging logging.basicConfig(filename='program.log', level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s') logging.debug('i am Debug') logging.info('i am Info')
Debug etmenin bir diğer yöntemi kullanılan IDE ‘nin debug modunu kullanmak. Breakpoint ise debugger’ı başlattığınızda breakpoint konulan satıra gelindiğinde pause olacağı yer.
# Web Scrapping
webbrowser modülü ile mevcut browser’larınızdan birinde herhangi bir sayfayı yeni bir sekmede açtırabilirsiniz.
import webbrowser webbrowser.open('https://192.168.64.2/wordpress')
Bir GET POST metotları yapabilmek için requests modülünü kullanabiliriz. requests modülü urllib2 modülünün karmaşık olmasından dolayı geliştirilmiş bir modül.
import requests istek = requests.get('https://192.168.64.2/wordpress') kaydet = open('dosya.html','w') kaydet.write(str(istek.content)) kaydet.close()
Bir HTML çıktısını parse etmek istiyorsanız bu anlamdaki en iyi modüllerden biri BeautifulSoup (bs4). Html kodundaki html, css elemanlarını select() metoduyla,attribute çağırabilirsiniz.
import requests,bs4 istek = requests.get('https://192.168.64.2/wordpress') soup = bs4.BeautifulSoup(istek.text) s = soup.select('html') print(s[0].attrs)
Web browser otomasyonu için kullanılan selenium bize bir çok özelliği sağlar. Daha sonra selenium’a özel başka bir yazı da detaylı değineceğiz.
Selenium ile sayfa üzerindeki herhangi bir elemanı find_element ve find_elements metotlarıyla bulabiliriz.
from selenium import webdriver browser = webdriver.Chrome('/Users/gokhan/Downloads/chromedriver') browser.get('https://192.168.64.2/wordpress') elem = browser.find_element_by_tag_name('body') print(elem.size)
Click metoduyla ise browserdaki tıklama işlemini gerçekleştirebilirsiniz.
from selenium import webdriver browser = webdriver.Chrome('/Users/gokhan/Downloads/chromedriver') browser.get('https://192.168.64.2/wordpress') linkelem = browser.find_element_by_link_text('Notes') linkelem.click()
İleri, geri, refresh, quit işlemlerini aynı isimdeki metotlarla yapabilirsiniz.
from selenium import webdriver browser = webdriver.Chrome('/Users/gokhan/Downloads/chromedriver') browser.get('https://192.168.64.2/wordpress') browser.back() browser.forward() browser.refresh() browser.quit()
# Excel
Office’in olmazsa olmazı excel. Python’da bunun için openpyxl modülünü kullanıyor olacağız. Bu modül diğer açık kaynak spreadsheet’leri de desteklemektedir. Bu modülle grafik oluşturmak, formül işlemleri gibi aşağıda belirtmediğimiz tüm excel işlemleri gerçekleştirilebilir.
İlk önce Excel açılır. Workbook içinden sheet’ler çekilir.sheetler içerisinde istediğimiz hücreyi okuyabiliriz. Hücreleri dizi gibi alabileceğimiz gibi cell ile belirterekte çekebiliriz.
import openpyxl workbook = openpyxl.load_workbook('/users/gokhan/Desktop/example.xlsx') print(workbook.get_sheet_names()) print(workbook.get_active_sheet()) sheet = workbook.get_sheet_by_name('Sheet3') print(sheet.title) print(sheet['A1'].coordinate) print(sheet['A1'].value) print(sheet.cell(row=2,column=1).value)
Worsheet’ler içerisine bir şeyler kaydetmek için o sheet’e gelip ilgili değeri değişip kaydetmek yeterli.
import openpyxl file = '/users/gokhan/Desktop/example.xlsx' workbook = openpyxl.load_workbook(file) sheet = workbook.get_sheet_by_name('Sheet1') sheet['A1'] = 'gokhankesici' sheet.title = 'Kullanicilar1' workbook.save(file)
Sheet oluşturmak için create_sheet() metodunu kullanabiliriz. Kaldırmak için ise remove_sheet() metodu kullanılır.
import openpyxl file = '/users/gokhan/Desktop/example.xlsx' workbook = openpyxl.load_workbook(file) workbook.create_sheet('yeni_sheet1') workbook.create_sheet('yeni_sheet2') workbook.remove_sheet(workbook.get_sheet_by_name('yeni_sheet2')) workbook.save(file)
Python’da pdf ile çalışmak için PyPDF2 modülünü kullanıyor olacağız.
Aynen dosyalarla çalışmak gibi düşünebiliriz. Dosyadan pdf modülü aracılığıyla istediğimiz bilgiyi çekebiliriz.
import PyPDF2 file = open('/Users/gokhan/Desktop/Ebooks/a.pdf','rb') mypdfread = PyPDF2.PdfFileReader(file) print(mypdfread.numPages) gp = mypdfread.getPage(0) print(gp.extractText()) file.close()
# Word
Word dokümanlarıyla çalışmak için python-docx modülü kullanılabilir. Bir word dokümanında yapılabilecekleri bu modülle gerçekleştirebiliriz.
import docx mydocx = docx.Document('/Users/gokhan/ornek.docx') print(len(mydocx.paragraphs)) print(mydocx.paragraphs[0].text) new = docx.Document() new.add_paragraph('Merha dunya') new.save('/Users/gokhan/new.docx')
# CSV
CSV formatında her satırdaki sütün elamanları virgüller ayrılmıştır. CSV adıda comma seperated values’den gelmektedir. CSV dosyaları normalden excellerden biraz daha farklıdır. Basittirler, formatları yoktur. Değerlerin bir tipleri yoktur ve her şey string ‘dir. Bu yüzden text editörler tarafından rahatlıkla açılabilmektedirler.
CSV dosyalarla çalışmak için csv modülünü kullanabiliriz.
import csv file = open('/Users/gokhan/ornek.csv','w', newline='') filewrite = csv.writer(file) filewrite.writerow(['1','2','3','4']) filewrite.writerow(['a','b','c','d']) file.close() file = open('/Users/gokhan/ornek.csv','r') fileread = csv.reader(file) for row in fileread: print(row)
# JSON
Çok popüler bir format. Özellikle API’lerle çalışıyorsak json formatıyla çalışırız. JSON formatı pythondaki tüm data tiplerini tutmaz. String, integer, float, boolena, list, dictionary, nonetype tiplerini tanırlar.
Json formatıyla çalışmak için json modülünü kullanabiliriz. Json’da key value değerleri her zaman çift tırnak içerisinde olduğundan ve okunacak değer hep string olmasından dolayı elinizdeki datayı json formatına dönüştürmek istiyorsak dumps() metodu kullanılır. json ‘ı handle etmek için ise loads() metodu kullanılır.
import json ornekdata = {'ad':'gokhan','soyad':'kesici','okul':'iu'} translatetojson = json.dumps(ornekdata) jsonhandle = json.loads(translatetojson) print(translatetojson)
# time modülü
Pythonda sistem saatini çekmek için time modülünü kullanabiliriz.Bu modülün iki önemli fonksiyonu bulunmaktadır. Bunlardan biri time() diğeri sleep().
time.time() sistem saatini Unix epoch timestamp formatında getirir. Programınızı belirli bir süre uyutmak istiyorsanız time.sleep() kullanabilirsiniz.
import time print(time.time()) time.sleep(3) print(time.time())
# datetime modülü
time modülü bize epoch timestamp vermekteydi. Halbuki tarihi ve zamanı doğru okuyabilmek isteseydik bu durumda datetime modülünü kullanacaktı.
import datetime,time suan = datetime.datetime.now() birgungecikme = datetime.timedelta(days=1) birgunsonra = suan+birgungecikme while datetime.datetime.now() < birgunsonra: print(datetime.datetime.now()) time.sleep(3)
# Multithreading
Her prosesin bir threadi vardır. Thread’leri arttırmak iş parçacacıkları birbirinden bağımsız şekilde yapılmasını sağlayabilir. Thread oluşturmak için threading modülünü kullanıyor olacağız.
Thread oluşturmak için bir Thread objesi oluşturulur. Thread objesine yapacağı işi yani hedefi yani metodu argüman olarak veririz. Sonrasında ise thread çalıştırılır.
import threading,time print('Main Thread is starting') def newThread(): time.sleep(5) print('New Thread') mythread = threading.Thread(target=newThread) mythread.start() mythread2 = threading.Thread(target=print,args='Print Thread') mythread2.start() print('Main Thread is stooping')
Thread’ler sonlanmayana kadar process sonlanmaz. Thread’lerde bir diğer bilinmesi gereken birden fazla iş parçacığı olmasından kaynaklı problem yaşamamak için iyi debug edilmesi gerektiği. Aksi durumda sorun yaşayabilirsiniz.
# Subprocess
Python’da kendi kodunuz içerisinden başka bir program çağırabilirsiniz. Bunun için subprocess modülü kullanılır.
Subprocess Popen fonksiyonu kullanılarak açılır. Popen objesininde iki önemli metodu var. Biri poll(), diğer ise wait().
poll() metodu çağrıldığında eğer process hala çalışıyorsa ise None değeri döner. Program sonlanmışsa exit kodu döner. Yani çağırdığımız process’in halan çalış çalışmadığını öğrenmek için bu metodu kullanırız.
wait() metodu çağrıldığında çalıştırılan process bitene kadar bekler. Yani bir process çağırıp önce onun kapanmasını bekliyorsak wait() kullanabiliriz.
import subprocess runbash = subprocess.Popen(['/bin/bash', '--version']) runbash.wait() print('Finished')
# SMTP
Mail transfer işlemleri için smtplib modülünü kullanabiliriz. Smtplib’in yanı sıra smtpd modülüyle de smtpd sunucu oluşturabilirsiniz.
import smtplib smtptest = smtplib.SMTP('smtp.gmail.com',587) smtptest.ehlo() smtptest.starttls() smtptest.login('[email protected]','deneme') fromad = '[email protected]' toad = '[email protected]' message = 'Hello World' smtptest.sendmail(fromad, toad, message) smtptest.quit()
Mailleri okumak için ise imapclient ve pyzmail modüllerini kullanabiliriz.
Mime type’lar kullanarakta mail gönderebilirsiniz.
import smtplib from email.mime.text import MIMEText server = 192.168.1.25 port = 25 sender = "Gokhan <[email protected]>" reciever = "[email protected]" message = f"""\ Hi <b>Gokhan</b><br/> How are you? """ message = MIMEText(message,'html') message['Subject'] = 'Hello' message['From'] = sender connection = smtplib.SMTP(server,port) connection.sendmail(sender,reciever,message.as_string()) connection.quit()
# LDAP
Ldap sorguları için python-ldap (ldap) ve ldap3 modülllerini kullanabilirsiniz.
import ldap ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) username='[email protected]' password='mypass' uri = 'ldaps://example.local:636' base = 'dc=example,dc=local' filter = "(sAMAccountName=*Admin*)" attributes = ['mail'] scope = ldap.SCOPE_SUBTREE connection = ldap.initialize(uri) connection.simple_bind_s(username,password) result = connection.search_s(base,scope,filter,attributes) connection.unbind() print(result)
import ldap3 server = ldap3.Server('example.com') conn = ldap3.Connection(server,'myuser','mypass',auto_bind=True) conn.search('dc=example,dc=local', '(objectCategory=computer)',attributes=['dNSHostName']) print(conn.entries)
# pip
Thirt party python kütüphaneleri indirip kurmak için pip packet yöneticisini kullanabilirsiniz. Pip, pyhon 3.4 ile otomatik geliyor. Ancak Linux’da ayrıca yüklemek gerekebilir.
pip install request
# Python Script’lerindeki #! ifadesi
Python scriptlerinde bir ide ile çalışmıyorsanız text editor’de yazıyorsanız kodunuzu #! ile başlayan bir ifade kullanırız.
# PEP
Python community tarafından yayınlanan önemli dokümanlardır. Örneğin PEP8 dokümanı python kodu yazarken baz alınabilecek bir doküman.
# __pypcache___
Python’da compile edilmiş .pyc uzantılı byte code dosyalar artık __pypcache__ dizini altında bulunmaktadır.
# Dynamic Typing
Python ‘da bir değişken tanımlak istediğinizde bu değişkenin tipini örneğin bir C dilindeki gibi int a şeklinde belirtmeye gerek yoktur. a=5 şeklinde yazabilirsiniz.
Python’da bir değişkene bir değer ataması yaptığınızda aslında değişkeni bir başka objeye linklemiş olursunuz.
a= 5 gibi bir ifade kullandığımızı düşünelim. Bu durumda önce 5 adında bir obje oluşacak daha sonra a değişkeni oluşacak, a değeri 5 değerini referans gösterecektir.
a = 5 dedikten sonra a= ‘gokhan’ dediğimizi düşünelim. a değişkeni yukarıdaki süreçten geçer, sonra ‘gokhan’ objesi oluşacaktır ve a bu objeye referans verecektir. Sonrasında ise garbage collector tarafıdan 5 objesi silinecektir.
Python’da her bir obje için bir referans counter bulunmaktadır. Bu referans sayısı 0 olduğunda bu obje bellekten silinir. Bir objenin referans count’u sys.getrefcount(object) ile öğrenebilirsiniz.
# Shared References
a = 2 b = a a = 'gokhan'
Yukarıdaki örnekte a 2 objesine referans veriyor, b’de a’nın referans verdiği obje’ye yani ‘2’ referans veriyor. Sonrasında a, ‘gokhan’ objesine referans veriyor.
Son durumda ifademiz b=2, a=’gokhan’
a = [1,2,3] b = a a[0] = 4
Bu örnekte a , bir dizi objesini refere ediyor, b ‘de aynı şekilde. Sonrasında bu refere edilen objenin ilk elemanı değiştiriliyor. Bu durumda a ve b ‘de hala aynı yeri refere ediyorlar ve [4,2,3]. Bunun olma sebebi dizilerin değişebilir (mutable) olabilmesidir.
Print objeleri text formatında standart output veya stream’lere göndermeyi sağlar.
Print default olarak objeleri text olarak stdout’a gönderir.
Print metodu varsayılan olarak aşağıdaki gibi çalışırı.
print(object, sep=' ', end='\n', file=sys.stdout, flush=false)
sep adından da anlaşılacağı üzere bir seperator. Print içerisine yazılış objeler arasına hangi karakter geleceğini belirtir.end ise nasıl sonlanacağını belirtir. Print ifadesi bellekteki buffer’a yazılır, bufferdan silinmesini istiyorsanız, hemen bunu kaldırabilirsiniz.
print('gokhan','kesici',sep='-',end=',',flush=True)
# stdout Redirection
Stdout ‘a gönderilen stream’leri ekranda hiç gözükmesin isteyebilirsiniz. Bu durumda bildiğiniz bir dosyaya ya da işletim sistemlerindeki /dev/null gibi yapılara yönlendirerek ekrana yazmayı önleyebilirsiniz.
import sys sys.stdout = open('my.log','a') print('gokhan') sys.stdout.close()
import sys import os sys.stdout = open(os.devnull,'w') print('gokhan') sys.stdout.close()
# Iteration protocol
for ifadesi iterasyon sağlayabileceğimiz en önemli python aracı. File, list, dictonary gibi data tipleri ise iterable objelerdir.
Örneğin aşağıdaki for döngüsü aslında otomatik bir iterasyon yapar.
a = [1,2,3] for i in a: print(i)
Yukarıdaki işlemi manual olarak ise aşağıdaki gibi yapabiliriz.
a = [1,2,3] b = iter(a) while True: try: print(b.__next__()) except StopIteration: break
# map() function
Bir metoda iterable olan objelerdeki değerleri argüman olarak verip sonuç olarak bir liste döndüren bir fonksiyondur.
def myfunc(a): return 2*a a = [1,2,3] b = map(myfunc,a) print(list(b))
# zip() function
Iterable objeleri birleştirmek için kullanılır. Sonuç olarak tuple sonuç döner.
a = ['gokhan','mehmet','ahmet'] b = ['kesici','sever','toprak'] for c,d in zip(a,b): print(c,d)
# enumerate() function
Iterable obje için (index,value) şeklinde sonuç döner. Bir nevi mevcut objeye counter ekler diyebiliriz.
a = ['a','b','c'] for (index,item) in enumerate(a): print('item:',item, 'index:',index)
# filter() function
Bir metoda iterable olan objelerdeki değerleri argüman olarak verip sonuç olarak True döndürenleri listeler.
a = filter((lambda x: x%2==1),[1,2,3,4]) for i in a: print(i)
# reduce() function
Bir metoda iterable olan objelerdeki değerleri iki parametre olarak verir. İlk adım sonrasında oluşan return değeri ile sıradaki değer parametre olarak verilir. Ve bir sonuç döner.
import functools res = functools.reduce((lambda a,b: a if a>b else b), [5,3,12,42,14]) print(res) #42
# Generator functions, yield
Generator bir fonksiyondur ve sonuç olarak iterator döner. def ifadesiyle oluşturulurlar.
Generator fonksiyonlarda return yerine genellikle yield kullanılır. Birden fazla yield ifadesi de kullanılabilir.
Generator fonksiyonunda return değeri de olabilir.
Return bir fonksiyonu sonlandırırken, yield sonlandırmaz daha sonra kullanmak üzere tüm durum tutulur.
Özellikle memory kullanımı ve performans açısından tercih edilirler.
def gen_example(): a = 1 yield a a = a + 1 yield a a = a + 1 yield a gen = gen_example() print(next(gen)) #1 print(next(gen)) #2 print(next(gen)) #3
# Generator Expressions
Lamda ifadesiyle nasılki isimsiz fonksiyonlar oluşturabiliyorsak, generator fonksiyonlar için de bu şekilde fonksiyonlar oluşturabiliriz.
Memory kullanımı açısından tercih edilirler.
Listelere göre daha yavaş çalışırlar. Büyük kümeler için kullanışlardır.
sayilar = [1, 2, 3, 4] karesi = (x**2 for x in sayilar) #generator for i in karesi: print(i)
# dir() function
Dir bir obje içerisindeki attribute’leri sizler için listeler.
dir('gokhan') len(dir('gokhan'))
# help() function
Help ile bir obje hakkında bilgi edinebilirsiniz
help(print)
help(int)
# __dic__
Modullere ait namespace’ler __dic__ (dictionary) objelerinde de yer alır.
import sys sys.__dic__
# reload() function
reload() bir fonksiyondur. reload fonksiyonu ile mevcut bir modülü programı durdurup yeniden başlatmadan tekrardan çalıştırabiliriz.
Bir modül reload olmadan evvel başarılı bir şekilde import olmuş olması gerekir.
Reload işleminde modül dosya tekrardan okunur ve modüle referans verilen her yer reload’dan etkilenir.
ad = "gokhan" def goster(): print(ad)
> import isimgoster > isimgoster.goster() # gokhan
dosya içerisindeki gokhan ifadesini kesici olarak değiştirdiğimizi düşünelim.
> import importlib > importlib.reload(isimgoster) > isim.goster() # kesici
# Packages
Import edilen şey bir modül (dosya) olabileceği gibi bir package (dizinde) olabilir.
Geliştirdiğiniz modülleri bir dizin altında paketleyebilirsiniz. Bu daha organize , okunabilir bir kod anlamına da gelir.
Bir import yapıldığında __init__.py içerisindeki kodda otomatik çalışacaktır. Bir paket yüklendiğinde otomatik initialize etmesini istediğiniz kodu buraya yazabilirsiniz.
Package altındaki modüllere nokta(.) ile ulaşıp import edebiliriz.
sample\sample1.py
def module1(): print('module1')
sample\sample2.py
def module2(): print('module2')
sample\__init__.py
print("burasi ilk yuklenme alani")
test.py
import sample.sample1 import sample.sample2 sample.sample1.module1() sample.sample2.modul2()
test.py ‘deki işlemi aşağıdaki gibi from ile de gerçekleştirebiliriz.
test2.py
from sample import sample1 from sample import sample2 sample1.module1() sample2.modul2()
test2.py’de import * kullanmamız durumunda direkt olarak tüm modüller import edilmez. __init__.py altında __all__ ifadesinde * durumunda hangi modüllerin import edileceği yazılmalıdır.
sample\__init__.py
__all__ = [ 'sample1', 'sample2', ] print("init loading")
test3.py
from sample import * sample1.module1() sample2.module2()
# __all__ and _X
_X ile herhangi bir X değişkeninin from y import * gibi bir import işleminde kopyalanmasına izin vermeyecektir.
Örneğin aşağıdaki deneme.py from * ile import edildiğinde ilgi değişken kopyalanamayacaktır.
deneme.py
a = 2 _b = 3
deneme_test.py
from deneme import * print(a) # 2 print(b) # NameError: name 'b' is not defined
Ancak from yerine import kullanırsa tüm değişkenler çekilebilecektir.
deneme_test.py
import deneme print(deneme.a) #2 print(deneme._b) #3
Alternatif olarak ise whitelist mantığı ile __all__ ile sadece belirtilenleri from * ifadeler için import ettirebiliriz.
deneme2.py
__all__ = ['a','_b'] a = 2 _b = 3 c = 4
deneme_test2.py
from deneme2 import * print(a) # 2 print(_b) # 3 print(c) # NameError: name 'c' is not defined
# __name__ and __main__
Python’da C’deki gibi bir main() fonksiyon yoktur. Kod yukarıdan aşağı indention 0 ‘dan başlar.
Ancak her modülde __name__ builtin attribute bulunur. Python bunu kendi oluşturur ve gerekli atamayı gerçekleştirilir.
Örneğin ornek.py kodunu çalıştırdığımızda yukarıdan aşağıya doğru çalışmaya başlayacaktır. Python öncesinde source code main program olarak çalıştırıldığı için __name__’e atamasını yapar. If kısmından true olarak geçip ilgili fonksiyonu çalıştırır.
ornek.py
def goster(): print('merhaba dunya 1') print('merhaba dunya 2') if __name__ == '__main__': goster() print('merhaba dunya 3')
Diyelim ki yukarıda ornek.py import edilir ve ornek_test.py programı çalıştırılırsa import edilen modüldeki if’li kısım çalışmaz.
ornek_test.py
import ornek print('merhaba dunya 4')
Bu yapı sayesinde script olarak yazılan bir python kodunu bir kütüphane olarakta kullanma şansı doğuyor.
# as Extension
import veya from ifadelerindeki modül adını farklı olarak kullanmak istersek bu durumda “as” kullanabiliriz.
ornek_test2.py
import ornek as orneklem print orneklem.goster()
# Class
Python’da iki tip obje vardır. Biri class object diğeri ise instance object’dir.
Class objeler instance objeleri oluşturur. Class objeler çağrıldığında otomatik bir instance oluşur.
class myClass(): print('start') b = 3 def setdata(self): num = 2 self.data = num def display(self): print(self.data) print(myClass.b) def test(): print('hello') print('end') x = myClass() x.setdata() x.display() print(x.b) myClass.b = 4 print (x.b) print(myClass.test()) x.newattribute = 'gokhan' print(x.newattribute)
Yukarıdaki örnekte bir class tanımı yaptık. Class içerisinde de üç metot tanımladık. Class içerisindeki bu metotlar, bildiğimiz metotlarla aynı özellikteki metotlardır. Ancak class metotlarının ilk argümanlarındaki ve değişkenlerindeki self ifadesi önemlidir.
self ifadesi instance ‘ı refere eder. self olarak tanımlanmayan değişkenler ve metotlar class paylaşımlıdır.
Örneğin x.num ifadesi veya x.test() ifadeleri çağrıldığında hata alırsınız. myClass.deneme() veya myClass.num şeklinde çağrılabilirler.
b değişkenine dikkat ederseniz self ifadesi içermemektedir. Bu şu anlama gelmektedir. Bu değişken paylaşımlıdır. Class ‘a refere eder. Class ismi ve değişken adı belirtilerek değiştirilebilir. Değiştiğinde diğer instance’larında o değişken değeri değişir.
x.newattribute = ‘gokhan’ diyerek instance’ın namespace’ine yeni bir attribute dahi ekleyebildik.
# Inheritance
Instance’lar class’ların attribute’larına da sahip oluyorlardı. Buna inheritance deniyor.
Python’da class’lar da diğer class’lara inherit alabilirler. Kalıtsallık özelliğini aldığı class ‘lara superclass’lar deniliyor.
Superclass’lar class yazılırken parantez içerisinde belirtilir.
Instance’lar bu superclass’larında attribute’larına erişebilirler.
class superClass(): b = 3 def setdata(self): num = 2 self.data = num def display(self): print('superclass') def test(self): print('hello') class subClass(superClass): def display(self): print('subclass') x = subClass() print(x.display())
# Class Interception/Overloading Operators
Class’lar ile operator’lerin arasına girip bunları rahatlıkla yönlendirebiliriz. Bir nevi operator overloading işlemi gerçekleştirebiliriz.
class myClass(): def __init__(self,a): self.a = a def __add__(self, other): return myClass(self.a + other) def __str__(self): return self.a x = myClass('abc') y = x + 'def' print(y) # abcdef
# Class Methods
Python’da instance ile çağrılan metotlar otomatik olarak class metotlarına dönüşür.
Örneğin x.setdata() , myClass.setdata(x) ‘e dönüşür.
# Calling Superclass Constructors
Diyelim ki bir instance oluştuğunda hem superclass hem de sublcass init’leri oluşsun istiyorsunuz. Bu durumda aşağıdaki kullanımı tercih edebilirsiniz.
class Superclass(): def __init__(self): print('I am superclass') class Subclass(Superclass): def __init__(self): Superclass.__init__(self) print('I am subclass') x = Subclass()
# Abstract Class
Abstract class bir superclass’dır. Örneğin otomobil, kamyon, tır gibi üç farklı sınıf olsun. Başlatma, durdurma bu üç class’da da benzer metotlardır. O yüzden bunlarında üzerinde araçlar gibi soyut bir sınıf oluşturabiliriz.
Bir class eğer abstract metot içeriyorsa abstract class olarak adlandırılır. Abstract metot olarak tanımlanmış metot subclass’da olmak zorundadır.
Abstract class’lardan instance oluşturulamaz.
Abstract class’lar subclass’lara fonksiyonilite , altyapı kazandırmayı sağlayan base class’lardır. Bir nevi subclass’lara API , template sağlar.
Python’da default olarak abstract class sunulmasa da , abc (abstract base class) modülü ile bu sağlanmaktadır.
import abc class araclar(abc.ABC): @abc.abstractmethod def baslat(self): pass @abc.abstractmethod def durdur(self): pass class otomobil(araclar): def baslat(self): print('baslatildi') def durdur(self): print('durduruldu') x = otomobil() x.baslat() x.durdur()
Yukarıdaki örnekte araçlar class’ında @abc.abstractmethod ile başlanan abstract metotlar otomobil class’ında kesinlikle olmalı ve override edilmelidir. Aksi durumda hata alırız.
araclar class’ında bir metotu @abc.abstractmethod olarak belirtilmemiş olsaydık, otomobil sınıfında bunu tanımlamak zorunlu olmayacaktık.
Ayrıca yukarıdaki örnekte gidip araclar sınıfından bir instance’da oluşturamak isteseydik hata alırdık.
# Decorators
Decorator bir fonksiyondur. Girdi olarak başka bir fonksiyonu alıp bunu düzenleyebilen fonksiyonlardır.
Decorator’ler fonksiyon ve class’lardan hemen önce @ sembolü kullanılarak belirtilir.
def mydecorator(myfunc): print('Hello') myfunc() print('Goodbye') @mydecorator def name(): print('gokhan')
Yukarıdaki örnekte name diye bir fonksiyonumuz var bunu direkt olarak ilgili decorator’e girdi olarak vermek için metot önünde bir @ ifadesi gerçekleştirdik. Bu girdi artık içeride ilgili fonksiyonda kullanıldı. Argüman kullanmak isteseydik aşağıdaki gibi kullanabilirdik.
def mydecorator(myfunc): print(‘Hello’) def wrap_dec(*args): return myfunc(*args) return wrap_dec @mydecorator def name(isim): print(isim) name(‘gokhan’)
Class metotlarında ise bir toplama işlemi yapalım
class toplam(): def __init__(self,tp): self.tp = tp def __call__(self, *args, **kwargs): return self.tp(*args) @toplam def toplama(a,b,c): return a+b+c print(toplama(1, 2, 3))
Yukarıdaki örnekte class metodu fonksiyonuna toplama parametre olarak toplam sınıfına argüman olarak verildi. Sonrasında toplama fonksiyonu çağrıldığında ise __call__ devreye girdi.
İki tip decorator bulunuyor. Bu örneğimize kadar fonksiyon decorator’leri gördük. Bir diğer tip ise class decorator’lerdir.
Class decoratorler, fonksiyon decoratorlere benzer şekilde class’dan önce ifade edilir. Class objesi ilgili fonksiyona parametre olarak verilir ve return’u class’ın kendisidir.
def count(aClass): aClass.value = 0 return aClass @count class Sample(): value = 2 print(Sample.value)
# Built-in Decorators
Python’da built-in olarak @staticmethod, @classmethod, @property decarator’leri bulunur.
@staticmethod decorator’unde metot self ifadesini argüman olarak almazlar. Instance-less ‘dır. Örneğin aşağıdaki printCount herhangi bir instance oluşturmaksızın erişilebilir. Hatta bu örneğimizde python 3 kullandığımız için @staticmethod yazmamıza dahi gerek yoktu.
class Sample(): counter = 0 def __init__(self): Sample.counter = Sample.counter + 1 @staticmethod def printCount(): print("Instance count: %s" % Sample.counter) a = Sample() b = Sample () Sample.printCount() #2
@classmethod decorator’unde metot ilk argüman olarak instance yerine class objesini girdi olarak alır. Bu class objesinin elamanlarına erişim sağlanılır.
# super() function
Bu fonksiyon ile superclass ‘a isimini belirtmeden direkt erişebiliriz.
class A(): def __init__(self): print(‘Class A’) class B(A): def __init__(self): super().__init__() print(‘Class B’)
# Django Web Framework
# Yükleme
Django python ile yazılmış bir web frameworktur. pip ile aşağıdaki gibi kurulabilir.
pip install django
# Proje oluşturma
Kurduktan sonra bulunduğumuz dizinde bir django projesi başlatabiliriz. Örneğin proje adına webproject adı verilmiştir.
django-admin startproject webproject .
Proje oluştuktan sonra aşağıdaki dosyalar otomatik yaratılır.
./manage.py : Django projesinin komut interface 'i. ./webproject/__init__.py : webproject dizinini bir package olarak düşünülmesini sağlar ve içi boştur. ./webproject/settings.py : webproject projesinin yapılandırmaları buradan gerçekleştirilir. ./webproject/urls.py : Projedeki url tanımlamalarının yapıldığı yer. ./webproject/wsgi.py : Web sunucu ile uygulamamız arasındaki bağlantıyı sağlayan interface.
# Çalıştırma
Web sunucu sonrasında ayağa kaldırılır. Web sunucu http://localhost:8000 ‘den hizmet vermeye başlar.
python manage.py runserver
# App oluşturma
Bir django projesinde bir veya birden fazla app oluşturabilirsiniz. App oluşturmak için startapp komutunu kullanabilirsiniz.
python manage.py startapp pages
Uygulama oluşturulduğunda karşımıza aşağıdaki sayfalar çıkacaktır.
./pages/__init__.py : ilgili dizinin package olarak düşünülmesini sağlar. ./pages/admin.py : Built-in django admin app ayarlarının olduğu kısım. ./pages/apps.py : Uygulamamızın yapılandırma ayarları burada yer alır. ./pages/models.py : Database modelimizi belirlediğimiz yer. Database tablolarına dönüştürmeyi django gerçekleştirir. ./pages/views.py : Uygulamamıza gelen istege karşılık ne cevap vereceğimizin kodunu oluşturduğumuz yer burasıdır. ./pages/test.py : Spesifik testlerin gerçekleştirildiği yer. ./pages/migrations/ : models.py değişikliklerini izler.
Yeni bir app oluşturduğumuzda bunu ./webproject/settings.py altında tanımlamamız gerekir. Örneğin pages diye oluşturduğumuz app için ayarların yer aldığı apps.py altındaki ilgili class’ı belirttik. Uygulamalar django tarafından yukarıdan aşağı yüklenir. Bu yüzden kendi oluşturduğumuz uygulamaları en alta yazmak en sağlıklı yöntemdir.
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'pages.apps.PagesConfig', # Yeni eklenen ]
View içerisinde bir istek geldiğinde hangi içeriğin gösterileceğine karar verirken, urlconf denilen url’lerin yönetildiği bir python modülü ise isteği view’e yönlendirmeyi sağlar.
# Request / Reponse
Django’da request/response döngüsü aşağıdaki gibidir.
URL -> View -> Model -> Template
# View
Örneğin uygulamamız içerisinde views.py’mizi güncelleyelim.
from django.http import HttpResponse def homePageView(request): return HttpResponse('Merhaba Dunya')
# URL
Bu örneğimizde homePageView() çağrıldığında ‘Merhaba Dunya’ cevap olarak dönecektir. Uygulamamız içerisindeki url’leri configure etmek için urls.py isimli dosya oluşturalım. Yeni dosyamızın içeriğini aşağıdaki gibi güncelliyoruz.
./pages/url.py
from django.urls import path from .views import homePageView urlpatterns = [ path('', homePageView, name='home') ]
Burada https://localhost:8080/ yani direkt url yazıldığında gelecek ana sayfaya gelen bir istek olduğunda homepageview’e gitmesini sağladık.
Şimdi de uygulamamızın urlconf’unu projenin url.py dosyasına include etmeliyiz. Include etmek için urls’den include metodunu da import etmek gerekir.
from django.contrib import admin from django.urls import path,include #yeni urlpatterns = [ path('admin/', admin.site.urls), path('',include('pages.urls')), #yeni ]
# Templates
Şuan için bir database işlememiz olmadığından direkt olarak template konusunu baz alacağız. Template dediğimiz şey html sayfaları içerisinde dinamik olarak python kullanabilmektir.
Bunun için uygulamamızın altında templates diye bir dizin oluşturalım. Daha sonra’da home.html ‘i oluşturalım.
./pages/templates/home.html
Şimdide template’i settings.py’de template değişkeninde DIRS’da tanıtmamız gerekir.
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR,'templates')], # yeni 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
(Django templates engine TEMPLATES ile yapılandırılmaktadır. Burada APP_DIRS : True ifadesi template’lerin uygulamaların içinde olup olmadığının da kontrolünün sağlanması içindir. Buraya False dersek oluşturduğumuz app’lerde template aranmayacaktır. DIRS ifadesi ise arama yapıldığında hangi dizinlere bakılması gerektiğini belirtir. Özellikle Backend kısmı dikkatinizi çekmiştir. Django’da template kullanmayabilirsiniz. Kullanmak isterseniz eğer django’nun kendi template yapısını kullanabilirsiniz. Backend’de bunun class path’ini belirtiyoruz. Eğer başka bir template kullanmak istersenizde yine buraya onu yazabilirsiniz. Örneğin jinja2 template’ini ya da custom bir template ‘i backend’de kullanabilirdiniz.)
Sonrasında uygulamamızın view.py’sini düzenleriz. Django’da fonksiyon veya class tabanlı view’ler oluşturulabilir. TemplateView class’ından başka class’lar türetilerek kolayca template’lerimizi yönetebiliriz.
from django.views.generic import TemplateView class HomePageView(TemplateView): template_name = 'home.html'
Bir önceki aşamada uygulamamızın url.py’sini proje içerisinde include ettiğimizden mevcut uygulamamızın içerisindeki url.py’de aşağıdaki düzenlemeyi gerçekleştiririz. Class’ları verirken as_view() metotu eklenir.
from django.urls import path from .views import HomePageView urlpatterns = [ path('', HomePageView.as_view(),name='home' ), ]
# Extending Templates
Diyelim ki şimdi de yukarıda oluşturduğumuz home page’e yeni oluşturduğumuz başka bir html içeriği dahil etmek istiyoruz. Bu durumda django template dilinden faydalanılarak aşağıdaki gibi dahil edebiliriz.
./pages/templates/content.html
<p>Gokhan Kesici</p>
./pages/templates/home.html
<a href="{% url 'home' %}>Homepage</a> {% extends 'content.html' %}
Yukarıdaki örnekte template dilinden yararlandık. Bir link oluşturduk buraya url.py içerisinde home isimli url adresini ekledik. Sonrasında content.html sayfasındaki içeriği direkt homepage içerisine aktardık.
İçeriğiye aktardığımız kod bloklar halindeyse bunları değiştirmek oldukça kolay.
./pages/templates/content.html
{% block baslik %} <p>Baslik</p> {% endblock baslik %} {% block icerik %} <p>Icerik</p> {% endblock icerik %} {% block altkisim %} <p>Altkisim</p> {% endblock altkisim %}
./pages/templates/home.html
<a href="{% url 'home' %}>Homepage</a> {% extends 'content.html' %} {% block baslik %} <p>YeniBaslik</p> {% endblock baslik %}
Yukarıdaki örnekte bir önceki örnekteki gibi content.html’i dahil ettim home.html’e. Dahil edilen koddaki blokları dahil ettiğim kodda ilgili blok adını yazarak değiştirebiliyorum. Bu örnekte sirasiyla import edildiğinde Baslik ifadesi YeniBaslik olarak değişmiş oldu. Son iki örneğimizde gidip url’leri ve view’leri yazmadık. Çünkü template’i import ettik direkt. Herhangi bir link’e ihtiyaç duymadık. content.html ‘i çağırmak istediğinizde 404 hatası alırsınız.
# Migration
Django built-in backend olarak postgresql, mysql, oracle, sqlite database’lerini desteklemektedir. Varsayılan olarak ise sqlite kullanılmaktadır.
Database oluşturmak için migrate komutunu kullanırız. Böylece db.sqlite3 dosyası oluşucaktır. Aslında bir runserver dediğimizde de db oluşur.
python manage.py migrate
Migrate komutu installed_apps’deki uygulamaların database modellerini database ile sync eder. Yeni bir db modeli oluşturmak için models.py altındaki dosyayı aşağıdaki gibi güncelleriz.
from django.db import models # Create your models here. class Posts(models.Model): # yeni text = models.TextField()
Oluşturduktan sonra bir migration dosyası oluşturmak için makemigrations komutunu kullanırız. migrations dizininde bunu görebiliriz. Sonrasında bu migration dosyasının içerisindekileri çalıştırmak için migrate komutunu kullanırız.
python manage.py makgemigrations pages python manage.py migrate pages
# Django admin
django admin panelini (/admin)kullanmak için öncelikle bir admin kullanıcısı oluşturmalıyız.
python manage.py createsuperuser
Varsayılanda admin panele projelerimiz gelmiyor. Projelerimizi eklemek için admin.py dosyası aşağıdaki gibi düzenlenir. Böylece uygulamamız ve database modeli admin sayfası tarafından bilinir.
from django.contrib import admin # Register your models here. from .models import Posts # yeni admin.site.register(Posts) # yeni
# Database
Diyelim ki oluşturduğumuz template içerisinde database içeriğini göstermek istiyoruz. İlk olarak view.py’i düzenleyelim.
from django.views.generic import ListView # yeni from .models import Posts # yeni class HomePageView(ListView): template_name = 'home.html' model = Posts context_object_name = 'all_posts'
Yukarıda ListView superclass olarak belirtilip hangi template’de hangi model’in kullanılacağı belirtildi. ListView object_list adında bir obje döner. Bunun adını all_posts olarak değiştirdik.
home.html dosyamızıda aşağıdaki gibi düzenleyip sonucu görebilirsiniz.
<ul> {% for post in all_posts %} <li>{{post}}</li> {% endfor %} </ul>
# Static files
Django projemizdeki uygulamalarımız da css,javascript,resim gibi statik dosyaları eklemek için klasik path belirtme yöntemlerin yanı sıra settings.py altında STATICFILES_DIRS’a ilgili static dosyalarının olduğu link bulmasını sağlattırıp ilgili template tag’i ile ilgili url’i ekletebiliriz.
STATICFILES_DIRS = [os.path.join(BASE_DIR),'static']
Yukarıdaki tanıma uyması açısından projemizde uygulamamızın olduğu dizinde bir static adlı dizin oluşturalım. Sonrasında altına bir de css dosyası oluşturup ilgili css tanımlarımızı yapalım.
./pages/static/css/home.css
body { color:red; }
Şimdide ana sayfamızı aşağıdaki gibi düzenleyelim. Ve ilgili
{% load static %} <html> <link href="{% static 'css/home.css' %}" rel="stylesheet"> <body> Merhaba Dunya </body> </html>
#DetailView
Bir blog sitesi oluşturduğunuzu ve buraya sürekli yazdığınızı düşünün. Gönderilen her gönderi için bir template oluşturmak biraz saçma olacaktı. Bu sorunun çözümü için ise DetailView ‘i kullanabiliriz.
Sadece bir template oluşturup yazılarımıza url verip ilgili gönderiyi almaya çalışalım. Bunun için ilk önce bir view.py’mizi düzenleyelim.
from django.views.generic import ListView,DetailView # yeni from .models import Posts class HomePageView(ListView): template_name = 'home.html' model = Posts context_object_name = 'all_posts' class PostPageView(DetailView): # yeni template_name = 'posts.html' model = Posts context_object_name = 'posts'
Sonrasında urls.py mizi düzenleyelim.
from django.urls import path from .views import HomePageView,PostPageView # yeni urlpatterns = [ path('home/', HomePageView.as_view(),name='home' ), path('posts/<int:pk>/', PostPageView.as_view(), name='posts'), # yeni ]
Ve son olarakta posts.py olarak oluşturduğumuz template’imizi de aşağıdaki gibi yaparsak. /posts/post-numarasi şeklinde ilgili url’e erişebileceğiz.
<h2>{{ posts.title }}</h2> <h2>{{ posts.body }}</h2>