Birkaç blog öncesinde 'Uygulama | Ders Ortalaması Hesaplama' isimli bir uygulama yapmıştık ve bu uygulamada sınırlı becerilere sahiptik. Örneğin kullanıcıdan sürekli olarak girdi alamıyor, her şeyi if - elif - else ile halletmeye çalışıyorduk. Artık bizim, daha kaliteli işler çıkarmamız gerekiyor. Bu uygulamada, bahsettiğim uygulamayı geliştirmeye çalışacağız ve size belli ödevler vereceğim. Bununla beraber 'in' ve 'not in' komutlarının ne kadar işlevsel olduğunu göstereceğim. Başlayalım.
Uygulamaya başlarken her şeyden önce 'notlar' isimli boş bir liste tanımlayacağım. Çünkü kullanıcıdan aldığım bilgileri buraya depolamak istiyorum. Bunu;
notlar = [] şeklinde tanımlıyorum. Hemen sonrasında bir while True: döngüsü açıyorum çünkü kullanıcıdan sürekli olarak girdi alacağız.

Döngü içerisinde, iki adet girdi beklediğimi görüyorsunuz. Bunlardan biri 'ders' iken diğeri 'vize' şeklinde. Peki, bir önceki uygulamada yapmadığım 'ders ismi isteme işini' burada neden yapıyorum? Size, bilgileri 'notlar' isimli listede tutacağımı söylemiştim. Sadece notları tutarsak hangi notun hangi derse ait olduğunu bilemeyeceğiz. Bu yüzden bunları eşleştirip ekleme işlemini yapacağım. Zaten kullanıcıdan sürekli girdi alacağımız için sürekli ders ismi ve not girecektir. Örneğin 'matematik:100' şeklinde.

Burada dikkatli olmanızı ve Türkçe düşünmenizi istiyorum.
if int(vize) not in range(1,101):
Yukarıdaki kodda şunu diyoruz: "Eğer vize 0 ile 101 sayıları arasında değilse...". Buradaki 'not in' ifadesi; 'içinde değil' kalıbını ifade eder. range fonksiyonunun ne yaptığını da zaten biliyorsunuz; verilen ilk argüman başlangıç değeri iken ikinci argüman bitiş değeridir. Peki, neden range(0, 100) yazmak yerine range(0, 101) yazdık? range fonksiyonuna verilen ikinci argüman 'n-1' olarak alınır. Yani ortaya 221 yazarsanız o 220 olarak alınacaktır. Dolayısıyla biz zaten range(0, 100) demek istemişiz. Bir önceki projede şunu yapmıştık: 'if (vize >= 0 and vize <= 100)'.
Yukarıda anlattıklarımdan sonra eğer kullanıcının girdiği vize notu 0 ile 100 arasında değilse onu uyarıyoruz ve programı sonlandırıyoruz.

Kullanıcının girdiği vize notu uygunsa ondan else komutu ile final notunu da istiyoruz. Bu noktada eğer final notu da 0 ile 100 arasında değilse onu uyarıp break ile programı sonlandırıyoruz.
Şimdi, eğer final notu da uygunsa artık hesaplama yapmamız gerekecektir. Ancak projede range fonksiyonunu kullandık ve bildiğiniz üzere range fonksiyonu, yalnızca tam sayılar (int) ile işlem yapan bir fonksiyondur. Fakat bizim durumumuzda bu, virgüllü (float) bir sayı da olabilir. O yüzden kullanıcının vize veya final notu için virgüllü bir sayı girmesine karşın sorgu esnasında bu değişkenlere type conversion uygulayıp onları int'e (int(vize) ve int(final)) dönüştürüyoruz. Bunu yaptığımız için range fonksiyonu doğru çalışacaktır. Ayrıca biz her ne kadar vize ve final notuna tam sayı olarak girsek de hesaplamalar sonucunda sonuç virgüllü gelebilir. Böyle bir durumda Python'un kafası karışacaktır. Peki, bunun için ne yapabiliriz?
Bu durumda yapabileceğimiz şey, range fonksiyonlarını kaldırmak ve bildiğimiz; if blokları ile bu işi çözmek olabilir. Ancak ben, yine type conversion uygulamayı tercih ediyorum. Bakalım.

Sonrasında; final notunun uygun olması koşulunda yani 'else' içerisinde 'ortalama' isimli bir değişkene bildiğimiz not ortalamasını hesaplayan formülü veriyorum. Örneğin vize notu 51, final notu ise 55 olan bir öğrencinin ortalaması virgüllü çıkacaktır. O yüzden ben, formülü tanımladıktan sonra verdiğim koşulda yine type conversion uyguluyorum. Bu noktada ortalama 49.9 ise dönüştürme işlemi sayesinde bu, 49 olarak alınacaktır; zaten 49.9 da olsa 49 da olsa kalacaktır. Bu sayede virgüllü çıkacak olan sonuç, bir altındaki (54.7 ise 54 olacak şekilde) tam sayıya yuvarlanacak ve range fonksiyonu bize sorun yaratmayacaktır.
Burada, range fonksiyonunu anladığımıza göre koşuldaki 'in' operatörüne bakalım. Aslında buradaki mantık, biraz öncekilerle aynı. Burada sadece 'not in' ifadesi yerine 'in' ifadesini koyduk. Bunun anlamının 'içinde' olduğunu artık biliyorsunuz. Burada söylediğimiz şey: "Eğer ortalama 0 ile 50 içindeyse..." ifadesidir. Dediğim gibi; burada ortalama değişkeni virgüllü bile olsa onu int'e dönüştürdüğümüz için sorun olmayacaktır. Burada aklınızı fena şekilde kurcalayacak yer; range fonksiyonundaki aralıklar olacaktır. Eğer aklınız karışırsa yeni bir test dosyası açıp denemeler yapabilirsiniz.
Hesaplamalar ve geçme-kalma durumunu hallettiğimize göre yazının başında tanımladığımız boş listeyi ele alabiliriz. Şimdi biz, kullanıcının girdiği ders ismini ve o dersin ortalamasını listeye eleman olarak ekleyeceğiz. Bunun için append() fonksiyonunu kullanıyorduk.

notlar.append(f"{ders}:{ortalama}") ifadesiyle beraber kullanıcının girdiği dersin isminin karşısına o dersin ortalamasını yazabileceğiz. Sonrasında kullanıcının bunları görmesini 'print(notlar)' ile sağlıyoruz. Çıktımız şuna benzer olacaktır: "[Matematik:100]". Projemiz bitti, şimdi bunu deneyelim.

Gördüğünüz üzere ortalamam 82.0 olarak geldi ve dersten geçtiğimi söyledi. Bunun yanında bir alt satırda bunun bir listede tutulduğunu görüyorsunuz. Ayrıca dikkat edelim; while True: sayesinde program sonlanmadı ve benden yine bir ders ismi girmemi istiyor.

Sorunsuz çalışıyor. İsterseniz bir de virgüllü bir not girmeyi ve aralık dışında bir not girmeyi deneyelim.

Virgüllü sayılarda da herhangi bir sorun yok. Bunların böyle tatlı çalışmasının sebebi type conversion; neden ihtiyacımız olabileceğini umarım anlamışızdır.

Önce vize notunu sonra da final notunu yanlış girdim; kontrollerimiz ikisi için de güzel bir şekilde çalışıyor. Bunu if ile yapmadık; range ile yaptık.
Evet, yazının sonuna geldik. Bu proje aslında ileride göreceğimiz 'sözlükler' ve 'try-except' konularıyla daha da verimli olabilir ve güzelleştirilebilir. İlerleyen zamanlarda geliştikçe siz de bunları projelerinize ekleyeceksiniz. Bir kodun işlevi ne kadar basit olursa olsun o kod hem okunabilir hem de temiz olmalıdır. Daha önce, bilgimiz eksik olduğu için karmakarışık if bloklarıyla uğraşmıştık ama ufak bilgiler ekleyince ne kadar güzel bir hâl aldı. Bununla birlikte; önceki projede bütünleme sınavına kalma durumunu da ele almıştık ancak burada bu yok. Ben sizlere, neyi 'nasıl yapabileceğinizi' gösterdim; geliştirmek elbette size kalmıştır. Sizden bu proje için iki şey isteyebilirim:
exit', 'quit', 'q' tarzında; girilmesi durumunda 'programı kapatan' bir anahtar kelime belirleyin ve bunu kodunuza ekleyin.Sevgiler.
Yayınlanma Tarihi: 2022-10-29 19:08:15
Son Düzenleme Tarihi: 2022-11-01 17:15:26