0 ile 1 arasında 0.1 adım atarak sayıları elde etmenin bir yolu var mı?
Aşağıdaki gibi yapabileceğimizi düşünsek de bu kod başarısız olacak:
for i in range(0, 1, 0.1):
print(i)
Adım argümanı sıfır olamaz şeklinde bir hata alacağız.
Python’un random()
fonksiyonu ondalıklı sayıları değil, yalnızca tamsayıları alabilir. Bu örnek için bunun bir liste üreteci kullanabiliriz:
[x * 0.1 for x in range(0, 10)]
Daha genel bir durum için, özel bir işlev veya üreteç yazmak isteyebiliriz.
Doğrudan ondalık adım kullanmak yerine, bunu kaç adım istediğimiz açısından ifade etmek çok daha güvenli olacaktır. Aksi takdirde, ondalıklı sayıların yuvarlaması ile elde edeceğimiz hata bize yanlış bir sonuç verebilir.
NumPy kitaplığından (standart kitaplığın bir parçası olmayan ancak elde etmesi nispeten kolay olan) linspace işlevini kullanabiliriz. linspace
döndürülecek noktaların bilgisini alır ve ayrıca uç noktaları dahil edip etmeyeceğimizi de belirtmemizi sağlar:
>>> np.linspace(0,1,11)
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
>>> np.linspace(0,1,10,endpoint=False)
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
Bunun yanında, argüman olarak da ondalıklı sayı kullanmak istiyorsanız numpy.arange
kullanabilirsiniz.
>>> import numpy as np
>>> np.arange(0.0, 1.0, 0.1)
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
Ancak, ondalıklı sayı yuvarlama hatası yine de sorunlara neden olur. Aşağıdaki kod parçasında yuvarlama hatası nedeniyle aslında 3 sayı üretmesi gerekirken bir 4 sayılı bir dizi ürettiğini görebilirsiniz:
>>> numpy.arange(1, 1.3, 0.1)
array([1. , 1.1, 1.2, 1.3])