Thread overview
D vs Python
Feb 15, 2019
Salih Dinçer
Feb 18, 2019
Salih Dinçer
Feb 19, 2019
Salih Dinçer
February 15, 2019

GİRİŞ:

Elbette D, maalesef Python kadar çok kullanılan bir dil değil. Beraberinde bence tek alternatifimiz de Python değil. C++ kadar çok karmaşığa inmeden biraz iki dili yarıştırmak istiyorum. İstediğiniz karmaşıklıkta örnekler ile katılım sağlayabilirsiniz.

Python'da en çok şunu sevmiştim ve karşılığını D koduyla birlikte karışık veriyorum:

import std.algorithm.iteration: map;
import std.range: iota;
import std.stdio: writeln;

void main() {
    auto p = "print([a**2 for a in range(1, 11)])"; // bu kod aslında bir Python satırı
		       writeln(iota(1, 11).map!"a^^2"());
	 p.writeln();

}/* Karşılığı alt alta getirdiğim için daha kısa ve basit olduğu belli sanırım?

Tüm kodun çıktısı ise şöyle:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
print([x**2 for x in range(1, 11)])

*/

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 16, 2019

Bazı firmalar D'yi hem ilk örnek (prototype) dili hem de son gerçekleştirme dili (implementation) olarak kullandıklarını söylüyorlar. Geleneksel olarak "Python'la yazıverip sonra C++ ile geliştirmek" yerine hepsini D ile yazıyorlar. Bunu Weka'nın Liran Zvibel'i DConf'larda tekrarlar.

Aynısını Symmetry Investments'ın Laeeth Isharc'ı da söyler. Aslında Laeeth özellikle D'nin plasticity'sinin (şekil verilebilirliğinin) yüksek olduğunu söyler. Ek bilgi olarak, kendisi DConf 2019'un keynote konuşmacılarından birisi.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 18, 2019

Alıntı (acehreli:1550331432):

>

Geleneksel olarak "Python'la yazıverip sonra C++ ile geliştirmek" yerine hepsini D ile yazıyorlar.
D'nin ilkörnek için kullanılması bence biraz haksızlık. Aynı şeyi Python için düşünebiliriz çünkü sözdizimi çok basit. Gelelim yeni bölüme...

1. BÖLÜM:

Dikkat, bu bölüm biraz uzun olabilir! Aslında bölüm boyunca sadece dilimlerden ve Python'nun adımlama (Slice Stepping) özelliğinden bahsedeceğim. Bakalım D karşılıkları daha mı kolay olacak...

Önceki bölümde, İçlem Listesi (List Comprehension)'ne değinirken 1’den 11’ kadar bir aralığımız vardı. Bu aralık Python'nun range() işlevi ile üretmiş, sonra bir dizi olarak ekrana yazdırmıştık. Şimdi bunu 1’den başlatmak yerine negatiften, pozitife giden ve tam ortada 0 olan 11 sayı ile tekrar oluşturalım, bu a olsun:

a = [a for a in range(-5, 6)]
# a = [ -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5 ]

Aynısını kolaylıkla D'de de oluşturabiliyoruz; tıpkı b değişkeni gibi. Nedeni, son örnekte birbirine benzer (aslında farklı, bu string) bir veriye ihtiyacımız olması. Sonuçta bu da bir dizi:

b = "54321012345"

Diyelim ki negatif sayıları a'dan dilimleme yöntemiyle ayırmak istiyoruz; bunu D'de yan yana iki nokta (double dot) ile yaparken, Python'da tek bir üst üste nokta (colon character)'i ile yapıyoruz. Noktalar açısından çok benzer:

import std.range : iota;
int a = iota(-5, 6)
writeln(a[0..5]); /* çıktısı: [ -5, -4, -3, -2, -1 ]

Pythonda aynısı şöyle:

print(a[0:5]) # [ -5, -4, -3, -2, -1 ] */

Ancak Python, biraz daha ileri giderek tıpkı bir işlev (function parameter) gibi davranarak 2 veya 3 değer daha girilmesine izin veriyor. Bu değerleri arasına iki nokta ile ayırabilir, hiçbir değer yazmayabilir ve 3. parametrede 0 hariç istediğiniz sayıyı girebilirsiniz. Gerçi negatif sayı tamam ama ondalıklı sayılar yasaklı. Yani aralık veya dizide karşılığı olmayan bir sayı bile hatasız işletiliyor. Şimdi bunları sadece Python için deneyelim:

print(a[::2])# [-5, -3, -1, 1, 3, 5]
print(a[::3])# [-5, -2, 1, 4]
print(a[::5])# [-5, -0, 5]
print(a[::10])# [-5, 5]

Görüldüğü gibi sadece 2 değeri girerek tek sayıları ekrana yazdırdık. Bu 3. parametrenin anlamı, farkettiginiz üzere atlamak demek (stepping) ve varsayılan değeri 1, tıpkı D'de std.range : iota'da olduğu gibi. Eğer sayı büyüseydi daha az sayıda dizi elemanı görecektik. Dizi boyutuna eşit veya geçen bir değer de ise tek elemanlı bir dilim (örneğin ilk eleman -5) döner. Şimdi hayal gücümüzü zorlayalım, ya negatif tam sayıları alsaydık (kombine bir şeye ihtiyaç var: sınırla ve atla):

print(a[:5:2])# [-5, -3, -1]

Ortadaki 2. parametre, bize bitiş değerine (ortadaki 0 değerli elemana) kadar sınırlandırma imkanı veriyor. Peki öyleyse ilk parametre de başlangıç değeridir öyle değil mi? Yan aynı örneği boş bırakmadan şöyle de yazabilirdik:

print(a[0:5:2])# [-5, -3, -1]

Buraya kadar çok kolaydı çünkü bildiğimiz standart şeyler. Şimdi nöronları yakma zamanı :)
Atlatma yaparak pozitif tek sayıları dilimlesek bunun kaç türlü çözümü olabilir?

print(a[6::2])# 1. çözüm
print(a[-5::2]# 2. çözüm
# Çıktısı: [1, 3, 5]

İlk defa gördüğünüz gibi eksili değerler verebiliyoruz. Bu D'de de mümkün gibi görünse de, aslında derlense bile çalışma zamanı hatası (runtime error) almanıza sebep olur. Nöron yakmaya devam edeyim ve şu örnekle kısa bir süreliğine ara vereyim:

print(a[::-1]
# Çıktısı: [ 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5 ]

Geriye doğru bir atlama mı, nasıl yani! Sanki D'deki retro()'yu görür gibi olduk :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 19, 2019

BÖLÜM 1'den devam...

Hatırlarsanız elimizde bir b string'i vardı ve bu örneklerimizde kullandığımıza benzer sayılardan oluşuyordu. Sadece 0'dan önceki rakamların işareti yok, bir nevi simetrik bir sayı. Peki son değindiğimiz örneği D ile karşılaştırarak devam edersek sizce de Python öne çıkmıyor mu?

 string b = "54321012345";

 auto sol = b[0..5]; // 54321
 auto sağ = b[6..$].retro(); // 54321

 import std.algorithm.comparison : equal;
 assert(sol.equal(sağ)); // sol'daki eşit mi sağ'a, öyleyse çalışıyor...

 /* Aynısı Python'da şöyle olabilirdi:
    sol = b[:5] # 54321
    sağ = b[:5:-1] # 54321

    if sol != sağ:
		raise exception("assert error")
    # Bu hatayı hiçbir zaman vermez çünkü eşitler!
 */

Yani demek istediğim, tek olanak ile hem dilimleme, hem atlama, hem de döndürme yapabiliyoruz!

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 20, 2019

Güzel. :) Üretirken değer atlamak için iota'nın üçüncü parametresi kullanılabilir. Adım adım ilerlemek için de stride() var:

 auto a = iota(-5, 6, 2).stride(4);

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]