Ö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.
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
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.
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:
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())
Ahahaha super!
Buraya her cevap yazarken any/all
+map
ile ne kadar daha basit olacagini dusunuyodum. Artik yazmakla ugrasmama bile gerek yok.
Sayenizde bende map any filter gibi built-in fonksiyonlara takmış bulunmaktayım lambda fonksiyonları gerçekten kullanabilene çok güzel
Yazdığınız kod gerçekten çok güzel olmuş bir kaç fikir parlaması yaşadım
@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))
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 ama kodun okunurluğu açısından çok güzel olmuş.