Python Programming

Python’da Verimli String’den Sayıya Dönüşüm

Spread the love

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

  1. Dize-Ondalıklı Dönüşüm için float() Kullanımı
  2. Dize-Tam Sayı Dönüşümü için int() Kullanımı
  3. ast.literal_eval() ile Güvenli Dönüşüm
  4. Yerelleştirme ve Virgüllerin İşlenmesi
  5. 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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir