code beauty etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
code beauty etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

24 Nisan 2009 Cuma

Python’da Karakter Dizisi İşlemleri

(http://www.gokmengorgen.net adresinden alıntıdır.)

Geçenlerde bir arkadaşım, Python 3′te gettext modülünün nasıl kullanılacağını sormuştu, ben de henüz 3.* sürümünü denemediğim için bir cevap verememiştim. Hala da verebilecek aşamada değilim; ama bu konu üzerinde biraz araştırma yaparken, ilginç bir internet sayfasıyla[1] karşılaştım. Aşağıda paylaşacağım kodların ve bilgilerin Python 2.* serisinde çalışmaması söz konusu olabilir.

Python’da karakter dizilerini iki biçimde çağırabiliyoruz:

  • Karakter dizileri için % işleyicisi[2].

  • string.Template modülü[3]



% işleyicisiyle kullanım örneği, Python belgelerinde verilmiş:


>>> print('%(language)s has %(#)03d quot types.' % {'language': "Python", "#": 2})
#Python has 002 quot types.


Bu kodda değişkenler bir sözlük içinde eşleştirilmekte ve print çıktısında tanımlanmış değerleriyle ekrana yazılmaktadır. Bunun aynısı şu şekilde de yapabilirdik:


>>> print('%s has %03d quot types.' % ("Python", 2))
#Python has 002 quot types.


Birincisine göre daha basit olsa da, birinci kodda şöyle bir avantaj söz konusudur:

>>> print('The %(first)s variable, and the %(second)s variable.' % {'second': "New", 'first': "Old"})
#The Old variable, and the New variable.


Bu şekilde kullandığımız zaman, ikinci işleyiciyi ilk olarak tanımlayıp, ikinci işleyiciyi ise sonra tanımlayabilme fırsatımız olabiliyor. Nerelerde kullanılabileceği ayrı bir merak konusu. Bu merakı gidermeden önce bir de şu şekilde kullanıma bir bakalım:


>>> print('The {1} variable, and the {0} variable.'.format("New", "Old"))
#The Old variable, and the New variable.


İlginç, değil mi? Aslında bu kadar çeşitlilik olması garibime gidiyor; ama bu son yöntemin yüksek seviye programlama diline daha yakın bir tarz olduğunu düşünmeden edemiyorum. Yanılmıyorsam bu tip kullanım, C# ve Java’da da var. Şimdi son olarak aşağıdaki kodu inceleyelim:


import sys

class Main:
def __init__(self):
print("Python version is, {0}.".format(sys.version[:5])) # print'lerin yazimina dikkat..

digits_list = self.digits()

print("{1} is bigger than {0} as digit.".format(digits_list[0], digits_list[1]))

def digits(self):
try:
first_digit = int(input("Please write a digit: ")) # raw_input yerine input kullaniliyor.
second_digit = int(input("And second digit: "))

except ValueError:
print("\nSorry, you must enter a digit.")
exit()

return self.sort(first_digit, second_digit)

def sort(self, x, y):
return sorted([x,y])

if __name__ == "__main__":
Main()


Kodun yaptığı şey basit: Sizden iki sayı girmeniz isteniyor ve sayıları, büyüklüklerine göre {0} ve {1} ile eşleştirip, “X, Y’den sayıca büyüktür.” gibisinden bir cümle döndürüyor. Kod basit olduğu için bu tip karakter dizisi işleyicilerin faydası pek belli olmuyor; ama mutlaka bir yerde faydası vardır =). Son kodun çıktısı şu şekilde:


[gkmngrgn@gacer ~]$ python3 rank.py
Python version is, 3.0.1.
Please write a digit: 3
And second digit: 1
3 is bigger than 1 as digit.
[gkmngrgn@gacer ~]$


[1]: http://www.python.org/dev/peps/pep-3101/
[2]: http://docs.python.org/library/stdtypes.html#string-formatting-operations
[3]: http://docs.python.org/library/string.html#string.Template

15 Ağustos 2008 Cuma

Kurtar Beni Lambda

Bazen öyle şeylere ihtiyaç duyuyorum ki, "Bunun için de şimdi bilmem kaç satır döngü oluşturmaya değer mi?" diye düşünmeden olmuyor. Mesela XfceP'i yaparken de öyle bir olayla karşılaşmıştım.

Sizi bilmem ama, böylesi basit bir şey için döngü oluşturmayı da fazlasıyla lüks buldum, o nedenle de lambda bazı yerlerde gerçekten işe yarayan bir araç. Özellikle, for döngüsü içinde birkaç tane daha döngü kurunca, bir tiksinti kaplıyor içimi, şu linkte[1] anlatıldığı gibi:

nums = range(2, 50)
for x in nums:
divided = False
for i in range(2, x - 1):
if (x % i) == 0:
divided = True
if divided == False:
print x,

Halbuki lambda bu karışıklıktan tek bir satırda kurtulmanıza izin veriyor:

>>> nums = range(2, 50)
>>> for i in range(2, 8):
... nums = filter(lambda x: x == i or x % i, nums)
...
>>> print nums
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

Lambda'nın, map & filter & reduce hedelerine ise daha sonra değinirim artık..

[1]: http://www.secnetix.de/olli/Python/lambda_functions.hawk

14 Ağustos 2008 Perşembe

Kodlarken

Python ile programlama yaparken proje arkadaşım Mirat'le beraber (hatta ona çaktırmadan) bir kural listesi oluşturmuştum. Paylaşayım dedim:
  • Programın anadili İngilizce olmalı.
  • Noktalama işaretlerinden önce boşluk bırakılmaz, sonra bırakılır.
  • Operatörlerden hem önce, hem de sonra boşluk bırakılır.
  • (), {} ve []'lerden önce boşluk bırakılmaz, sonra bırakılır; hatta bir alt satıra konulur.
  • Eğer çıktı ekrana yazdırılacaksa " "; yazdırılmayacaksa ' ' kullan.
  • Her fonksiyonun altına açıklama gir.
  • Türkçe'mizi güzel kullanalım, trafik kurallarına uyalım.
  • Her fonksiyon, sınıf, döngü ve try - except arasında bir satır boşluk olsun.
  • Tab mutlaka 4 boşluk olarak ayarlanmalı.
  • Emacs veya Vim'in güzelliği, gereksiz boşlukları göze batırıp (hele ki emacs'te) kodu kirli göstermesindedir. Gereksiz boşluklar, Emacs'te kırmızı arkaplan, Vim'de ise nokta şeklinde gözükür.
  • Fonksiyon ve sınıf isimleri İngilizce olmalı. Eğer birden fazla kelimeden oluşuyorsa, boşluk yerine alt çizgi konulmalı ve hepsi küçük harfle yazılmalı; veya boşluk bırakmaksızın, sonraki kelimenin ilk harfi büyük yazılmalı. Örneğin:

    def check_local_folder():
    print "hede"

    def CheckLocalFolder():
    print "dede"

Evet çok acemice; ama biz bunları uyguluyoruz. Bir de boşluklara çok mu kafayı taktık, ne.. Bu arada Alper Kanat'ın önerileriyle bir iki şey değiştirdim. Esasında biz bunu uyguluyoruz :P