Cuma, Mart 6

Python Series - 4(for,range and def)


Merhabalar, uzun zamandır yazmak isteyipte yazamadığım şu yazıları arayı kapatarak seri şekilde yazmak istiyorum. En son if-elif(bizim sucunun kızı)-else gibi konular işlemişiz hatta bir adette ffmpeg üstünde bir script yazmışız iyi bir atılım olmuş anlamayan arkadaşlar eminim ordan anlayacaklardır.

Neyse, şimdi arayı kapatmamız gerek seri şekilde hareket edersek sanırım kapatırız arayı evet bu konuda karman çorman hemen kolayca konuları anlatmak istiyorum for döngümüzle başlayıp switch kardeşimizle devam edip sonrasında ise try,except,def gibi mevzuları işleyeceğiz neden diye soracak olursanız bu kadar konuyu işleceğiz aslında çok basit bir cevabı var arayı kapatacağız. İlk konumuz olan for döngüsü ki bu mevzu programlamada başı çeken mevzulardan tekidir if-else mevzusu ne kadar öneemliyse bu mevzuda o kadar önemli işte.

Peki kardeşim sef bu for mevzusu nedir diye soracak olursanız elimden geldiği kadar anlatmaya çalışayım;

Kelime bazında bakarsak hepimizin yaygınca bildiği için kelimelisi olarak gözümüze çarpıyor peki işlevi nedir onada bi bakalım;

#!/usr/bin/python

degis = "hamsi"

for i in degis:
 print "Buda nedur",i

Şimdi şöyle bir kod yazalım ve çıktısına bir bakalım;

Buda nedur h
Buda nedur a
Buda nedur m
Buda nedur s
Buda nedur i

Cümleden sonra verdiğimiz değer bir değer görüyoruz "i" peki bu nedir ? Kardeşimiz bu değer bizim null adamımız, şamar oğlanımız, emir erimiz. Önce o değeri hazırlıyoruz sonra degiskeni verdiğimiz de o her bir kelimeyi alıp tek tek karşımıza döktürüyor. Sanırım gayet net ve açıklayıcı bir cümle oldu. Peki bu "i" daha neler yapabilir ? Deneyelim;

#!/usr/bin/python

degis = "hamsi"

for i in range(len(degis)):
 print "Buda nedur",i


Önceki derslerde de gördüğümüz length mevzusu yinede söyleyeyim len mevzusunu kullanarak degiskende kaç tane harf olduğunu ekrana yazdırmış oluyoruz bu sayede. Buraya kadar tamam ama bu range nedir ? Range programlamda karşımıza çıkan hepimizin hatırladığı "i++" mevzusu orda gördüğümüz "++" işareti ki bu iki tane olacak standart bir mevzu şirazeyi kaydırıp 5-10 tane koymayın "1" arttır demek oluyor bu range bizim bildiğimiz koşullu arttırma oluyor. Bunu bir örnekle açıklamaya çalışalım isterseniz;

$i= 0 ; $i <= 10 ; $i++ bunu hatırladık mı? Hatırlamadıysak mevzuyu biraz daha açalım.

İlk gördüğümüz değer $i= 0 <= bu değer şunu diyor $i(-ki bu emir erimiz) sayıyı sıfırdan başlat, $i <= 10 <- eğer sayı 10'dan küçük yahut eşitse yazdır. $i++ <- burda da sayıları bir bir arttır demek istedik yukarıda söylemiştik zaten hatırlarsanız.

Baya bir uzun oldu bu mevzu bunu birde python ile yapmaya çalışalım isterseniz ? İşte burda devreye o yukarıda ki "range" fonksiyonu girecek.

"print range(0,10)"

Dedik peki noldu şimdi ?

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Evet olanlar gayet basit ve net bir şekilde karşımızda yukarıda uzun uzadıya yazmak istediğimiz koşullu döngümüzü burda tek bir fonksiyonla halletmiş olduk. Bitti mi peki? Hayır tabi ki biraz daha devam edelim "i++" nerde diye sorabilirsiniz elbette onada bir bakalım isterseniz;

print range(0,10,2)

Komutunu uyguladığımızda ise karşımıza çıkan ekran;

[0, 2, 4, 6, 8]

O zaman şöyle demiş olduk range(0,10,2) range'de "0" değerini verdiğimiz yer 0'dan başla,10 kadar devam ettir ve 2 sayı atlaya atlaya ekrana yazdır.

tabi burda illede ben on sayısını dahil etmek istiyorum derseniz onun içinde bir operator(<,>,=) kullanırsınız artık :)

Ek olarak sayıları birde yukarıda anlattığımız gibi döngü içinde kullanma şekline bakalım isterseniz;

#!/usr/bin/python

for i in range(0,10,2):
 print "bu sayilari birde boyle yazdiralim.", i

Evet bu kodla denedik dediğimizi yaptık;

/* bu sayilari birde boyle yazdiralim. 0
bu sayilari birde boyle yazdiralim. 2
bu sayilari birde boyle yazdiralim. 4
bu sayilari birde boyle yazdiralim. 6
bu sayilari birde boyle yazdiralim. 8 */

Evet çıkan sonucu gördük demek ki bir sql tool felan yazsak ve deneme yanılma yöntemi için bir range felan kullanabiliriz fikir olarak aklımızda klaması iyi oldu :)

He bide "xrange" var ki oda yeni sürümlerde eklenmiş "range" fonksiyonunun gelişmiş halidir hız bakımından döndürülecek bir döngüyü hafızıya kaydederek döndürür ve işler kendi objesini kendi objesi içinde çalıştırır başka yere yüklemez;

/* root@tgseclnx:~/Desktop/pyt/ders# python -m timeit 'for i in range(10):' ' pass'
1000000 loops, best of 3: 0.297 usec per loop
root@tgseclnx:~/Desktop/pyt/ders# python -m timeit 'for i in xrange(10):' ' pass'
1000000 loops, best of 3: 0.248 usec per loop /*

Evet bilmem kaç bin sayıyla döndürdüğümüzde eğer ben zamandan kazanacağım ve daha farklı bir şekilde projelerim var range() bana yetmez derseniz xrange() bu konuda daha anlayışlı ve yetenekli güle güle kullanabilirsiniz.

Evet döngülerimizden bir kaç örneği bu sayede görmüş olduk şimdi farklı fonksiyonlarıda işin içine katarak döngülerle bir işler yapmaya çalışalım. Çalışalım ki insanlar sadece burdan alıp sayı döndürmesin "-aaa bak bunuda döndürüyormuş!" desinler en nihayetinde.


Kısmet diyelim burası için hazırladığım aslında "sql checker" gibi bir proje için düşündüğüm bir script üzerinden yola çıkarak fonksiyonları inceleyelim hemde bakalım neler yapmışız;

/*


newdata = filedata.replace("\n","%27a\n")

f = open('sites.txt','w')
f.write(newdata)
f.close()

#SQL Checker
with open('sites.txt') as f:
 for line in f:
  if "SQL syntax" in get_peycs(line):
   time.sleep(2)
  # print "\n"
   print "SQL Bulundu: ",  get_peyce(line)

*/

Sadece bir kaç fonksiyonla daha az yorulan bir projeler yapabileceğimiz sizlerede söylemiştim, burda neler yapmışız bir kaç döngü inceleyelim bakalım :)


Yukarıda ki örnekte döngü ile sadece 1'den 10'a kadar sayı döndürmediğizi görüyoruz peki nasıl ? 

Aslında basit kolay bir algoritma ile şöyle ki; Bir .txt dosyamız olsun ve bizde onun içinde ki değerleri döndürerek ekrana yazdıralım uygun mudur ?


#!/usr/bin/python

f = open('s4.txt','wb')
f.write("http://yolunda.as""http://diaryofinjector.com"'\n')
f.close()

with open('s4.txt') as f:
 for line in f:
  print line

Evet yukarıda ki satılarda önce bir dosya açtık open('filename','mode')[Bu arada 'wb' binary modedir bilginize] değişkenimiz olan 'f' sayısına f.write("dosyaya yazilacak deger") ve son olarak işlemi yaptıktan sonra ise dosyamızı kapattık buraya kadar güzel iyi gidiyor şimdi dosyamızı bir döngüyle okuyalım.

/*
with open('s4.txt') as f:
 for line in f:
  print line
*/

Dosyamızı açtık ve dosyamızın adına f olacak dedik yukarıdan hatırlıyoruz zaten adı üstünde ki değişikenimizi.

Sonrasında yukarı ki derslerde gördüğümüz mevzu karşımıza geldi bi döngürek hele dedik bakalım nasıl dönüyor. Ve for ile döndürdüğümüzde alt alta boşluklu şekilde döndüğünü gördük işte döndüler için böyle bir örnek verebiliriz. Bu örnekleri veriyorum çünkü sadece sayı döndürüp durmayın farklı projelerde yapın örneğin twitter üstünden bana projelerini atan kardeşlerimiz var gerçekten mutlu oluyorum onların birşeyleri başarabilmeleri beni ve bu yazılarında onlara katkı sağlaması beni mutlu ediyor açıkcası. Neyse yazımıza devam edelim.



Son olarak anlatmak istediğim ise "def" fonksiyonu gerçekten benim bile arasıra kullanırken unuttuğum bir ifade bu "definition" kısaca "def" diyoruz biz buna peki bu ne işi yarar diye sorduğunuzu duyar gibiyim. Bu arkadaşımız genelde sık sık bir program içinde yaptığımız işlevleri bir kereye mahsus tanımladığımızda satırlarda bir daha bir daha o kodu yazmak zorunda kalmayız bunu matematiksel olarak ki basit bir şekilde açıklayalım isterseniz;

/*
#!/usr/bin/python

def art(x):
  return x+x
print art(2)
*/

Pekiiiii şimdi ne demiş ona bir bakalım demişiz ki kardeşim bana bir fonksiyon tanımla ve adınıda art koy ve ben onunla birlikte sayının kendisini kendisiyle hele bir toplayayım.

root@tgseclnx:~/Desktop/pyt/teste# python def.py
4

Evet denilen olmuşta zaten bir bakmışız verdiğmiz sayı kendisiyle beraber toplanı vermiş gitmiş bu fonksiyonu biraz daha açmak istiyorum açıkcası çünkü önemli ve kullanışlı bir fonksiyon kendileri ileride baya bir işimize yarayacak. Bu küçük örnekle beraber tanıdığımız fonksiyonumuz olan "def" ifademizle daha neler yapabiliriz onları görelim;


#!/usr/bin/python

def sinyal(numara):
 basla = 2
 for i in range(numara):
   basla = basla * (3+i)
 return basla


#User input giris

giris_yap = int(raw_input("Bir sayi giriniz bakalim:""\n"))
tanimlama_ustunden_yuru = sinyal(giris_yap)
print tanimlama_ustunden_yuru


*/Çıktısı*/
root@tgseclnx:~/Desktop/pyt/ders# python def.py 
Bir sayi giriniz bakalim: 2
24


Şöyle bir kod yazdım açıkcası koduda kopya çektim aklıma bir stil gelmedi nasıl anlatsam diye neyse evet bu kodunda bir açıklamasını yapalım şimdi vesselam napmışız bir görelim;

sinyal adında bir bir fonksiyon tanımlamışız ve bir değişken içinde demişiz ki sen 2'den başla demişiz yukarıda da anlattığımız üzere bir loop döngüsü kurmuşuz oraya "numara" diye ki bu "numara" dediğimiz kardeşimiz aşağıda inputta bizim verdiğimiz değerlerle dönecek. Misal oraya 2 dersek aşağıda küçük bir işlem yapmışız şöyle olacak 

basla = basla * (3+1) >> oba yine matematik demişiz 2 ile çarpıyoruz çünkü başla değişkenine 2 sayısını vermişiz 3+i ise burda ki "i" anahtarımız ise range loopunun içinde dönen sayıları sırayla "i" anahtarına koyacak örneğin şöyle olacak detaylı bakarsak

basla = basla * (3+0)
basla = basla * (3+1)
basla = basla * (3+2)

bu şekilde inputa ben 2 verirsem direkt olarak loop'da da 2 dönecek ve değerleri ona göre kendisi çevirecektir. Kodun aşağısına bakarsak eğer hemen bir integer input girişi yapmışız sadece sayılar girile bilsin diye sonra o input için tanımladığımız değişkeni başka bir değişkende def fonksionunda belirttiğimiz "sinyal" fonksiyonunun içine tanımlayarak yazdır demişiz çıkan sonuç ise input 2 verirsek yukarıda çıktıda görüldüğü gibidir vesselam.


Tabi ki def fonksiyonun içine başka kodlarda koyup istediğini yerde istediğiniz gbi "sinyal()" yazarak kullanabilirsiniz. Bilmiyorum elimden geldiği kadar bu fonksiyonu basit şekilde anlatmaya çalıştım sonradan satırlar arasına sıkıştırmak aklıma geldi açıkcası umarım işinize yarar.



Geçmişten bugüne anlattığım ve kullandığımız fonksiyonlar ile küçük bir tool yazıp sizinlede paylaşmak istedim umarım işinize yarar ve üstünde geliştirmeler yapabilirsiniz;


/*
#!/usr/bin/python
import urllib,urllib2,requests
import sys,os,optparse,feedparser,time
from colorama import Fore, Back, Style

print "Loading Bing Searcher Beta...""\n" # xmpl: python fys2.py -i 81.169.145.148 -e php

parser = optparse.OptionParser()
parser.add_option('-i', action="store", default="")
parser.add_option('-e', action="store", default="")
parser.add_option('-s', action="store", default="")
options, args = parser.parse_args()

def get_peycs(url):
 return requests.get(url).text
def get_peyce(url):
 return requests.get(url).url

d = "http://www.bing.com/search?format=rss&q=ip:'"+options.i+"'+ext:'"+options.e+"'&sc=0-0&sp=-1&sk=&cvid=9f3f7eba268840edb6840c55cd94c824&first=5"

ze = feedparser.parse(d).entries

file = open("sites.txt","w")
for i in ze:
 char = "a"
 # blah = ''.join(+i.laink+','sae') 
 if "php" in i.link:
  file.write("%s\n" % i.link)

file.close()


#Read Site'S
res = open('sites.txt', 'r')
print (Fore.WHITE + res.read())
time.sleep(2)

#Char Add
f = open('sites.txt','r')
filedata = f.read()
f.close()

newdata = filedata.replace("\n","%27a\n")

f = open('sites.txt','w')
f.write(newdata)
f.close()

#SQL Checker
with open('sites.txt') as f:
 for line in f:
  if "SQL syntax" in get_peycs(line):
   time.sleep(2)
  # print "\n"
   print "SQL Bulundu: ",  get_peyce(line)

*/


Şimdi anlatılan bu iki-üç hassas konuyla beraber neler ekleyebileceğimize dair fikirlerinizi bu proje üstünde geliştirebilirsiniz herşeyi açık ve net bir şekilde scriptin içinde zorlanmayacağınız şekilde eklemeye çalıştım umarım üstünden giderek iyi şeyler çıkarabilirsiniz. Ek olarak ben "rss" kaynağını kullanmayı uygun gördün başka bir arkadaş ise direkt olarak sayfayı parse etmeyi uygun görmüş full url çekmek için yapacağınız çalışmaları merakla bekliyorum hoşçakalın.


0 yorum:

Yorum Gönder

Blogger tarafından desteklenmektedir.