Kullanıcının Girdiği İsmin İçinde Rakam Olmamasını Sağlamak

Öncelikle Merhaba,
Benim bir sorum olacaktı öncelikle yazbel derslerinde hata ayıklamada olduğum için aklıma bir soru takıldı eğer ki sorumun cevabı ilerideki derslerde varsa şimdiden özür dilerim.Diyelim ki ben kullanıcıdan ismini girmesini isteyeceğim fakat isminde rakam olmamalı, eğer olursa hata verip tekrar ismini girmesini istemeli.Bunun harfli halini try-except ile yaptım fakat rakamlı halini nasıl yapabilirim.Cevaplarınız için şimdiden teşekkür ederim.:blush:

Su anda bu soruya verilebilecek tek bir cevap var: “Aynen harfli halini yaptigin gibi”

Harfli halini nasil yaptigini gosterirsen daha kolay yardimci olabiliriz.


Ama benim suphem aslinda harfli halini yapmadigin. Sanki int() kullaniyormussun gibi geliyor. Bu, dizide harf olmadigini garantilemez; dizinin belirli kurallar dahilinde tamsayiya cevrilebildigini garantiler.

Eger oyleyse ilk olarak “harfli halini” yaparak baslamalisin—kodun geri kalani zaten var, “harfli halini” yeniden yazman lazim.

Bunu yapmanin bir suru yolu da var ama herhalde en basidi in operatorunu kullanmak:

"x" in "xyz"True
"d" in "abc"False

Birden fazla harf icin for loop’u veya list comprehension kullanman gerekecek; bunlari bilmiyorsan dersler oraya gelene kadar beklemeni tavsiye ederim.

Cevabınız için teşekkür ederim tahmin ettiğiniz gibi int() kullandım. in operatorunu kullandığım zaman okulumdaki öğretmenim fazla alan kapladığını söyledi.Sanırım biraz daha ileride öğreneceğim.
Buyrun harfli halinin kodu :

while True:
        try:
            sayi = int(sayi)

        except ValueError:
            print("Yanlış tuşladınız !!!")
            sayi = input("Sayınızı giriniz :")
        else:
            break

@mehmet_sezer

Yazdığınız kodlar bir NameError hatası yükseltir. sayi = int(sayi) yazmışsınız, bunun yerine sayi = int(input("Sayınızı giriniz : ") yazmalısınız.

Evet. Python’da do...while olmadigi icin su yapilari cok goruyorum:

while True:
    is_yap()
    if is_oldu():
        break

veya

while True:
    try:
        is_yap()
        break
    except IsOlmadiException:
        pass #veya continue

veya

while True:
    try:
        is_yap()
    except IsOlmadiException:
        continue
    break

Standart (okunus: diger dillerde) olmadigi icin try...except...else yapisinin mumkunse kullanilmasini tavsiye etmiyorum; anekdotal olarak, deneyimli Python kullanicilarini bile yavaslatiyor.

1 Beğeni

Burada int()'in yerine gececek en guzel sey, icinde rakam varsa ValueError throw edecek, yoksa argumanini oldugu gibi dondurecek bir rakamsiz fonksiyonu:

def rakamsiz(isim):
    if "0" in isim:
        raise ValueError("isimde rakam olamaz")
    if "1" in isim:
        raise ValueError("isimde rakam olamaz")
    if "2" in isim:
        ...

Loop kullanimini okuyucuya egzersiz olarak birakiyorum.

@aib
Veya sizden öğrendiğim fonksiyonel programlama düşüncesine göre şöyle yazılabilir: :slight_smile:

while any(filter(lambda i: i.isnumeric(), input(">>> "))):
    print("Rakam girmeyin.")
def f(x=0):
    while any(filter(lambda i: i.isnumeric(), str(x))):
        print("Rakam girmeyin.")
        x = input(">>> ")
    return str(x)


print(f())
1 Beğeni

Ahahaha super!

Buraya her cevap yazarken any/all+map ile ne kadar daha basit olacagini dusunuyodum. Artik yazmakla ugrasmama bile gerek yok. :grin:

1 Beğeni

Sayenizde bende map any filter gibi built-in fonksiyonlara takmış bulunmaktayım lambda fonksiyonları gerçekten kullanabilene çok güzel :slight_smile:

1 Beğeni

Yazdığınız kod gerçekten çok güzel olmuş bir kaç fikir parlaması yaşadım :slight_smile:

@aib sağolsun, kendisinin başka başlıklarda paylaştığı kodlar benim de fonksiyonel programlamaya ilgi duymamı sağlamıştı.

Aşağıdaki üç örneği sizinle paylaşmak isterim. def fonksiyonlarında ufak değişiklikler yaparak, lambda fonksiyonlarının nasıl değiştiğini, ne zaman map ne zaman filter veya ne zaman ikisinin birlikte kullanılması gerektiğini gösteren basit örnekler bunlar. Zaten any + filter ile yukarıda bir örnek yapılmıştı. Siz de kendiniz böyle örnekler yaparak alıştırmalar yapabilirsiniz.

1.

def d1(x: list):
    for i in x:
        yield i ** 2
  

l1 = lambda x: list(map(lambda i: i ** 2, x))

assert list(d1(range(10))) == l1(range(10))

2.

def d2(x: list):
    for i in x:
        if i % 2 == 0:
            yield i


l2 = lambda x: list(filter(lambda i: i % 2 == 0, x))

assert list(d1(range(10))) == l1(range(10))

3.

def d3(x: list):
    for i in x:
        if i % 2 == 0:
            yield i ** 2
            

l3 = lambda x: list(map(lambda i: i ** 2, filter(lambda i: i % 2 == 0, x)))

assert list(d3(range(10))) == l3(range(10))
1 Beğeni

Tekrardan ellerinize sağlık fakat şunu bilmiyorum ben, x: list şeklinde tanımlamak zorundamıyız ? ve bu hangi pep de anlatılıyor acaba açabilir misiniz ?

Python3.6 ile gelen bir özellik o, argümanların hangi tipte olması gerektiğini belirtebiliyoruz.

Belirtmek zorundamıyız peki zorunda değiliz dimi sadece okunurluk açısından

Tabi, kullanmak zorunda değiliz.

Teşekkür ederim öğrendiğim iyi oldu :slight_smile: ama kodun okunurluğu açısından çok güzel olmuş.

1 Beğeni

PEP 484