Python, sayıları temsil eden dizeleri sayısal karşılıklarına (ondalıklı veya tam sayılar) dönüştürmek için çeşitli yollar sunar. En uygun yöntem, beklenen giriş dizesi formatı, hata işleme ihtiyaçları ve performans hususları gibi faktörlere bağlıdır. Bu makale, bu teknikleri ve avantaj-dezavantajlarını ele almaktadır.
İçindekiler Tablosu
- Dize-Ondalıklı Dönüşüm için
float()
Kullanımı - Dize-Tam Sayı Dönüşümü için
int()
Kullanımı ast.literal_eval()
ile Güvenli Dönüşüm- Yerelleştirme ve Virgüllerin İşlenmesi
- Dönüştürme Yöntemlerinin Performans Karşılaştırması
1. Dize-Ondalıklı Dönüşüm için float()
Kullanımı
En basit yaklaşım, yerleşik float()
fonksiyonunu kullanmaktır. Dizeleri ondalıklı sayı karşılıklarına dönüştürmeye çalışır. Dize geçerli bir ondalıklı sayı gösterimi değilse (örneğin, sayısal olmayan karakterler içeriyorsa), bir ValueError
hatası oluşturur.
string_number = "3.14159"
float_number = float(string_number)
print(float_number) # Çıktı: 3.14159
string_number = "10"
float_number = float(string_number)
print(float_number) # Çıktı: 10.0
try:
invalid_number = float("abc")
except ValueError:
print("Ondalıklı dönüşüm için geçersiz dize") # Çıktı: Ondalıklı dönüşüm için geçersiz dize
2. Dize-Tam Sayı Dönüşümü için int()
Kullanımı
Benzer şekilde, int()
dizeleri tam sayılara dönüştürür. Dize bir tam sayıyı temsil etmiyorsa (kesirli kısımlar hata oluşturacaktır) bir ValueError
hatası da oluşturur.
string_number = "10"
int_number = int(string_number)
print(int_number) # Çıktı: 10
try:
invalid_number = int("3.14")
except ValueError:
print("Tam sayı dönüşümü için geçersiz dize") # Çıktı: Tam sayı dönüşümü için geçersiz dize
try:
invalid_number = int("abc")
except ValueError:
print("Tam sayı dönüşümü için geçersiz dize") # Çıktı: Tam sayı dönüşümü için geçersiz dize
3. ast.literal_eval()
ile Güvenli Dönüşüm
ast
modülünden ast.literal_eval()
fonksiyonu, özellikle güvenilir olmayan girdilerle çalışırken daha güvenli bir alternatif sunar. Dizeleri Python’ın Soyut Sözdizimi Ağacı (AST) kullanarak ayrıştırır ve dizenin içinde yer alan kötü amaçlı kodun yürütülmesini önler. Bu, harici verilerle çalışırken güvenlik için çok önemlidir.
import ast
string_number = "3.14159"
float_number = ast.literal_eval(string_number)
print(float_number) # Çıktı: 3.14159
string_number = "10"
int_number = ast.literal_eval(string_number)
print(int_number) # Çıktı: 10
try:
unsafe_input = ast.literal_eval("__import__('os').system('rm -rf /')") # Bu bir hata oluşturacaktır
except (ValueError, SyntaxError):
print("ast.literal_eval kötü amaçlı kod yürütmeyi engelledi")
4. Yerelleştirme ve Virgüllerin İşlenmesi
Bazı yerel ayarlarda, sayılar biner ayracı olarak virgül kullanır (örneğin, “1,000.50”). float()
bunları doğrudan işlemez. Dönüştürmeden önce virgülleri noktalarla (veya yerel ayarınıza bağlı olarak tam tersi) değiştirerek diziyi önceden işleyin. locale
modülü, yerel ayarlara özgü biçimlendirmede yardımcı olabilir.
import locale
locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8') # ABD yerel ayarı örneği
string_number = "1,000.50"
processed_number = string_number.replace(",", "")
float_number = float(processed_number)
print(float_number) # Çıktı: 1000.5
#Noktayı biner ayracı ve virgülü ondalık ayracı olarak kullanan yerel ayarlar için
string_number = "1.000,50"
processed_number = string_number.replace(".", "").replace(",", ".")
float_number = float(processed_number)
print(float_number) #Çıktı: 1000.5
5. Dönüştürme Yöntemlerinin Performans Karşılaştırması
float()
ve int()
genellikle en hızlı olanlardır. ast.literal_eval()
, AST ayrıştırma ek yükü nedeniyle daha yavaştır. Bununla birlikte, güvenilir olmayan girdilerle özellikle güvenlik avantajları performans farkından daha ağır basar. Performansın çok önemli olduğu ve verilerin güvenilir olduğu büyük veri kümeleri için float()
ve int()
tercih edilir. Daha küçük veri kümeleri veya güvenliğin çok önemli olduğu durumlarda ast.literal_eval()
daha güvenli bir seçimdir. timeit
ile yapılan kıyaslama, nicel karşılaştırmalar sağlayabilir.