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. ]