String ifadeyi boolean'a çevirmek

Merhaba,

Kullanıcının girdiği ifadenin true ya da false değer döndürdüğünü tespit ederek ona göre işlem yaptırmak istiyorum. Basitçe şöyle bir şey denedim ama olmadı:

expression = input("Bir önerme gir: ")
if(bool(expression)):
    print("Doğru")
else:
    print("Yanlış")

Bu şekilde kullanıcı "4<3" gibi bir ifade de girse ekrana “Doğru” yazıyor. Boş string verilmediği sürece “True” olarak parse ediyor anladığım kadarıyla. assert kullanarak da yapmayı denedim fakat olmadı. C# ya da python ile istediğim gibi bir uygulama yazmak mümkün mü?

Merhaba.

Kullanıcının girdiği ifade str oluyor, siz bu ifadeyi bir kodmuş gibi çalıştırmak ve geri döndürdüğü değeri almak istiyorsunuz. Bunun için eval fonksiyonu kullanılabilir ama sadece deneme amaçlı, gerçek projelerde kullanılmamalı.

Evet, uzunluğu sıfır olmayan str örneklerini bool fonksiyonuna argüman olarak verdiğimizde elde ettiğimiz değer True oluyor.

Burada assert tam olarak ne işe yaracak anlayamadım.

Hangisini istiyorsanız onu kullanıp yazabilirsiniz, ikisi de programlama dili değil mi?

1 Beğeni

Teşekkür ederim. eval istediğim sonucu verdi. Fakat cevabın sorunumu çözdüğüne dair işareti bulamadığım için tıklayamadım. O özellik kaldırıldı mı forumdan acaba?

assert de benim denediğim koddan çok farklı bir şey yapmıyor sanırım. sadece if yazmadan aynı şeyi denemiş oldum galiba.

böyle bir şeyin yazılabilirliğini örnek kod ile göstermek isteyen olursa diğer dilleri kullanamadığım için bunu belirtme ihtiyacı hissettim.

Forum taşındığından beri bulunmuyor, isteyerek kaldırıldığını sanmıyorum.

Su ornege bakacak olursak basit bir eval onlarca satira donusebiliyor. Istenilen dilin ozelliklerine gore bu kod binlerce, onbinlerce satira cikabilir. Girilen onermenin nasil bir dil cercevesinde degerlendirilecegine bagli.

eval Python dilinin kendi yorumlayicisini devreye sokarak herhangi bir Python kodunun yazilmasina olanak veriyor. Fakat guvenligi de bu seviyede; herhangi bir Python kodu calistirabiliyoruz.

Burada da tam olarak bundan bahsedilmis.

assert x <=> if not x: raise AssertError(...)

eval (veya exec de benzeri galiba) gucune sahip degil. str beklenen yere int yollamak, dokumentasyonda on kere “pozitif sayi yollayin” dedigimiz halde 0 veya negatif sayi yollanan yerdeki varsayimlari/beklentileri kontrol etmek icin kullanilan, daha gelismis dillerde sentaks hatasi olabilecek kadar basit durumlari dogrulamak icin kullanilan bir ifade.

Istedigin gibi bir uygulamanin ne oldugunu bilmiyoruz ama istedigin “bir programlama dili tarafindan yorumlanip dogrulanabilecek bir ifade yazabilmek” ise o programlama dilini kullanmaktan baska bir caren yok. Python eval gibi bir fonksiyonalite veriyor ama C#'ta bu yok; kullanicinin kodunu alip, derleyip, ayrica calistirman lazim.

Ama burada bir XY problemi goruyorum; amacin “kullaniciya bir programlama dilinde kod yazdirmak” olamaz. Eger oyleyse zaten Python’in, C#'in kendisi var, senin kodun ne katiyor?

1 Beğeni

Burada da anlatmaya çalıştığım gibi derleyicinin yorumlayarak true ya da false olarak değer döndürebildiği 1<3 gibi basit matematiksel ifadeleri kullanıcıdan alıp sonucunda dönen true ya da false değerine göre işleme devam etmek istedim sadece. Öğrenme sürecinde merak edip sorduğum sorular olduğu için esasında somut bir problemi çözmeye yönelik değildi. XY problemi gibi görünmesinin nedeni bu sanırım. İlginiz için teşekkür ederim.

Sorun burada Turkce gibi dogal dillerin alttaki yuzlerce yillik varsayimlara dayanmasi. "1<3 gibi" derkenki kapsami belirtmek gerekiyor: “bir<uc” mumkun mu mesela, veya “x+1>x”? “99999999999999999999999999999999999999<1000000000000000000000000000000000000” denecek mi, sayilar hafiza sinirlarini zorlayacak mi? “1+1<3” mumkun mu, veya “1+i<2i”? “0x10>10” ne anlama geliyor? "1<<5 ifadesi true mudur false mudur? Ya “ali < binali?”

“Matematiksel ifade” nedir, hangi postulatlari iceren matematiksel sistemlerden bahsediyoruz?

Ogrenme surecinde sorulan soyut sorularin hic bir sikintisi yok, “merak” disinda herhangi bir amaca hitap etmelerine de gerek yok.

Turist olarak gelip “SultanAhmet nedir?” diye soran bir insan nasil bir cevap beklemelidir? “Istanbul’da bir semt” yeterli bir cevap midir? Yoksa I. Ahmet’in hayati mi anlatilmalidir? Anlatilirken batili tarihcilerin bakis acilari da katilmali midir, yoksa saray tarihcilerinin resmi kayitlari yeterli mi olacaktir? Yoksa soru yanlis sorulmus bir soru olup, cevabi “suradan tramvaya bineceksin kardesim” mi olmalidir? Bu cevaplardan herhangi birini veren bir insan mi yegdir, yoksa “sorunu anlamadim, duzelterek sorsana” diyen mi?

1 Beğeni

Gelişmiş kelimesi gözüme takıldı da, tam olarak neyi kastettiniz?

Tanimi kendi icinde aslinda: Basit hata durumlarini sentaks hatasi olarak verebilen diller.

def foo():
    length = 42
    print(lenght)
def foo(x:int): pass
def bar(): foo(4, 2)
def baz(): foo("42")
def add(x, y): return x + y
def foo(): add(object(), None)
foo()
# op is one of 'connect', 'disconnect', 'print'
def doop(op):
    if op == 'connect': ...
    elif op == 'disconnect': ...
    elif op == 'print': ...

doop('foobar')

Python bu hatalari bulmayi runtime’a veya 3rd party tool’lara birakiyor.

Evet ama buna gelişmişlik diyebilir miyiz? Dilin paradigmalarıyla ve tip sistemi ile alakalı değil mi?

Oyle, zaten bana bu “gelismemislik” hissiyatini veren de bu paradigmalar ve type sistemi.

Iddiamin subjektif oldugunu kabul ediyorum. Veya objektif oldugunu ve asil tartismanin “bu tur gelisimlerin gerekli veya iyi seyler olup olmadiklari” oldugunu da one surebilirim.