30 Nisan 2013 Salı

Döngüler

Döngüler kolaylığı ve sürekliliği sağlamak için vardırlar. 
while döngüsü, yazdığımız bir program tamamlanana kadar programın kapanmasına engel olur ve kod dizisinin döngünün başındaki koşul sağlanana kadar dönmesini sağlar.
Örnek verecek olursak:
Sayi=1
while Sayi<10:
         Sayi=Sayi+1
         print Sayi
Bu küçük kod parçacığı 1 den  9 a kadar olan sayıları  ekrana yazdırır.

For Döngüsü:
Kullanımına en alışık olduğumuz döngülerden biridir for döngüsü. Başka programda kod yazan kişiler bilirler ki for döngüsünün görevi bir dizi içindeki ögeleri denetlemektir.
Örnek verecek olursak:

for harf in “Damla-Umut”:
    print harf


Bu programda öncelikle bir karakter dizisine (bizim programımızda Damla-Umut)  harf adını bütün öğelerine ad olarak atadık. Daha sonra bildiğiniz üzre print komutuyla bu harfleri ekrana tek tek yazdırdık.

Peki while döngüsünde yazdığımız kodu for döngüsüne nasıl çeviririz? Bunu yapabilmemiz için for döngüsünün yanında range() fonksiyonunu da kullanmamız gerekir.

for Sayi in range(1, 10):
print Sayi


range() Fonksiyonu:

Bu fonksiyon sayesinde sayı aralıkları belirtebiliriz.

print range(1,10)

bu kod parçacığı bir önceki for döngüsünde yazdığımız kod parçacığıyla aynı işlevi görür. Yani 1 den 10 a kadar aralıkta olan sayıları ekrana yazdırır. Bu kod parçacığının bir kolaylığı vardır buda ‘0’ için geçerlidir. Bir programda ‘0’ dan istediğimiz bir sayıya kadar bütün sayıları ekrana yazdırmak istiyorsak sadece: print range(10) yazmamız yeterlidir. Bu kod parçacığı 0 ile 10 arasındaki bütün sayıların ekrana yazılmasını sağlayacaktır.Peki biz ekrana sayıları 1’er 1’er değilde 5’er 5’er arttırarak yazmak istesek bunu range() fonksiyonuyla nasıl yazarız. print range(25, 125, 5)


len() fonksiyonu:
Bu bir gömülü fonksiyon(Built-in Function)’dur. Karakter dizilerinin uzunluğunu anlamamızı sağlar.

Karakter=”Damla-Umut”
print len(Karakter)

Bu kod parçacığı yazdığımız karakterin harf sayısını ekrana yazacaktır. Yani ekran çıktımız 11 olacaktır.

break deyimi:
Bildiğiniz üzere break deyimi programı sonlandırmaya yarar.

kullanici_adi = "kullanici"
parola = "parola"
while True:
  soru1 = raw_input("Kullanıcıadı: ")
  soru2 = raw_input("Parola: ")
if soru1 == kullanici_adi and soru2 == parola:
  print "Kullanıcıadı ve parolanız onaylandı."
  break
else:
  print "Kullanıcı adınız ve ya parolanız yanlış."
print "Lütfen tekrar deneyiniz!"

Bu kod parçacığında while döngüsüne de örnek vermiş olduk. Kodumuzdaki ilk if parçacığının eğer şartı onaylanırsa ekran çıktısı yazıldıktan sonra break ile programdan çıkış yapılır. Ve if parçacığının içindeki koşul sağlanana kadar while döngüsü sayesinde program başa dönmeye devam eder.

continue:
Bu döngüde kendinden sonra gelen kod satırlarının görülmeden programa baştan başlanmasını sağlar.
for num in range(2, 10):
	if num % 2 == 0:
		print "Çift sayı:", num
		continue
	print "Tek sayı:", num

Bu kod parçacığında range() fonksiyonundan hatırladığımız üzere 2 den 10 a kadar olan sayıların teker teker tek ve çift olan sayılarını bulur. Ve çıktı olarak ekrana “Çift sayı:2” yazdıktan sonra continue komutu sayesinde “Tek sayı:” yazmadan programın başına gider.

28 Nisan 2013 Pazar

Python'da Daha Okunabilir Kod Yazmak

Her ne kadar sitede çeşitli Python konularında eğitimler olsa da, bu eğitimlerin hepsini ilgilendiren, verimliliği ve üretkenliği arttıran bir unsur var: Okunabilirlik.

Okunabilirliğe neden dikkat edilmesi gerekildiği sorulabilir. En başta şunu biliyoruzki Python'da, diğer çoğu popüler dillerdeki gibi gelişigüzel yazamıyoruz. Bu iyi bir şey; geliştiriciler zorla da olsa düzgün kod yazıyorlar ve okunabilirlik artıyor. Aynı zamanda kötü bir şey; en ufak sözdizim hatasında bile program çalışmıyor.

İster yazılımınızı açık kaynak (open-source) olarak geliştirin (tabiki de buna teşvik ediyoruz), isterseniz de kapalı olarak. Her durumda da kodunuzun, okunabilirliğinin ve anlaşılabilirliğinin yüksek olması gerekiyor.

Bu yazıda çeşitli ipuçları ile var olan kodumuzu nasıl daha okunabilir ve anlaşılabilir hale getirebileceğimizden bahsedeceğiz. Örnek olarak ise, Making Games With Python & Pygame adlı kitaptan yararlanarak geliştirdiğimiz aşağıda ki PyGame kodlarını kullanacağız:

import pygame, sys 
from pygame.locals import * 
pygame.init() 
displaysurf=pygame.display.set_mode((400,300)) 
pygame.display.set_caption('Hello World') 
white=(255,255,255) 
green=(0,255,0) 
blue=(0,0,128) 
fontObj=pygame.font.Font('freesansbold.ttf',32) 
textSurfaceObj=fontObj.render('Hello World!',True,green,blue) 
textRectObj=textSurfaceObj.get_rect() 
textRectObj.center=(200,150) 
while 1: 
 displaysurf.fill(white) 
 displaysurf.blit(textSurfaceObj,textRectObj) 
 for event in pygame.event.get(): 
  if event.type==quit: 
   pygame.quit() 
   sys.exit() 
 pygame.display.update()

1 – Boş Satırlara Dikkat!

Evet, gördüğünüz gibi kodun durumu vahim. Bunu yazanı geç, okuyan çocuk bile kör oldu diyebileceğimiz bir halde.

Herşeyden önce asla ve asla boş satır kullanmaktan çekinmeyin. Kodda neyin ne olduğunu anlamanın başlıca yolu, kod parçacıklarını birbirinden ayırt edebilmektir. Dolayısı ile en azından içe aktarma (import), ilklendirme (initialization) ve döngü (loop) kısımlarını ayırmamız, bunların da aralarına boşluk atmamız yararımıza olacaktır.

import pygame, sys 
from pygame.locals import * 

pygame.init() 
displaysurf=pygame.display.set_mode((400,300)) 
pygame.display.set_caption('Hello World') 

white=(255,255,255) 
green=(0,255,0) 
blue=(0,0,128) 

fontObj=pygame.font.Font('freesansbold.ttf',32) 
textSurfaceObj=fontObj.render('Hello World!',True,green,blue) 
textRectObj=textSurfaceObj.get_rect() 
textRectObj.center=(200,150) 

while 1: 
 displaysurf.fill(white) 
 displaysurf.blit(textSurfaceObj,textRectObj) 
 
 for event in pygame.event.get(): 
  if event.type==quit: 
   pygame.quit() 
   sys.exit() 
 
 pygame.display.update()

2 – Bize Boşluk Lazım!

Genellikle atamalar ve kontrol sistemlerinde boşluk kullanımı önemlidir. Değişkeni ve değişkene verilen değeri ya da karşılaştırılan değeri anlayabilmek gereklidir. Bu nedenle atamalar ve kontrol sistemlerinde mutlaka boşluk kullanın. Bunun yanısıra, kodlarınızda virgülle ayırdığınız parametrelere de virgülden sonra boşluk atın.

import pygame, sys 
from pygame.locals import * 

pygame.init() 
displaysurf = pygame.display.set_mode((400, 300)) 
pygame.display.set_caption('Hello World') 

white = (255, 255, 255) 
green = (0, 255, 0) 
blue = (0, 0, 128) 

fontObj = pygame.font.Font('freesansbold.ttf', 32) 
textSurfaceObj = fontObj.render('Hello World!', True, green, blue) 
textRectObj = textSurfaceObj.get_rect() 
textRectObj.center = (200, 150) 

while 1: 
 displaysurf.fill(white) 
 displaysurf.blit(textSurfaceObj, textRectObj) 
 
 for event in pygame.event.get(): 
  if event.type == quit: 
   pygame.quit() 
   sys.exit() 
 
 pygame.display.update()

3 – Çoklu İfadelerde Hizalama da Ne?

Mesela PyGame ile bir oyun geliştiriyorsunuz, belirli renkleri başta yazmak istediniz. Bunları gelişi güzel yazmak yerine birbirine hizalı olarak yazmak anlaşılabilirliği çok etkileyecektir. Aşağıdaki kodda renk atamalarına dikkat edin, RGB renklerini daha anlaşılır bir şekilde atadık.

import pygame, sys 
from pygame.locals import * 

pygame.init() 
displaysurf = pygame.display.set_mode((400, 300)) 
pygame.display.set_caption('Hello World') 

white = (255, 255, 255) 
green = (  0, 255,   0) 
blue  = (  0,   0, 128) 

fontObj            = pygame.font.Font('freesansbold.ttf', 32) 
textSurfaceObj     = fontObj.render('Hello World!', True, green, blue) 
textRectObj        = textSurfaceObj.get_rect() 
textRectObj.center = (200, 150) 

while 1: 
 displaysurf.fill(white) 
 displaysurf.blit(textSurfaceObj, textRectObj) 
 
 for event in pygame.event.get(): 
  if event.type == quit: 
   pygame.quit() 
   sys.exit() 
 
 pygame.display.update()

4- Büyük Büyük Yazalım da Belli Olsun!

Python kodunuzda, en çok kullanacağınız ve en önemli gördüğünüz değişkenleri mutlaka büyük harflerle yazın. Belirliliği arttıracak ve değişkeni rahatça kodun içinden ayırt edebileceksiniz.

import pygame, sys 
from pygame.locals import * 

pygame.init() 
DISPLAYSURF = pygame.display.set_mode((400, 300)) 
pygame.display.set_caption('Hello World') 

WHITE = (255, 255, 255) 
GREEN = (  0, 255,   0) 
BLUE  = (  0,   0, 128) 

fontObj            = pygame.font.Font('freesansbold.ttf', 32) 
textSurfaceObj     = fontObj.render('Hello World!', True, GREEN, BLUE) 
textRectObj        = textSurfaceObj.get_rect() 
textRectObj.center = (200, 150) 

while 1: 
 DISPLAYSURF.fill(WHITE) 
 DISPLAYSURF.blit(textSurfaceObj, textRectObj) 
 
 for event in pygame.event.get(): 
  if event.type == quit: 
   pygame.quit() 
   sys.exit() 
 
 pygame.display.update()

5- Anlat Bakalım Ne Diyor Bu Kod?

Python olsun, diğer diller olsun farketmez. Ufak tefek betikler yazmıyorsanız, mutlaka kodunuzun içine yorum satırları ekleyin. Bunu hem açıklanabilirliği arttırmak, hem de kod segmentlerini (içe aktarma, ilklendirme, döngüler vs.) birbirinden kolayca ayırt etmek için kullanacağız.

# Modülleri içe aktarıyoruz
import pygame, sys 
from pygame.locals import * 

# Temel ilklendirmeleri yapalım
pygame.init() 
DISPLAYSURF = pygame.display.set_mode((400, 300)) 
pygame.display.set_caption('Hello World') 

# Renklerimizi oluşturuyoruz
WHITE = (255, 255, 255) 
GREEN = (  0, 255,   0) 
BLUE  = (  0,   0, 128) 

# Diğer nesneleri ekleyelim
fontObj            = pygame.font.Font('freesansbold.ttf', 32) 
textSurfaceObj     = fontObj.render('Hello World!', True, green, blue) 
textRectObj        = textSurfaceObj.get_rect() 
textRectObj.center = (200, 150) 

# Oyun döngüsünü başlatıyoruz
while 1: 
 DISPLAYSURF.fill(WHITE) 
 DISPLAYSURF.blit(textSurfaceObj, textRectObj) 
 
 for event in pygame.event.get(): 
  if event.type == quit: 
   pygame.quit() 
   sys.exit() 
 
 pygame.display.update()

Bunun daha da ilerisi, kavramsal algılamayı etkileyen, değişken ve fonksiyon isimleri kullanmak (while 1 yerine, while Running gibi) oluyor ama genel olarak baktığımızda başlangıç seviyesi için bu kadarı yeterli.

Bu yazının amacı sadece kodda okunabilirliğe dikkat çekmek idi. İlk kodu ve son kodu ayrı ayrı çalıştırın, hiçbir fark görmeyeceksiniz çalışmasında. Ama kodun okurken, paylaşırken ve tekrardan geliştirirken gerçekten rahatlayacaksınız. Son olarak kodlarımıza bir göz atalım, nereden nereye diye:
 
Kodumuzun ilk hali:

import pygame, sys 
from pygame.locals import * 
pygame.init() 
displaysurf=pygame.display.set_mode((400,300)) 
pygame.display.set_caption('Hello World') 
white=(255,255,255) 
green=(0,255,0) 
blue=(0,0,128) 
fontObj=pygame.font.Font('freesansbold.ttf',32) 
textSurfaceObj=fontObj.render('Hello World!',True,green,blue) 
textRectObj=textSurfaceObj.get_rect() 
textRectObj.center=(200,150) 
while 1: 
 displaysurf.fill(white) 
 displaysurf.blit(textSurfaceObj,textRectObj) 
 for event in pygame.event.get(): 
  if event.type==quit: 
   pygame.quit() 
   sys.exit() 
 pygame.display.update()

Kodumuzun son hali:

# Modülleri içe aktarıyoruz
import pygame, sys 
from pygame.locals import * 

# Temel ilklendirmeleri yapalım
pygame.init() 
DISPLAYSURF = pygame.display.set_mode((400, 300)) 
pygame.display.set_caption('Hello World') 

# Renklerimizi oluşturuyoruz
WHITE = (255, 255, 255) 
GREEN = (  0, 255,   0) 
BLUE  = (  0,   0, 128) 

# Diğer nesneleri ekleyelim
fontObj            = pygame.font.Font('freesansbold.ttf', 32) 
textSurfaceObj     = fontObj.render('Hello World!', True, green, blue) 
textRectObj        = textSurfaceObj.get_rect() 
textRectObj.center = (200, 150) 

# Oyun döngüsünü başlatıyoruz
while 1: 
 DISPLAYSURF.fill(WHITE) 
 DISPLAYSURF.blit(textSurfaceObj, textRectObj) 
 
 for event in pygame.event.get(): 
  if event.type == quit: 
   pygame.quit() 
   sys.exit() 
 
 pygame.display.update()

Making Games With Python & Pygame adlı kitaptan, okunabilirliğe dikkat etmekle ilgili bir kesit:
“Asla böyle kod yazmayın. Eğer böyle programlama yaparsanız, banyoda aynaya bakarken Ada Lovelace'ın hayaleti aynadan çıkar ve sizi jacquard loom'un* ağzına fırlatır!”

* Bilgisayar teknolojisine katkısı olan bir tür dokuma tezgahı
http://en.wikipedia.org/wiki/Jacquard_loom

Operatörler ve Matematiksel İşlemler

Bu bölümde, programlamayla az çok uğraşmış herkesin hiç yabancılık çekmeyeceği bir konuya değineceğiz. Çünkü  “Operatörler ve matematiksel işlemler” konusu hemen her programlama dilinde aynıdır. Lafı çok uzatmadan yazımıza ilk olarak operatörlerden başlayalım.





Matematiksel Operatörler

Python daki matematiksel operatörler herhangi bir hesap makinesindekiyle aynıdır. Bunlar, numerik klavyemizde de yan yana yer alan /, *, -, + operatörleridir.


Hemen basit bir örnek verelim:
>>>a=5+7 
>>>print a
12
>>>
Aynı işlemler değişkenler ile de yapılabilir:
>>>a=5 
>>>b=a+7 
>>>print b
12
>>>
Bununla beraber oldukça karmaşık ifadeler de yazabilirsiniz:
>>>a=(3+4+21)/7 
>>>b=(9*4)/(2+1)-6 
>>>print(a*b)-(a+b) 
14
>>>
Bu operatörler sadece rakamlarla kullanılabilir mesela aşağıdaki örnekler karşımıza hata mesajları getirir.

“Merhaba” + 5                                “14” + 3          

*Burada önemli olan nokta “14” ün sayı olarak değil bir String ifade olarak işleme sokulmasıdır.

Not: Yine her programlama dilinde olduğu gibi Python da işlem önceliğine dikkat eder. Bir diğer dikkat edilmesi gereken husus ise bölme işleminde karşımıza çıkar. İki integer sayıyı böldüğümüzde  eğer bir kalan oluşursa Python bunu göz ardı eder.
>>>13/6
2
>>>
Bu sorundan iki sayıdan birini float dediğimiz yani türkçe tabiriyle kayan noktalı halde yazarak kurtulabiliriz.
>>>13/6.0
2.1666666666666665
>>>
Tabi her seferinde böyle virgüllü sayımı yazacağız diye soracak olursanız bunun da kolayı var :). Komut satırında da olsak text editör de de olsak şu komutu araya bir yere sıkıştırmak yeterlidir:
from __future__ import division
Eğer komut satırında isek Python bir dahaki açılışına kadar virgüllü sayıları es geçmez. :).. “__” işaretini nasıl yapacağım diyorsanız “_” işaretini iki kere ard arda koymanız yeterli arkadaşlar :).

Örnek olması açısından küçük bir örnek de String ifadeler için yapalım.
>>>a=”Hel”
>>>b=”lo”
>>>c=a+b
>>>print c
'Hello'
>>>c=c+” world”
>>>print c
'Hello world'
>>>
Matematiksel operatörlerde son olarak değineceğimiz kısım üs alma ve mod işlemi.
Bu işlemlerden mod almayı halletmek için Python ' % ' işaretini kullanır. Ancak üs alma işlemi dğer programlama dillerinden biraz farklıdır. Python da üs alma (a^b) işlemini ' ** ' yardımıyla yaparız. Hemen örnek verecek olursak:
>>>13%2
1
>>>2**3
8
>>>3**2
9
>>>
İlişkisel Operatörler
Bir diğer operatör türümüzde ilişkisel operatörler dediğimiz yapılardır. Bunlar == (eşit mi?), != (farklı mı), < (küçük mü?), > (büyük mü?), <= (küçükeşit mi?), >= (büyükeşit mi?) gibi işaretlerdir. Bu operatörler basit karşılaştırma işlemleri yaparlar ve yaptıkları işlemin sonucunda 'true' ya da 'false' değerleri döndürürler. Hemen örneklerimizde görelim arkadaşlar:
>>>4>=9 
False 
>>>’abc’!=’def’ 
True 
>>>x=’abc’ 
>>>x==’abc’ 
True
>>>14!=9
True
>>>
Unutmadan yine operatörler konusunda bahsedilmesi gereken +=, -=, *=, /= c operatörlerini ele alalım.Bu operatörler hızlı bir şekilde değişkenin değerini işleme tabi tutup ardından tekrar değişkene atamak için kullanılır. Aşağıda ki örnekte iki işleminde aynı anlama geldiğini görebiliriz:
>>> x = 5 
>>> x = x + 6 
>>> print x 
11 
>>> y = 5 
>>> y += 6 
>>> print y 
11
>>>
Matematiksel Fonksiyonlar ve math Modülü


Evet arkadaşlar operatörleri bitirdikten sonra şimdi de matematiksel fonksiyonları tek bir çatı altında toplayan math modülünden bahsedelim. Bu konu modüller kısmında da anlatılabilirdi ama biz burada anlatmayı daha uygun gördük. Böylece math altındaki tüm fonksiyonları tek tek inceleyebiliriz.:)

Bu modülü kullanabilmemiz için öncelikle çalışmamıza import etmemiz gerekiyor:

>>>import math
>>>
Fonksiyonlar çağrılırken math.xxx şeklinde xxx kısmına fonksiyonlar yazılır.
Eğer math modülü altındaki tüm fonksiyonları görmek isterseniz:
>>>dir(math)       #yazarak veya
>>>help(math)     #yazarak görebilirsiniz.
help(math) kısmında ayrıca fonksiyonların özelliklerdinden kısa kısa bahsedilir.
Şimdi alfabetik sıraya göre bu fonksiyonları teker teker inceleyelim arkadaşlar.

-acos(x)
arccosinüs (cosinüs fonk. tersi) fonksiyonudur ve dönen değer radyan cinsindendir.
>>>math.acos(0)
1.5707963267948966
>>>
-acosh(x)
Hiperbolik kosinüs fonksiyonunun tersidir ve bu da radyan cinsinden bir değer döndürür.
>>>math.acosh(1)
0.0
>>>
-asin(x)
Arcsinüs fonksiyonudur. Dönüş değeri radyandır.
>>>math.asin(1)
1.5707963267948966
>>>
-asinh(x)
Hiperbolik arcsinüs fonksiyonudur.
>>>math.asinh(0)
0.0
>>>
-atan(x)
arctanjant fonksiyonudur.
>>>math.atan(1)
0.7853981633974483
>>>
-atan2(y,x)
Sonuç olarak y/x in arctanjantını verir. Neden atan(y/x) bize yetmiyor mu derseniz atan2(y,x) fonksiyonu işaret karışıklığını gidermek için kullanılabilir.
>>>atan2(5,5)  # 5/5=1 olduğundan
 0.7853981633974483
>>>
-atanh(x)
X değerinin Hiberbolik arctanjantını radyan cinsinden veren fonksiyondur.
>>>math.atanh(0)
0.0
>>>
-ceil(x)
ceil in kelime anlamı ingilizce de tavanla ilgilidir. Bu fonksiyonda adının hakkını vererek aldığı parametreye en yakın büyük tam sayıyı bize verir.
>>>math.ceil(3.56843)
4.0
>>>math.ceil(-3.56843)
-3.0
>>>
-copysign(x, y)
Bu fonksiyon kısaca y nin işaretini x e kopyalar diyebiliriz. Geri dönüş değeri yine x tir.
>>>math.copysign(2.56,-3)
-2.56
>>>
-cos(x)
İlkokuldan beri bildiğimiz kosinüs fonksiyonu :). Burada parametre olarak radyan değer girilir arkadaşlar.
>>>math.cos(0.5235987755982988)
0.8660254037844387
>>>
-cosh(x)
Hiperbolik cosinüs fonksiyonudur.
>>>math.cosh(1)
1.5430806348152437
>>>
-degrees(x)
Radyan cinsinden girilen değerin açı olarak verir. Yukarıda radyan olarak kullandığımız değerlerin karşılığını görelim isterseniz :).
>>>math.degrees(1.5707963267948966)
90.0
>>>math.degrees(0.5235987755982988)
30.0
>>>
-exp(x)
Bu fonksiyon bize e^x işlemini yapmaktadır.
>>>math.exp(2)
7.38905609893065
>>>
-expm1(x)
Bu fonksiyonun exp(x) ten tek farkı sonucu 1 çıkarıp vermesidir. Yani e^x-1 işlemini yapar.
>>>math.expm1(2)
6.38905609893065
>>>
-fabs(x)
Girilen değerin mutlak değerini verir.
>>>math.fabs(-3.26)
3.26
>>>
-factorial(x)
Fonksiyonumuz x! i bulur. Tabi negatif yazmamaya dikkat ediyoruz. :)
>>>math.factorial(4)
24
>>>
-floor(x)
Floor türkçede zemin anlamına gelmektedir. Bu fonksiyonda aldığı değeri en yakın küçük tam sayıya yuvarlar.
>>> math.floor(3.56843) 
3.0 
>>> math.floor(-3.56843) 
-4.0 
>>>
-fmod(x,y)
fmod(x,y) fonksiyonu, a sayısının b sayısına bölümünden kalanı veren bir fonksiyondur. a%b işlemiyle aynıdır ama fmod ile ondalıklı sayılarıda kullanabiliriz.
>>> math.fmod(5,3)
2.0
>>> math.fmod(6,3.2)
2.8
>>>
-frexp(x)
Bu fonksiyon bize verilen değerin karakteristiğini ve mantisini veriyor. Sonu olarak bize (m,k) şeklinde bir değer döndürüyor. Burada m mantis, k karakteristiktir.
>>>math.frexp(7)
(0.875, 3)
>>>
-hypot(x,y)
Evet sizinde tahmin ettiğniz gibi girilen değerlere karşılık gelen hipotenüs uzunluğunu bulur. Öklid in dik üçgen kanunundaki sqrt(x*x+y*y) işleminin sonucudur aslında.
>>>math.hypot(3,4)
5.0
>>>
-isinf(x)
Ne kadar işiniz düşer bilinmez ama bu fonksiyonumuz da bir sayının sonsuz olup olmadığını kontrol ederek bize true ya da false değer döndürür.

-isnan(x)
Bu fonksiyonunda girilen parametrenin belirsizlik durumunu kontrol eder. Yani (sonsuz/sonsuz), (sonsuz*0) gibi.
-ldexp(x,y)
Bu fonksiyonumuz da x*(2**y) işlemini döndürür. (** işlemi üs alma işlemiydi hatırlarsanız.)
>>>math.ldexp(3,2)
12.0
>>>
-log(x,y)
Logaritması alınacak sayı x tir. Tabanımız ise y değeridir.
>>>math.log(8,2)
3.0
>>>
-log10(x)
Girilen parametrenin 10 tabanındaki logaritmasını alır.
>>>math.log10(1000)
3.0
>>>
-log1p(x)
Bu fonksiyon 1+x değerinin e tabanındaki logaritmasını alır:
>>> math.log1p(4) 
1.6094379124341003
>>>
-modf(x)
Girilen değerin ondalık kısmını ve tam kısmını birbirinden ayırıp geri döndürür.Girilen sayı tam sayı da ondalıklı sayı da olabilir.
>>> math.modf(6.5) 
(0.5, 6.0) 
>>>
-pow(x,y)
xy işlemini yapan fonksiyonumuzdur. Bu fonksiyonu ayrıca math modülünü import etmeden de kullanabilirsiniz.
>>>math.pow(5,3)
125
>>>pow(2,3)
8
>>>
-radians(x)
Girilen açı değerinin radyan karşılığını verir:
>>> math.radians(180) 
3.141592653589793 
>>>
-sin(x)
Bildiğimiz sinüs fonksiyonudur. Tabi hep olduğu gibi burada da değer olara radyan giriyoruz.
>>> math.sin(1.0471975511965976) 
0.8660254037844386 
>>>
-sinh(x)
Hiperbolik sinüs fonksiyonudur. Sinüs te nasıl değeri radyan cinsinden alıyorsa burada da radyan cinsinden geri döndürür.
>>>math.sinh(1)
1.1752011936438014
>>>
-sqrt(x)
Bir çok programlama dilinde aynı olan bu fonksiyonumuz eğer aşinalığınız varsa karekök alan fonksiyon olduğunu anlamışsınızdır. :)
>>>math.sqrt(81)
9.0
>>>
-tan(x)
Yine klasik trigonometrik fonksiyonlardan bir tanesi olan tanjant fonksiyonu.
>>>math.tan(1)
1.5574077246549023
>>>
-tanh(x)
Hiperbolik tanjant fonksiyonudur.
>>>math.tanh(0)
0.0
>>>
-trunc(x)
Evet bu fonksiyonda modülümüzde yer alan son fonksiyonumuzdu arkadaşlar. Ne işe yarıyor diye soracak olursanız girilen sayımızın ondalık kısmını atıp elinde kalan değeri bize geri döndürür. Yaprığı işin yuvarlamayla ilgisi yoktur yani. Örneğimiz rahatlıkla açılar bu durumu:
>>>math.trunc(12.6)
12
>>>math.trunc(-12.6)
-12
Son olarak da bilgi olması açısından Pyhon' umuzun e ve Pi sabitlerinin sayı değerlerini verelim.
e = 2.718281828459045
pi = 3.141592653589793
Bu bölümde matematik modülünü işledik ve tüm fonksiyonlarımızı inceleme imkanı bulduk. Şimdi dışarı çıkıp temiz bir hava alabilirsiniz :)...

Kaynaklar:

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-189-a-gentle-introduction-to-programming-using-python-january-iap-2011/


-  >>>help()
   help>math

www.google.com

http://www.istihza.com/py2/math.html

24 Nisan 2013 Çarşamba

Sıralama Algoritmaları

Sıralama algoritmaları, sayı kümelerini küçükten büyüğeyahut büyükten küçüğe sıralamak için geliştirilmiş matematiksel yaklaşımlardır. Bu yaklaşımlardan en popüler olanlarının python dili ile implemente edilmiş halini sizlerle paylaşacağız.







Bubble Sort
numbers = []
def bubble_sort():
     "Sorts numbers in place it."
     for passesLeft in range(len(numbers)-1, 0, -1):
         for index in range(passesLeft):
             if numbers[index] > numbers[index + 1]:
                numbers[index], numbers[index + 1] = numbers[index + 1], numbers[index]   


Heap Sort
def heap_sort(lst):
  for start in range((len(lst)-2)/2, -1, -1):
    siftdown(lst, start, len(lst)-1)
 
  for end in range(len(lst)-1, 0, -1):
    lst[end], lst[0] = lst[0], lst[end]
    siftdown(lst, 0, end - 1)
 
def siftdown(lst, start, end):
  root = start
  while True:
    child = root * 2 + 1
    if child > end: break
    if child + 1 <= end and lst[child] < lst[child + 1]:
      child += 1
    if lst[root] < lst[child]:
      lst[root], lst[child] = lst[child], lst[root]
      root = child
    else:
      break

Quick Sort
def partition(list, start, end):
    pivot = list[end]                          
    bottom = start-1                          
    top = end                                 

    done = 0
    while not done:                            

        while not done:                        
            bottom = bottom+1                  

            if bottom == top:                  
                done = 1                       
                break

            if list[bottom] > pivot:          
                list[top] = list[bottom]       
                break                          

        while not done:                       
            top = top-1                        
            
            if top == bottom:                  
                done = 1                      
                break

            if list[top] < pivot:             
                list[bottom] = list[top]       
                break                          

    list[top] = pivot                         
    return top                                

def quicksort(list, start, end):
    if start < end:                           
        split = partition(list, start, end)    
        quicksort(list, start, split-1)        
        quicksort(list, split+1, end)
    else:
        return

Insertion Sort
def insertion_sort(list):
    i = 0
    j = 0
    for index in range(len(list)):
        j = index
        while (j > 0) and (list[j-1] > list[j]):
            list[j-1] , list[j] = list [j] , list[j-1]
            j -= 1

Selection Sort
def selection_sort():
    n = len(numbers)
    for i in range (0, n-1):
        minI = min(range(i,n), key = partial(getitem, numbers))
        numbers[i], numbers[minI] = numbers[minI], numbers[i] 

Python ile Network Oyunu

Python ile network işlemleri yapmakta çok kolaydır. Bunu sizlere gösterebilmek için bir adet network bazlı çalışan sayı tahmini oyunu kodladık. Kodları incelediğinizde tüm olayı anlayacağınıza inanıyoruz.

Bir adet server.py dosyası geliştireceğiz. Bu dosya belirlediğimiz bir TCP portunu dinlemeye alacak ve bu porta bağlantıda bulunan tüm kullanıcılar için oyunu başlatacaktır.




Oyunun Özellikleri
1 - Birden fazla kullanıcı için hizmet verecektir.
2 - Her oyuncu ilk başta bir username belirleyecektir ve aynı username birden çok kullanılamayacaktır.
3 - Her oyuncunun kaç tahminde sayıyı bulduğu hesaplanacaktır.
4 - Bir oyuncu sayıyı tahmin ettiğinde, kanalda ki tüm oyunlara bu broadcast mesaj olarak bildirilecektir.

#!/usr/bin/env python
from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor
from random import randrange

class OyunProtocol(LineReceiver):
    def __init__(self, factory):
        self.factory=factory
        self.isim=None
        self.state="kayit"

    def connectionMade(self):
        self.factory.numConnections += 1
        self.sendLine("Merhaba oyuncu! Isminiz nedir ? ")

    def connectionLost(self, reason):
        if self.isim in self.factory.users:
            self.factory.numConnections -= 1
            del self.factory.users[self.isim]
            print "[Disconnect] %s kanaldan ayrildi!" % (self.isim)

    def lineReceived(self, line):
        if self.state == "kayit":
            self.chat_kayit(line)
        else:
            self.chat(line)

    def chat_kayit(self, isim):
        if isim in self.factory.users:
            self.sendLine("Bu isim daha once alinmistir! Lutfen baska isim seciniz")
            return
        self.sendLine("Pythonogreniyorum.com'a Hosgeldin %s" % (isim))
        self.isim= isim
        self.sayi= randrange(0,50)
        self.tahminsayisi=0
        self.factory.users[isim] = self
        self.state="kayitli_kullanici"
        print "[Newuser] %s oyuna geldi! Hedef sayisi = %i" % (self.isim, self.sayi)

    def chat(self, gelen):
        tahmin=int(gelen)
        if tahmin < self.sayi:
            self.sendLine("Kucul geldi :)")
            self.tahminsayisi = self.tahminsayisi + 1
        elif tahmin > self.sayi:
            self.sendLine("Buyuk geldi:)")
            self.tahminsayisi = self.tahminsayisi + 1
        else:
            self.tahminsayisi = self.tahminsayisi + 1
            self.sendLine("TEBRIKLER | Aranan sayi = %s , Tahmin sayisi = %i" % (self.sayi, self.tahminsayisi))
            self.broadcastMessage("%s icin alkislar! Oyunu tamamlandi!" % self.isim)
            self.state="kayit"


    def broadcastMessage(self, message):
        for name, protocol in self.factory.users.iteritems():
            if protocol != self:
                protocol.sendLine(message)

class OyunFactory(Factory):
    def __init__(self):
        self.users = {}
        self.numConnections = 0
    def buildProtocol(self, addr):
        return OyunProtocol(self)

reactor.listenTCP(8000, OyunFactory())
reactor.run()

Server.py'yi çalıştırdık ve 2 farklı kullanıcı sisteme bağlandı.

mince@rootlab:~/PycharmProjects/NetworkOyunu$ python server.py
[Newuser] Mehmet oyuna geldi! Hedef sayisi = 6
[Newuser] Dursun oyuna geldi! Hedef sayisi = 28

İlk kullanıcı sisteme bağlanıyor
mince@rootlab:~$ telnet localhost 8000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Merhaba oyuncu! Isminiz nedir ? 
Dursun
Pythonogreniyorum.com'a Hosgeldin Dursun
Mehmet icin alkislar! Oyunu tamamlandi!

İkinci kullanıcı sisteme bağlanıyor ve oyunu oynaya başlıyor.
mince@rootlab:~$ telnet localhost 8000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Merhaba oyuncu! Isminiz nedir ? 
Mehmet
Pythonogreniyorum.com'a Hosgeldin Mehmet
10
Buyuk geldi:)
20
Buyuk geldi:)
30
Buyuk geldi:)
40
Buyuk geldi:)
1
Kucul geldi :)
6
TEBRIKLER | Aranan sayi = 6 , Tahmin sayisi = 6
Mehmet isimli kullanıcı oyunu tamamladığında Dursun isimli kullanıcıya broadcast mesajı iletilmekte.

ALIŞTIRMALAR
Benzer bir oyunu yapınız. Yalnız her oyunu için farklı bir sayı değil. Tüm oyunları aynı sayıyı tahmin etmeye çalışsın. İlk tahmin eden kullanıcının kaç tahminde bulduğu diğer tüm kullanıcılara broadcast mesajı olarak iletilsin.

Kaynaklar :
twisted network programming essentials 2nd edition

23 Nisan 2013 Salı

Pygame Kurulumu

Pygame nedir?
Pygame;python dilini kullanarak kolay bir şekilde multimedya yazılımları geliştirmemizi sağlayan,platform bağımsız bir kütüphanedir.Gücünü SDL kütüphanesinden alır. Kısa sürede basit oyunlar,çizim programları.. yazmamızı sağlar.Oyun geliştirmeye başlamak isteyenler ama nereden başlayacağını bilmeyenler için idealdir.Hatta Pygame ile Oyun geliştirme turnuvaları bile düzenlenmektedir. http://www.pyweek.org/ adresinden takip edebilirsiniz.

Kuruluma geçmeden önce sisteminizde gerekli python sürümünün kurulu olduğundan emin olun.Ardından http://www.pygame.org/ adresinden kaynak kodu indirdikten sonra terminali açıp sırayla;
tar xzvf pygame-1.9.1release.tar.gz
cd pygame-1.9.1release
sudo python setup.py install
komutlarını yazın yada paket yöneticisinden,
sudo apt-get install python-pygame
komutuyla direkt kurulumu gerçekleştirin.Windows kullanıcıları için binary kurulum paketi de bulunmaktadır. Kurulumu tamamladıktan sonra shell ekranından,
>>>import pygame
ile kurulup kurulmadığını kontrol edebilirsiniz.

Kaynakça:

Pygame Merhaba Dünya

Yeni öğrendiğimiz bir dilde,ilk olarak ekrana "Merhaba Dünya" yazdırmak adettendir.Bizde bu geleneği bozmayalım, pygame ekranımıza "Merhaba Dünya" yazdırarak başlayalım.
#!/usr/bin/env python
import pygame
WINDOWWIDTH = 800
WINDOWHEIGHT = 600
WHITE   = (255, 255, 255)
BLACK =   (0, 0, 0)
def main():
    pygame.init()
    while True:
        window = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
        pygame.display.set_caption('Hello World')
        BasicFont = pygame.font.Font('freesansbold.ttf', 20)
        text = BasicFont.render("Hello World", True, BLACK)
        textCoord = text.get_rect()
        window.fill(WHITE)
        window.blit(text, textCoord)
        pygame.display.flip()

if __name__ == "__main__":
    main()
Kodumuzu adım adım açıklayalım şimdi.
import pygame
WINDOWWIDTH = 800
WINDOWHEIGHT = 600
WHITE   = (255, 255, 255)
BLACK =   (0, 0, 0)
Pygame'i import ettikten sonra gerekli değişkenleri tanımlıyoruz.Bildiğiniz gibi renk kodları 0-255 arasında değer alan 3 elemanlı bir tuple'dır.
pygame.init()
İmport edilmiş modülleri başlatıyoruz.Bunu yazmadığımız takdirde module not initialized hatası verecektir.
window = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
set_mode() ile 800x600 pixellik bir pencere oluşturuyoruz.Burada kullanmadık ama bu fonksiyon opsiyonel 2 argüman daha almaktadır.flags ve depth.flags ile penceremize özellik atayabiliriz.Kullanabileceğimiz özellikler: pygame.FULLSCREEN,pygame.RESIZABLE,pygame.NOFRAME ...
pygame.display.set_caption('Hello World')
Penceremize başlık atıyoruz.
BasicFont = pygame.font.Font('freesansbold.ttf', 20)
Yazımızın font'unu ve boyutunu ayarlıyoruz.
text =BasicFont.render("Hello World", True, BLACK)
Ekrana bastıracağımız yazımızı render ediyoruz.Burada ikinci parametreye-antialias(yumuşatma)-yazımızın daha güzel görünmesi için True atadık .
textCoord = text.get_rect()
get_rect() fonksiyonu verilen surface için(burada text değişkenimiz) rectangular alan belirliyor.Daha sonra bu değişkenin özelliklerini kullanarak nesnemizin koordinatlarını belirleyebileceğiz.
window.fill(WHITE)
Penceremizin arkaplanını beyaz yapıyoruz.
window.blit(text, textCoord)
text değişkenimizi blit fonksionuyla verilen koordinata yerleştiriyoruz.textCoord 'a parametre atamadığımız için ön tanımlı olarak (0,0) koordinatına yerleşmektedir.
pygame.display.flip()
Ekranımızı update ediyoruz.Benzer bir işi yapan bir fonksiyon daha var: pygame.display.update() .Parametresiz, flip() ile aynı işi yapmaktadır.Parametre verdiğimiz takdirde ise ekranın belli bir alanını güncelleyebilmekteyiz.

Kaynakça:

Koşul İfadeleri


Koşul ifadeleri, program yazarken en çok başvurulan ifadelerden biridir. Bazen program içerisinde iki veya daha fazla ifadenin karşılaştırılması gerekebilir. Bu durumdan dolayı bütün programlama dillerinde karşılaştırma deyimleri mevcuttur. Bunun için Python'da if-else-elif deyimleri kullanılır. Ancak bazı programlama dillerinde bulunan switch-case yapısı Python'da bulunmamaktadır.
Koşul ifadelerine başlamadan önce Python dilindeki önemli bazı noktalara değinmek gerekir. C/C++ gibi dillerde yazılmış kodlarda bloklar { } içinde bulunur; ancak Python'da bloklar için belli bir işaret yoktur. Bunun yerine satırlarda girintileme uygulanır. Girintileme yapısı Python için büyük önem taşımaktadır.
Örneğin;
# !/usr/bin/env python
# -*- coding: utf-8 -*-

a = 7
if a == 7:
    print ("Sayı 7'dir.")
şeklindeki kodu
# !/usr/bin/env python
# -*- coding: utf-8 -*-

a = 7
if a == 7:
print ("Sayı 7'dir.")
şeklinde yazamayız. Çalıştırılmak istendiğinde de hata verecektir. Girdi miktarının pek bir önemi yoktur; ancak program yazılırken bazı yerlerde "tab" tuşuna basarak, bazı yerlerde de "space" tuşuna basarak girinti vermek hatalara yol açabilir. Python IDE(Integreted Development Environment)'lerinin girinti için bıraktıkları sekme genişliği genellikle 4'tür. Kullanılan metin editörlerine sekme genişliği 4 olarak ayarlanabilir. Eğer yazılan kodlar birden fazla kişi tarafından düzenleniyorsa, ortak proje geliştiren kişilerin sekme ayarında belli bir kuralı benimsemeleri gerekir.


if Deyimi

"if" Türkçe'de "eğer" anlamına gelmektedir. Anlamından da anlaşıldığı gibi bu deyimle bir koşul belirtilir. 
if yapısının akış diyagramı aşağıdaki şekildeki gibidir.

Python programlama dilinde bir if deyiminin yazılışı;
if koşul:
    ifadeler
şeklindedir. Burada koşul "true" değer alıyorsa, yani koşul sağlanıyorsa blok kısmındaki ifadeler gerçekleşecektir. Eğer koşul "false" değer alıyorsa, yani koşul sağlanmıyorsa blok kısmındaki ifadeler gerçekleşmeden program devam edecektir.
Bir örnek verelim:
# !/usr/bin/env python
# -*- coding: utf-8 -*-

sayi = 7    # sayi diye bir değişken tanımlandı ve değeri 7
if sayi < 10:     # sayi, 10'dan küçük mü diye sorgulanmakta
    print ("Sayı 10'dan küçüktür.") # eğer sayi 10'dan küçükse ekrana "Sayı 10'dan küçüktür." yaz

elif Deyimi

Karşılaştırmalarda koşulların artması durumunda kullanacağımız terimlerden biri de elif deyimidir. elif deyimi, else if'in bir kısaltmasıdır.
Şöyle bir örnek üzerinden açıklamak gerekirse:
# !/usr/bin/env python
# -*- coding: utf-8 -*-

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

if sayi < 0:
    print ("Sayı 0'dan küçüktür.")
elif sayi == 10:
    print ("Sayı 10'dur.")
elif sayi > 5:
    print ("Sayı 5'ten büyüktür.")
elif sayi > 10:
    print ("Sayı 10'dan büyüktür.")
Bu kod çalıştırıldığında program koşulu sağlayan ilk ifadeyi bulduktan sonra blok kısmındaki işlemleri gerçekleştirecektir ve geriye kalan koşulları dikkate almayacaktır. Örneğin kullanıcı 10 girmişse çıktı şu şekilde olacaktır:
Sayı 10'dur.
Aynı kodu şu şekilde sadece if kullanarak yazsaydık:
# !/usr/bin/env python
# -*- coding: utf-8 -*-

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

if sayi < 0:
    print ("Sayı 0'dan küçüktür.")
if sayi == 10:
    print ("Sayı 10'dur.")
if sayi > 5:
    print ("Sayı 5'ten büyüktür.")
if sayi > 10:
    print ("Sayı 10'dan büyüktür.")
Bu durumda program bütün koşulları tek tek sorgulayacaktır. Kullanıcının yine 10 girdiğini varsayarak bu durumda da ekran çıktısı şu şekilde olurdu:
Sayı 10'dur.
Sayı 5'ten büyüktür.
Bu yüzden if-elif kullanımı önemlidir.

else Deyimi

else deyimi, if ve elif deyimleri ile kombine çalışır. else, if ve elif deyimlerindeki koşulların sağlanmadığı bütün durumları kapsar. else deyiminin akış diyagramı aşağıdaki şekildeki gibidir.

else deyimi isteğe bağlı bir ifadedir ve if-elif bloklarıyla birlikte sadece bir kez kullanılır.
Python dilinde else deyiminin yazılışı;
if koşul:
    ifadeler
else:
    ifadeler
şeklindedir. Koşul ifadeleri iç içe de kullanılabilir.
Bütün bu bahsettiklerimizi bir örnek üzerinde göstermek gerekirse:
# !/usr/bin/env python
# -*- coding: utf-8 -*-

sayi = input("Bir sayı giriniz:") # Kullanıcıdan bir sayı girmesi isteniyor

if sayi > 0:    # Girilen sayı 0'dan büyük ise
    print ("Sayı pozitiftir.")
    if sayi % 2 == 0:   # Sayı 0'dan büyük ve çift olması durumu
        print ("Sayı çifttir.")
    else:    # Sayı 0'dan büyük ve tek olması durumu
        print ("Sayı tektir.")
elif sayi < 0:    # Girilen sayı 0'dan küçük ise
    print ("Sayı negatiftir.")
else:     # Sayının 0 olma durumu (if ve elif durumlarının dışında kalan bütün durumlar)
    print ("Sayı sıfırdır.")

bool Deyimi

Şimdi de biraz bool kavramından bahsedelim. Nedir bu bool denilen şey?
Bilgisayar bilimi temelde 0 ve 1 değerleri üzerine kurulmuştur. Yani 0 değeri False(Yanlış), 1 değeri True(Doğru) demektir. Bu değerlere boolean değerler denir. Bu isim İngiliz matematikçi George Boole'dan dolayı verilmiştir.

Bool değerlerin büyük harfle başlamaları Python açısından önemlidir. Bu değerler karşılaştırma ifadeleri sonucunda oluşurlar. Bool değerler sadece doğruluk-yanlışlık sorgulaması yapmazlar. Bilgisayarda her şeyin bir bool değeri vardır.
Buraya kadar bahsettiklerimizi örneklerle gösterelim:
>>> bool(5)
True
>>> bool("Uygar")
True
>>> bool("    ")
True
>>> bool("")
False
>>> bool("0")
True
>>> bool(0)
False
Kodlarda da görüldüğü gibi 0 sayısı ve boş karakter dizisi False'tur. Geriye kalan her şey True olur.
NOT: Burada ("0") bir string, (0) ise bir integer değerdir.

ALIŞTIRMALAR için tıklayınız...


22 Nisan 2013 Pazartesi

Kullanıcıdan Girdi Almak

Kayıtlı Python Dosyasını Çalıştırmak
Kullanıcı ile etkileşime geçmeden önce bir "Python dosyası nasıl oluşturulur?" ve "Komut satırında nasıl çalıştırılır?" bundan bahsetmeliyiz.
Python dosyası oluştururken ilk yapmamız gereken ilk satıra
   #!/usr/bin/env python
yazmaktır. Bu komut yazacağımız kodların Python kodları olduğunu ve Python'un sistemdeki konumunu belirtir. Eğer istenilirse Python'nun yolu direkt olarak da belirtilebilir. Fakat her sistemde aynı olmaması ve kullanıcının tam olarak nerede olduğunu bilmemesinden dolayı "env" betiği kullanılmaktadır. Bu betik sayesinde sistemde Python nerede olursa olsun program onu kendisi bulur. Bu satırı yazdıktan sonra kodun devamını istediğimiz gibi şekillendirebiliriz.
Peki Python dosyasını kaydettik ama nasıl çalıştıracağız?
Bu sorunun cevabı oldukça basittir. Yapmanız gereken "uç birimde" oluşturduğunuz Python dosyasının bulunduğu dizine gitmek ve şu kod parçacığını yazmaktır.
   python dosyaAdi.py

Kullanıcıdan Veri Almak

Bugüne kadar yaptığımız bütün örneklerde her zaman tek taraflı işlemler yaptık.Yani kullanıcı programa hiç müdahalede bulunamadı. Bu yazımızda kullanıcının Python ile nasıl etkileşime geçeceğinden bahsedeceğiz.
Python da kullanıcı ile etkileşime geçebilmek için input() ve raw_input() fonksiyonları kullanılır. Şimdi bu fonksiyonları ve aralarındaki temel farkları inceleyelim.

raw_input() Fonksiyonu
raw_input() fonksiyonu klavye aracılığı ile kullanıcıdan veri alınmasını sağlar. Daha iyi anlayabilmeniz için basit bir örnek ile açıklayalım.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

ad = raw_input("Lütfen adınızı giriniz:")
print ad
Yukarıdaki programda ilk satırdaki kodun ne işe yaradığından ve kaydedilen bir Python dosyasının çalıştırılmasından yazının başında bahsetmiştik. Gelelim şuan bizi ilgilendiren kodlara; Gördüğünüz gibi raw_input() fonksiyonu içinde "Lütfen adınızı giriniz:" açıklaması yapılarak programın kullanıcıdan ne beklediği belirtilmiştir. Bu açıklamayı yapmak zorunda değilsiniz. Ama kullanıcının programın kendisinden ne beklediğini anlayabilmesi için yazmanız daha faydalı olacaktır. Burada raw_input() fonksiyonunun anlaşılabilmesi için basit bir örnek yapılmıştır.Şimdi ise kullanıcının girdiği iki sayıyı topladıktan sonra ekrana yazdıran programı yazmaya çalışalım.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print "İki Sayıyı Toplayan Program"
sayi1 = raw_input("Birinci Sayıyı Giriniz:")
sayi2 = raw_input("İkinci Sayıyı Giriniz:");

toplam = sayi1+sayi2
print toplam
Bu programı çalıştırdıktan sonra 10 ve 15 değerlerini girerseniz şu şekilde bir çıktı ile karşılaşacaksınız.
İki Sayıyı Toplayan Program
Birinci Sayıyı Giriniz:10
İkinci Sayıyı Giriniz:15
1015
Gördüğünüz gibi biz programın iki sayıyı toplamasını isterken;program iki sayıyı yan yana ekleyerek ekrana yazdı. Buradan da anlayacağınız gibi raw_input() kullanıcı tarafından girilen bütün değerleri karakter dizisi olarak alır. Yani Python için girilen iki değer sayı değildir.Bu yüzden de iki karakter dizisini uç uca eklemiş oldu. Programın kod yapısını şu şekilde değiştirelim.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

print "İki Sayıyı Toplayan Program"
sayi1 = raw_input("Birinci Sayıyı Giriniz:")
sayi2 = raw_input("İkinci Sayıyı Giriniz:");

toplam = int(sayi1)+int(sayi2)
print toplam
Aynı değerleri bu program için girdiğinizde aşağıdaki gibi bir sonuçla karşılaşacaksınız.
İki Sayıyı Toplayan Program
Birinci Sayıyı Giriniz:10
İkinci Sayıyı Giriniz:15
25
Peki neden bu şekilde oldu? Eğer bu sorunun cevabı hakkında pek bir fikriniz yoksa;Değişkenler başlıklı yazıyı okumalısınız. Burada programın elinde bulunan karakter dizilerini sayıya çevirmesi için int() fonksiyonundan yararlandık. Şimdi bir de input() fonksiyonunu inceleyelim.
input() Fonksiyonu
Tıpkı raw_input() fonksiyonu gibi input() fonksiyonu da kullanıcıdan klavye aracılığıyla veri alınmasını sağlar. Az önce verdiğimiz örneği şimdi de input() ile yapmaya çalışalım.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
print "İki Sayıyı Toplayan Program"
sayi1 = input("Birinci Sayıyı Giriniz:")
sayi2 = input("İkinci Sayıyı Giriniz:");
 
toplam = sayi1+sayi2
print toplam
Bu programı çalıştırdığınız da şu şekilde bir sonuç alacaksınız.
İki Sayıyı Toplayan Program
Birinci Sayıyı Giriniz:10
İkinci Sayıyı Giriniz:15
25
Gördüğünüz gibi herhangi bir dönüştürme işlemi yapmadan input() fonksiyonu ile aldığımız değerleri matematiksel olarak toplayabildik. Buradan da anlaşılacağı gibi input() fonksiyonu aldığı değeri karakter dizisi olarak tutmaz. Gönderdiğimiz değerleri sayı olarak tuttuğu için dönüştürme işlemi yapmadan sayıları toplayabildik. Gelin şimdi de şu örneği inceleyelim.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
kelime = input("Bir kelime giriniz:")
Bu programı çalıştırdığınız da şu şekilde bir hata ile karşılaşacaksınız.
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'kelime' is not defined
Az önce de söylediğimiz gibi input() fonksiyonu ile gönderilen değerler karakter dizisi olarak saklanmaz. Eğer kod satırına şunu yazarsanız aynı hata ile karşılaştığınızı göreceksiniz.
>>>kelime
Bir de şu şekilde deneyelim;
Bir kelime giriniz:"pythondersleri.com"
pythondersleri.com
Bu şekilde denediğimiz zaman program herhangi bir hata vermeyecektir. Çünkü biz ona tanıdığı bir tür olan karakter dizisini gönderdik. Buradan anlayacağınız gibi raw_input() fonksiyonu kullanıcıdan aldığı değeri karakter dizisi olarak saklarken input() fonksiyonu kullanıcıdan komut bekler. input() fonksiyonun kullanıcıdan komut beklemesi bazı güvenlik sorunlarına sebep olmaktadır.
Güvenlik Sorunları
Yukarı da söylediğimiz gibi input() fonksiyonu kullanıcıdan komut bekler.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

sayi = input("Bir kelime giriniz:")
print sayi
Bir sayı giriniz:3*6
18
Bu örnekte input() komutunun komut beklediğini çok net bir şekilde görebiliyorsunuz. Kullanıcının "3*6" olarak girdiği ifadeyi komut olarak gördü ve "*" operatörünü işleme soktu. input() fonksiyonunun bu özelliği yanında çok ciddi tehlikeler de getirmektedir. Kullanıcı programın istediği "sayi" yerine işletim sistemine ait komutları girerek programa istediği herhangi bir şeyi(dosya silmek,dosya içeriğini görmek vb.) yaptırabilir.
input() fonksiyonun güvenlik sorunlarından dolayı programcılar genellikle raw_input() fonksiyonunu kullanmayı tercih ederler. Zaten bu fonksiyon veri alış verişi ile ilgili her türlü isteğimizi karşılayacak özelliktedir.

Türkçe Karakter Kullanımı
Yukarıda yazdığımız programların hepsinde şu satırı gördünüz.
# -*- coding: utf-8 -*- =>
Python 2.x sürümü Türkçe karakterleri desteklememektedir. Eğer bu kodu yazmadan Türkçe karakter kullanırsanız program hata verecektir. Bu kodu yazarak kullandığımız karakter tipini Python'a tanıtmış oluruz.

Django Nedir ?


Django Nedir?

Google’a django yazdığımızda karşımıza güzel bir film geldiği doğrudur.Fakat bizim bahsedeceğimiz Django o değil ama en az onun kadar güzel bir şey.Django Python dili ile uğraşmış olan çoğu kişinin duyduğu bir şeydir.Peki nedir bu Django?

Django; Python diline ait bir frameworktür.2005 yılında sunulmasına rağmen fazlaca rağbet görmüş ve ülkemizde de geliştiricileri artmaktadır. Django Python’un 2.x sürümünde çalışmaktadır.3.x sürümü webframeworkleri destekleme konusunda eksiktir.
  • Django dinamiktir , Django’da kod yazmak çok zevklidir.Kod yazarken diğer frameworklere göre kazandığınız hızı fark ettirir.
  • Web Framework Nedir? yazımızda M-V-C yapısından bahsedilmişti.Django’da ise M-V-T yapısı olduğunu söyledik.
  • M-V-T ; Model-View-Template’dir.Model-View-Url şeklinde de rastlayabiliriz buna.
  • M => Model, veritabanı işlemlerinin yapıldığı yer. Django’nun bir diğer güzelliği ise sql komutları kullanmadan veritabanı oluşturabiliyoruz.Django’ya özel bir dille veritabanını oluşturuyoruz ve Django bunu kendi yorumlayarak veritabanını oluşturuyor.
  • V  => View. Bu kısım tamamen geliştirme kısmıdır.Hemen hemen tüm python kodlarımızı burada konuşturacağız.
  • T => Template. Tasarım kısmı.Template sayesinde kodların istenen kısımları alınır sadece etiketler yazılır ve kod tekrarlamalarından kurtulunmuş olunur.
İyi güzel anlattınızda Python yeteri kadar hızlı bir dil mi ? diye sorarsanız, sizleri "Ruby vs Python vs PHP" isimli youtube videosuna davet ediyoruz.



Yararlanılan Kaynaklar :
http://aysekucuk.wordpress.com/2012/09/07/django-nedir/

Web Framework Nedir?

Web Framework Nedir ?

    Framework, dilimizde çerçeve ya da çatı olarak geçmektedir.Web Framework denildiğinde genelde Web Çatısı olarak ifade ederiz.
  Framework’ün genel tanımını yapacak olursak; kullanıcıların daha sağlıklı ve hızlı kodlama yapabilmesi için kullanılan, yazılımın iskeletini oluşturan, proje altyapısıdır.

Şöyle açmak gerekirse, benzer her projede belli bir noktaya kadar yapılan işlemler aynıdır. Bu aşamaları tekrar tekrar icra etmek yerine, neden bizim yapacağımızdan daha sağlam bir yapıyı kullanmayalım?Yani; “Amerika’yı tekrar keşfetmeye gerek yok”.
 Framework kullanmanın avantajlarına değinecek olursak, bir kere iskeleti bizim oluşturmamıza gerek kalmıyor.O bize geliyor ve “Ben sana altyapını sağladım,buradan kodlamana devam et “ diyor.Bu, birçok yazılımcının işini kolaylaştırırken, projenin süreç yönetimini kolaylaştırıyor.
 Çoğu web framework M-V-C pattern’i üzerine merkezlenmiştir.M-V-C ‘ yi açacak olursak;

Model-View-Controller.”
  • Kısa tanımlarla M-V-C’yi tanımlamak istersek; Model,veritabanı işlerimizi yaptığımız katmandır.Veritabanı sorgularımızı burada oluşturur ve dışarıdan erişimi kolaylaştırırız.
  •  Sitenin tasarımı controllerdan alınan verilerle View sayfalarında yapılıyor.Yazılımın,uygulamanın,kullanıcıya görünen kısmıdır.
  •  Controller, en özet tanımıyla Model ile View arasında bir köprü, bir aracıdır.Model’de işlenen verileri View’a aktarır,View’dan gelen verileri Model’e gönderir ve işler.Program akışını yönetir.
        Django’da M-V-C yapısı M-V-T olarak yerini almış.Ancak pek farkı yok.İlerki derslerde bunu açıklayacağız.Nerede hangi web framework kullanılıyor, görmek istiyorsanız o da burada.

Kaynakça:  

http://www.serefakyuz.com/2011/06/web-framework-nedir.html