Python'da int fonksiyonu

a=“1”
b=10

print( int(a) + b)

Bu şekilde string bir ifadeyi integer ile toplayabiliyoruz. Peki int() şeklinde bir fonksiyon hazır olmasaydı . Biz bu int() fonksiyonunu nasıl oluşturabilirdik ?

Bu bir örnek olabilir.

a =10

for i in range(100):
      if str(i) == a:
           a = i
      else:
            pass
1 Beğeni

int() bir fonksiyon değil, int classının yapıcı metodu

Brute force çok gereksiz burada. Sayı birkaç bin basamaklıysa ne yapacaksınız?

???

Şunun gibi birşey yapardınız:

def int_parse(s: str, taban=10):
    # taban => sayının çevrileceği taban, örnek: 10, 2, 8, 16...
    
    # n => int türündeki sonuç
    n = 0
    
    for i, c in enumerate(s):
        # bilgisayarda her karakter aslında karakter kodu olarak saklanır
        # örneğin 'Z'nin karakter kodu 90, '.' nın karakter kodu 46'dır.
        # ord() fonksiyonu ile şuan bulunduğumuz karakterin karakter kodunu
        # elde ediyoruz
        karakter_kodu = ord(c)
        
        # eğer sayının karakter kodu, 48 ile 57 arasındaysa
        # ('0'ın karakter kodu 48, '9'un karakter kodu 57)
        if 48 <= karakter_kodu <= 57:

            # basamak değerini sayı tabanına, sayının uzunluğuna ve 
            # bulunduğumuz index'e göre hesaplıyoruz
            #
            # örnek s: '1643', taban: 10:
            # i: 0, c: '1' => basamak: 1000
            # i: 1, c: '6' => basamak: 100
            # i: 2, c: '4' => basamak: 10
            # i: 3, c: '3' => basamak: 1
            basamak = taban ** (len(s) - i - 1)
            
            # '0' ile '9' arasındaki sayıların karakter kodları,
            # '0': 48, '1': 49, '2': 50, ... '8': 56, '9': 57
            # şeklinde olduğuna göre; karakter kodlarından 48 çıkarırsak
            # sayının değerini bulabiliriz:
            # '0': 48 => 48 - 48 = 0
            # '1': 49 => 49 - 48 = 1
            # '2': 50 => 50 - 48 = 2
            # (...)
            # '9': 50 => 57 - 48 = 9
            rakam = karakter_kodu - 48
            
            # n'e eklememiz gereken değer
            n += basamak * rakam
        
        # eğer karakter kodu [48, 57] aralığında değilse, yani bulunduğumuz
        # karakter ['0', '1', ... '9'] kapsamında değilse hata veriyoruz
        else:
            raise ValueError('unknown character for int parsing: {}'.format(c))
    
    # hata almadığımız taktirde döngü bittikten sonra sonucu döndürüyoruz
    return n


assert int('12312312') == int_parse('12312312')

Yorum satırlarıyla elimden geldiğince açıklamaya çalıştım.

1 Beğeni

Bu daha açıklayıcı oldu.

?

Bunun ne olduğunu bilmiyorum.

for i in range(len(a)*10):

bu kodda eksik olan ne peki anlatırmısınız?

Bir str ile bir int’i toplamıyoruz, bir str’yi int’e çevirip iki tane int’i topluyoruz.

Burada konuştuğumuz bağlamın nesne tabanlı programlama ve sınıflarla bir alakası yok, int’i bir fonksiyon olarak görmek yeterine doğru. Bir yanlış anlaşılmaya sebep olacağını sanmıyorum. Teknik olarak bakarsak da int(arg), type(int).__call__(int, arg) ile eşdeğer, metodlar birer fonksiyondur.

Bu örnek hiç verilmese daha iyi olurdu bence, soruda bir algoritma isteniyor ama bu basit bir brute force’dan ibaret. Sayıları karakter dizisine çevirecek fonksiyon da en baştan yazılmadığı sürece ( str(arg: int) ) bu yöntem bana hileymiş gibi geldi.

Çözümü belli bir kurala, yönteme oturtmadan sonucu teker teker bütün olasılıkları deneyerek bulmaya çalışmak.


digits = "0123456789"

def to_int(string):
    return_value = 0
    digit_value = 10**(len(string)-1)
    for i in string:
        return_value += digits.index(i) * digit_value
        digit_value //= 10
    return return_value

assert to_int("0") == 0
assert to_int("1") == 1
assert to_int("2345") == 2345
assert to_int("94") == 94
1 Beğeni

Demek istediğim int’in bir fonksiyonu değil, bir class constructor’ını çağırdığıydı. Gerçi metodlara da fonksiyon diyebiliriz ama burda int bir fonksiyon değil, bir class. Sadece soruyu soran kişinin aklının bir kenarında bulunmasını istedim. Yoksa sizin dediğiniz de doğru.

1 Beğeni

Built-in (dile gomulu) bir fonksiyon olarak geciyor. Edit: Ama basinda class ile. Muhtesem.

:+1:

Degiskenlere isim vermek gereken yorum sayisini azaltabilir.
48 ve 57 yerine de ord('0') ve ord('9') tavsiye ederim.

3 Beğeni

evet kafa karıştırıcı