Python Lisanındaki Üreteçler Nedir? Neden Kullanılmalı?
Bir uygulamanın kodlanma süreci, ziyadesiyle sorunlu bir süreçtir. Yazılımcılar, binlerce satır kodlama yaparken bu kodların düzgün olarak …
Bir uygulamanın kodlanma süreci, ziyadesiyle sorunlu bir süreçtir. Yazılımcılar, binlerce satır kodlama yaparken bu kodların düzgün olarak çalışabilmesi için ağır bir efor sarf ederler. Aksi takdirde yazılan kodlar çalışmayacaktır ve bu da yazılımcılar için önemli bir sorun teşkil ediyor.
Geliştiriciler, bir uygulamayı hazır hale getirebilmek için, uygulamanın kullanılacağı platform kapsamında çeşitli yazılım lisanları kullanabiliyorlar. “C”, “Java”, “Swift” ve “Python” üzere programlama lisanlarını bu bağlamda örnek olarak gösterebiliriz. Bu haberimizin konusu ise Python programa lisanında kullanılan, İngilizce olarak “Generators”, Türkçe karşılığı ise “Üreteç” olarak geçen komutlardan bahsedeceğiz. “Üreteçler nedir?” ve “Neden Kullanılmalı?” sorularının karşılıklarını, bu haberimizde görebileceğiz.
Üreteçler, Python yazılım lisanında kullanılan tesirli sistemlerden bir adedidir. Profesyonel geliştiriciler, bu komutları kullanarak hem daha güzel bir kod sistemine sahip oluyorlar hem de bu komutlar sayesinde uygulamalar daha rahat bir biçimde çalışabiliyor.
Yazılım geliştiriciler, bir kodlama sırasında sıralı bilgilerden sık sık faydalanıyorlar. Bu sayede bilgiler rahat bir halde kullanılıyor, kimi vakit da veritabanlarında depolanıyor. Fakat bu durumun bir dezavantajı bulunuyor. Sıralı bilgilerde bulunan öğelerin sayısı ön görülemez. Kimi vakit makul sayılarda öğeler bulunurken kimi vakitse çok sayıda öğe olabilir ve bu da uygulamanın çalışma performansını tesirler. Artık, sıralı bilgilerden ve listelerden oluşan bir kod örneğini inceleyelim.
def scale_to_log10(till_number):
log10_number_seq = []
for num in range(1, till_number):
log10_number_seq.append(math.log10(num))
return log10_number_seq
Bu kod, bakıldığı vakit ziyadesiyle kısa üzere görünebilir. Fakat kodların ortasında bulunan “range” komutu, yazılımcıya daima bir döngü oluşturacaktır. Bu döngü, sonsuz bir bellek alanında meselesiz çalışabilir lakin bu döngünün boyutu artmaya başladığı vakit işler büsbütün karışacaktır. Örnek vermek gerekirse bu döngü 4 GB'lik bir boyuta sahip olabilir. Lakin ayrılan bellek 2 GB olursa sistem çökecek ve süreç yarıda kalacaktır. İşte tam da bu noktada generators komutlarından faydalanılıyor. Geliştiriciler, generators komutlarını kullanarak yalnızca gereksinim olduğu vakit bu döngünün içerisine giriyorlar ve bu da RAM ve işlemci kullanımını direkt etkiliyor. Bu prosedür sayesinde uygulamalar, daha rahat bir halde çalışıyorlar ve rastgele bir çökme durumu yaşanmıyor.
Artık de geliştiricilerin, bu komutları nasıl kullandıklarına bakalım;
def scale_to_log10(till_number):
for num in xrange(till_number):
yield math.log10(num)
Bu kod, temelde yukarıda bulunan kodlarla tıpkı fonksiyonu görüyor. Yalnızca bu kodun öğeleri sürece biçimi biraz daha farklı. İkinci koddaki ufak farklar, kod kesitinin yalnızca o an işlenen öğeyi belleğe aktarılmasını sağlıyor. Bu da hem gereksiz boyutları ortadan kaldırıyor hem de işlemci ve RAM kullanımının optimizasyonunu sağlıyor.