Ara 092017
 
1.003 kez okundu

Pythonda Liste Kısaltmaları

Liste kısaltmaları (list comprehensions), Python diliyle basit, kolay anlaşılır ve hızlı bir şekilde listeler oluşturmamızı sağlar.

Liste Kısaltmaları

Örneğin 0 ile 10 arasındaki ( 0 ve 10 dahil) tam sayıların karelerini hesaplayıp, sonuçları bir liste haline getirelim.

Bu işlemin en basit yöntemi for döngüsü kullanmaktır.

Aynı listeyi list ve map fonksiyonları kullanarak da oluşturabiliriz:

Üçüncü yöntemimiz ise liste kısaltması kullanmaktır:

Her üç yöntemin sonucu da aynıdır:

Şimdi 5 ile 18 arasındaki (5 ve 18 dahil) sayılarla 2’nin üssünü hesaplayalım:

Sonuçlar aynı:

3 ile 28 arasındaki çift sayılar:

Sonuçlar aynı:

2 ile 24 arasındaki tek sayılar için liste kısaltması:

Sonuçlar:

Kısacası yinelenebilir (iterable) bir nesneden bir liste oluşturmak istediğimizde:

Liste kısaltmamıza filtre uygulamak içinse if anahtar sözcüğünü kullanıyoruz:

Bir önceki yazımda liste kısaltmalarının for döngülerinden ve map() fonksiyonundan daha hızlı çalıştığını belirtmiştim.

Şimdi bu kıyaslamayı basit bir örnek üzerinden kendimiz yapalım. Kıyaslama işleminde bir dekoratör fonksiyonu kullanalım.

Sonuç:

Elbette bu sonuçlar betiği çalıştırdığınız bilgisayarın çalışma hızına da bağlıdır ama, aynı işlemin farklı yöntemlerle uygulanmasının farklı süreler aldığını açıkça görebiliyoruz.

Eğer yazdığınız kodlar çalışma hızına duyarlı ise, kesinlikle liste kısaltması kullanmanızı öneriyorum. Eğer böyle bir kaygınız yoksa ve Python konusunda çok fazla deneyiminiz bulunmuyorsa, for yöntemini kullanın. Böylece map veya liste kısaltmasının içeriğini algılamak için çaba sarfetmenize gerek kalmaz.

Şahsen ben, bu konuda Guido van Rossum’a katılıyorum: Eğer çok özel nedenleriniz yoksa lambda, map, filter ve reduce gibi ek araçlara ihtiyacınız olmayacaktır.

Ahmet Aksoy

Referanslar:

Ara 082017
 
1.975 kez okundu

Python Dilinde Lambda, Map, Filter ve Reduce

İşler hep Guido van Rossum’un istediği gibi gitseydi, Python dilinde lambda, map, filter ve reduce kavramları olmayacaktı. Ama bazı gruplardan gelen talepler ağır bastı; sonuç olarak lambda, map ve filter Python çekirdeğinde varlıklarını sürdürmeye devam ederken, sadece reduce functools modülüne kaydırıldı.

Rossum’un bu terimlere karşı çıkmasının gerekçeleri şunlardı:

    • Liste kısaltmaları (list comprehensions) lambda, map, filter ve reduce yerine daha güçlü bir şekilde kullanılabilir.
    • Liste kısaltmaları daha açık ve anlaşılırdır.
    • Python yaklaşımına aykırı bir şekilde, aynı soruna yönelik birden fazla Python çözüm yöntemi olacaktır.

Liste kısaltmaları for döngülerine kıyasla % 35, map fonksiyonuna kıyasla %45 daha hızlı çalışmaktadır. Dolayısıyla kodlama yaparken bu ayrıntıları da bilmekte yarar var.

lambda Fonksiyonu

ile

fonksiyonları aynı işleve sahiptir.
İlkinde anonim bir fonksiyon tanımlayıp, bu fonksiyonu kare değişkenine atıyoruz. Diğerinde ise doğrudan bir fonksiyon tanımlıyoruz.

map Fonksiyonu

map fonksiyonu 2 argüman alır. İlk argüman bir fonksiyon, ikinci argüman ise bir dizilimdir (sequence). map fonksiyonu ilk argüman olarak verilen fonksiyona dizilim elemanlarının her birini argüman olarak atar ve sonuçları bir map nesnesi olarak geri döndürür.

Sonuçlar:

filter Fonksiyonu

Bu fonksiyon da tıpkı map gibi ilk argüman olarak bir fonksiyon, ikinci argüman olarak bir dizilim alır. Ancak geriye sadece, fonksiyona uygulandığında True değer üreten dizilim elemanlarını döndürür.
Aşağıdaki kod satırları 1 ila 20 arasındaki sayılardan 3’e tam olarak bölünenleri geri döndürmektedir.

Sonuçlar:

reduce Fonksiyonu

Bu fonksiyon functools modülünde yer alır ve geriye tek bir sonuç döndürür.
Örneğin 1 ile 100 arasındaki sayıların toplamını bulalım:

Sonuç:

Bir sonraki yazımda liste kısaltmaları (list comprehensions) konusunu ele alacağım.

 

Ahmet Aksoy

Referanslar:

 

Ara 062017
 
935 kez okundu

Pythonda Fonksiyon Dekoratörleri

En kaba tanımıyla dekoratörler, yazılım tasarım kalıplarıdır.

Dekoratörler fonksiyon, metod ve sınıfların işlevselliğinin, dekore edilen fonksiyonun veya alt sınıfların kaynak kodlarında değişiklik yapmaya gerek kalmadan değiştirilebilmesini sağlarlar.

Pythonda Fonksiyon Dekoratörleri

Özetle dekoratörler, yapısını değiştirmek istemediğimiz fonksiyonların davranışlarını; yani işlevlerini değiştirmek amacıyla kullanılır.

Dekoratörler, fonksiyonların hem parametre, hem de dönüş değeri olarak kullanılabilme özelliğine dayanır.

“@” işareti dekoratör tanım operatörü olarak kullanılır. (Aynı işaret matris çarpım operatörü olarak da kullanılmaktadır.)

Şimdi dekoratör uygulamasını örnekleyecek küçük bir örnek geliştirelim.
Eğer Türkçe karakterlerin kullanımı konusunda benim gibi titiz biriyseniz, string.lower() fonksiyonu uygulanmış Türkçe karakterlerden ‘I’ harfinin ‘ı’ yerine ‘i’ olarak geri döndüğünü farketmişsinizdir.

Bu hatayı gidermek için tr_lower_dekorator isimli bir fonksiyon hazırlayalım. Bu dekoratör fonksiyonumuz parametre olarak func isimli bir başka fonksiyon alıyor. Bu fonksiyonun aldığı parametre ise x stringi.

Dekoratör fonksiyonumuzun içinde fonksiyon(x) isimli ara fonksiyonumuz mevcut. Bu fonksiyon, önce, parametre olarak aldığı x stringindeki ‘I’ karakterlerini ‘ı’ harfine dönüştürüyor, sonra da orijinal fonksiyonu çağırarak ‘I’ harfleri düzeltilmiş stringe lower() fonksiyonunu uyguluyor.

Kodlar aşağıda. Sormak istediğiniz bir şey olursa, en aşağıdaki yorum alanını kullanabilirsiniz.

Betiğimizin döndürdüğü bilgiler şöyledir:

İlk satırda orijinal string, ikinci satırda string.lower() fonksiyonu kullanılarak elde edilmiş string, son satırda ise string.lower() fonksiyonuna dekoratör uygulanmış haliyle üretilmiş string yer almaktadır.

turkce_lower02() fonksiyonunu kolayca düzenleyip doğru sonuç üretmesini sağlayabilirdik. Örneğimizin anlaşılabilir olması için böyle basit bir fonksiyon kullandım. Bu fonksiyon yerine çok daha karmaşık bir fonksiyon olsaydı, dekoratörün etkisi daha açık bir şekilde ortaya çıkacaktı.

Dekoratörler bottle, flask ve django gibi ağ çerçevelerinde (web application framework) sıklıkla kullanılmaktadır.

Ahmet Aksoy

Referanslar:

Ara 062017
 
1.611 kez okundu

Python Zemberek Masaüstü

Herhangi bir yazının içinde geçen tüm Türkçe sözcükleri topluca kök ve eklerine ayırmak için Zemberek java kütüphanesini kullanan basit bir masaüstü uygulama geliştirmeye başladım.

Java dönüşümünü yine jpype aracılığıyla yapıyorum. Grafik kullanıcı arayüzü kütüphanesi olarak da tkinter’den yararlanıyorum.

Python Zemberek Masaüstü

Pek çok python kullanıcısı tkinter’e uzak duruyor. Bence tkinter’e biraz haksızlık ediliyor. Üstelik en güncel python GUI’si olarak bu kütüphane var. Her yeni python sürümüyle birlikte en uyumlu tkinter bileşenleri de geliyor.

Uygulamamızda iki Text kutucuğu bulunuyor. Bunlardan birisi çözümlemek istediğimiz metni barındırıyor. Diğer kutucukta ise elde ettiğimiz sonuçları raporluyoruz.

Şimdilik çok işlevsel olmasa da bir arama kutucuğumuz mevcut. Ek olarak çeşitli butonlarımız var. Bu butonların adı ve işlevi zaman içinde değişebilir.

Betiğimizin adı, zembil.py.

Kodların ayrıntılı açıklamasına girmiyorum. Sormak istediğiniz sorular olursa yazının altındaki yorum alanını kullanabilirsiniz.

Bu da zemberek_cozum.py dosyası:

Ahmet Aksoy
(Python Zemberek Masaüstü)

Ara 012017
 
1.546 kez okundu

Python Zemberek Bağlantısını Güncelleyelim

Python Zemberek Bağlantısı2016 Mayısında yazdığım Python ile Zemberek Kütüphanesini Kullanmak makalesini artık güncellemenin zamanı geldi.

Aslında güncellenecek pek fazla şey yok.
Çünkü: zemberek-tum-2.0.jar kütüphane dosyası yine aynı.
JPype1-py3 bileşeninin sürüm numarası değişmedi: 0.5.5.2.
Sadece benim şimdiki Ubuntu sürümüm 16.04 ve Python sürümüm ise 3.6.3.

Önceki yazımda verdiğim kodlar bire bir geçerli.

Yine de kodları son haliyle anımsamakta yarar var:

Önceki yazımda zemberek-tum-2.0.jar dosyasının içindeki (veya herhangi bir jar dosyasının içindeki) sınıfların listesini nasıl elde ettiğimi belirtmemişim.
Aşağıdaki komut, bu listeyi elde etmemizi sağlıyor:

jar dosyasının adını değiştirerek istediğiniz sınıf listesini dökebilirsiniz.

Bu arada sevindirici bir başka haber: Zemberek projesi yeni bir yapılanmayla tekrar gündemde: Zemberek-NLP
Akın kardeşler Zemberek projesini eskisinden bağımsız bir şekilde yeniden geliştiriyorlar.
Sonucu ben de merakla bekliyorum.

Ahmet Aksoy