Python isdigit fonksiyonu operatörleri algılamıyo

b="-4"
print(b.isdigit())

çıktı : False

isdigit int değerlerini true döndüren bir fonksiyon fakat int değerinin önünde bir operatör olunca false döndürüyo bunu nasıl aşabilirim

bu doğru ama senin b değişkenine atadığın değer bir int değil, str. Tırnakları kaldır.

Düzenleme: isdigit bir string fonksiyonu olduğu için yukarıda yazdıklarım da hata verecek. Tırnakları kaldırdığında isdigit’i artık kullanamıyor olacaksın. O yüzden bu yanlış bir çözümdü. Bu daha makul: Python isdigit fonksiyonu operatörleri algılamıyo - serhank tarafından #5

b="4"
print(b.isdigit())
print(type(b))

çıktı:

True
<class 'str'>

amacım zaten stringin içindeki int yi bulmak tırnakları kaldırırsam değer int olucak bir anlamı olmuyo

b=("4","-3","3")
for i in b:
    print(i.isdigit(),i)

Çıktı:

True 4
False -3
True 3

önünde operatör olunca string ifade olarak algılıyo sorun orda başlıyo

Bu sayısal değerleri size string olarak tutmak zorunda olduğunuzu düşündüren şey nedir?

İlla böyle yapacağım diyorsanız, operatörden kurtulmanız lazım çünkü “-” sayısal bir ifade değil ve haliyle isdigit fonksiyonu False değer döndürecek.

“-” bunun sayısal bir ifade olmadığının farkındayım ama diğer şartlarda “-15” bu sayısal bir ifade .

Ne yazıkki ben bu şekilde veri tutmuyorum alınan veri bu şekilde ve dönüşümünü sağlamaya çalışıyorum .

a=+15

Bu değişkenin type ı int değeri döndürüyosa isdigit “+15” i neden false döndürüyo çünkü operatörü operatör olarak değilde string bir ifade olarak algılıyo pythonda operatörlerin farklı bir şekilde tanımlanması var mı bilmiyorum

sayi = "-15"
if sayi[0] == "-":
    print(sayi[1:].isdigit())
else:
    print(sayi.isdigit())

Sayı negatif ise farklı, pozitif ise farklı davranmamız lazım öyleyse. Bu kodu daha pratik olarak şöyle de yazabiliriz: print(sayi[1:].isdigit() if sayi[0] == "-" else sayi.isdigit())

Bu kodumun içinde yüksek ihtimal bi karmaşa yaratıcak ama bir deniycem keşke operatörü opratör olarak görmesini sağlıyabilsek yinede teşekkür ederim

1 Beğeni

Değil…

>>> help(str.isdigit)
Help on method_descriptor:

isdigit(self, /)
    Return True if the string is a digit string, False otherwise.

    A string is a digit string if all characters in the string are digits
    and there is at least one character in the string.

İstisnasız her karakter bir rakama tekabül ediyorsa ve en az bir karakter varsa True, değilse False döndürür.

Tam olarak amacınızı anlayamadım ama şu yanıtın “Ama” ile başlayan kısmı belki işinize yarayabilir.

2 Beğeni

Daha fazla karmaşa :nerd_face:

def str_to_int(string):
    try:
        int(string)
        return True
    except ValueError:
        return False

def is_digit(string):
    operator_count = sum(string.count(operator) for operator in ("+", "-"))
    if operator_count == 1:
        operator = "+" if string.count("+") == 1 else "-"
        left, right = string.split(operator)
        if len(left) == 0:
            return str_to_int(right)
        else:
            return False
        
    elif operator_count == 0:
        return str_to_int(string)

    else:
        return False

print(is_digit("-4"))
print(is_digit("+4"))
print(is_digit("4"))
print(is_digit("a"))
print(is_digit("-a"))
print(is_digit("2+2"))
print(is_digit("4-"))

True
True
True
False
False
False
False
2 Beğeni

Çok iyi teşekkür ederim bence fonksiyonun genel olarak bu şekilde çalışması lazım.

Kesinlikle karmaşa yaratmıycak fonksiyonu değiştirip sadece is_digit kullanıcam :slight_smile:

1 Beğeni

Bu fonksiyonun amacı tam olarak nedir?

Bir string ifadenin tam sayı olup olmadığını kontrol ediyor. İçerisinde '+' veya '-' bulunan string ifadeler de dahil. Örneğin '-1956' girdisi, bize True değerini döndürüyor. Normalde isdigit() methodu bunu sağlamıyor. Ben de isdigit() methoduna böyle bir alternatif sunmak istedim.

İstenen şey kısaca int() kullanılarak da yapılabilirdi. Fakat belirttiğim gibi, “daha fazla karmaşa”.

1 Beğeni
def sayı(girdi):
    try:
        int(girdi)
        return True
    except:
        return False

Evet bu yeterliymiş aslında nedense çok farklı bakmıştım ilk başta olaya sizin kodunuzdan sonra bakış açım değişti.

1 Beğeni