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 ?
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
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.
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
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ı da sanmıyorum. Teknik olarak bakarsakint(arg)
,type(int).__call__(int, arg)
ile de eşdeğer, metodlar birer fonksiyondur.
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.
int()
bir fonksiyon değil,int
classının yapıcı metodu
Built-in (dile gomulu) bir fonksiyon olarak geciyor. Edit: Ama basinda class ile. Muhtesem.
Şunun gibi birşey yapardınız:
def int_parse(s: str, taban=10):
[…]
Degiskenlere isim vermek gereken yorum sayisini azaltabilir.
48
ve 57
yerine de ord('0')
ve ord('9')
tavsiye ederim.
Ama basinda class ile. Muhtesem.
evet kafa karıştırıcı