Programı geliştirmek (Python)

Herkese merhaba, programlamaya yeni başladım ve yazbel’in yayınlamış olduğu istihza python 3 belgeleri ile çalışıyorum.

Ben ufak bir program yaptım fakat programa bazı özellikler eklemek ve bir şeyleri değiştirmek istiyorum fakat şuan ki mevcut bilgim ile bunu beceremedim.

Python sürümüm 3.9.6 encode utf-8 işletim sistemim win10

Kodlar şu şekilde;

print( "*" * 80)
print("""Kar-zarar açıklayıcıya hoş geldiniz!. Bu program potansiyel kar veya zararınızı,
hesaplar bu yüzden vergi ve diğer giderler (komisyon gibi) hesaplamanın içerisine dahil edilmez.""")
print("*" * 80, "\t")

#Değişkenleri atadım. Hisse fiyatları küsuratlı olabileceği için 'float' kullandım.
sermaye = int(input("Yatırdığınız para: "))

alisfiyati = float(input("Hisse alış fiyatı: "))

lot =  sermaye / alisfiyati

#Kullanıcıya elinde hisseden ne kadar adet olduğunu söylüyoruz.
print("Hisse adediniz: ", round(lot), sep="")

satisfiyati = float(input("Hisse satış fiyatı: "))

#Zarar etmişse eğer zararı hesaplamak için bu formülü kullanıyoruz.
zarar = sermaye - (lot * satisfiyati)

#Kar etmişse bu formülü.
kar = lot * satisfiyati - sermaye

#Koşulları belirtiyoruz.
if satisfiyati < alisfiyati:

    print("Kalan paranız: ", round(lot * satisfiyati, 1), "\n",
          "Zararınız: ", round(zarar, 1), " TL zarar", sep="")

    print("Yüzdesel: %", round((alisfiyati - satisfiyati) * 100 / alisfiyati, 1), sep="")

elif satisfiyati > alisfiyati:

    print("Toplam paranız: ", round(lot * satisfiyati, 1), "\n",
          "Karınız: ", round(kar, 1)," TL kar", sep="")

    print("Yüzdesel: %", round((satisfiyati - alisfiyati) * 100 / satisfiyati, 1), sep="")

elif satisfiyati == alisfiyati:

    print("Alış fiyatınız, satış fiyatınızla aynı olduğu için kar veya zararınız yoktur.") 

else:
    print("Hata! Lütfen bir sayı giriniz.")
    
input()

Python belgelerinde “Döngüler(Loops)” başlığına kadar geldim. Buraya kadar ki edinmiş olduğum bilgilerin istediğim şeyleri yapmama yeterli olduğunu düşündüm ve bu yüzden istediğim şeyleri programda uygulayabilene kadar ileri gitmek istemedim. Yazdığım kodlar muhtemelen çok daha basit bir şekilde yazılabiliyordur ama mevcut bilgimi göz önüne alarak kodları o şekilde yazarsanız sevinirim.

Şimdi benim yapmak istediğim şeyler şunlar:

  1. Sermaye, alış fiyatı ve satış fiyatı kısımlarında kullanıcı enter’a basıp boş bir değer girerse ekrana o kısmın boş bırakılamayacağı ile ilgili bir yazı yazdırmak istiyorum. Bunun için “if not sermaye:” gibi kodları denedim ama sermaye değişkeninin çıktısı int olduğu için olmadı string’e çevirmeye çalışırken de haliyle sorunlar yaşadım.
  2. Kullanıcının sermaye, alış fiyatı ve satış fiyatı kısmına yalnızca sayı değerli, değerler yazabilmesini istiyorum. Yani kullanıcı “Hisse satış fiyatı” sorusuna “asadasda” şeklinde bir cevap verirse şuan ki haliyle uygulama hata veriyor ama bunun yerine, lütfen geçerli bir değer giriniz gibi bir yanıt verip tekrardan hisse satış fiyatını sorup geçerli bir değer alana kadar uygulamanın tekrar etmesini istiyorum.
  3. Bu kısmın ne kadar mümkün olup olmadığını bilmiyorum ama alış fiyatı ve satış fiyatı kısmında float kullandığım için sayıları 5.12, 8.4 gibi girmek yani “.” kullanmak gerekiyor sayıları “.” ile yazmayınca program hata veriyor. Ben bunun böyle olmasını istemiyorum yani 5.12 yerine 5,12 yazarsa kullanıcı, program kabul etsin ama sayı değerli olmayan herhangi bir şey girerse hata mesajını ekrana yazsın ve doğru cevabı alana kadar aynı soruyu sorsun.

Teşekkürler.

1 Beğeni
  1. ve 2. için basit bir fonksiyon oluşturabilirsiniz.
def girdi_al(yazi):
    while True:
        try:
            yerel_degisken = float(input(yazi))
            return yerel_degisken
        except ValueError:
            print("Girdi olarak harf girilemez ve de girdi alanı boş bırakılamaz.")

parametre olan yazi, girdi alınırken ekrana yazdırılacak yazıyı temsil eder. Örneğin:
Yatırdığınız para: .

Float tipi bir input alırken, girdi olarak harf girildiğinde veya herhangi bir şey girilmediğinde ValueError alırız. try&except ile bu hatayı aldığımızda programın akışının durmasını önlemiş olduk ve de bu hatayı aldığımızda ne yapılacağını belirlemiş olduk:

print("Girdi olarak harf girilemez ve de girdi alanı boş bırakılamaz.")

Herhangi bir hata ile karşılaşılmadığında return yerel_degisken ile birlikte döngü sonlanacak.

Son olarak da, girdi alırken input() değil de girdi_al() yazmamız gerekecek. Zaten bu fonksiyonu da bunun için oluşturduk :stuck_out_tongue:

sermaye = girdi_al("Yatırdığınız para: ")
alisfiyati = girdi_al("Hisse alış fiyatı: ")
satisfiyati = girdi_al("Hisse satış fiyatı: ")
  1. için ise fonksiyonumuzda bir takım değişiklikler yapmamız gerekecek:
def girdi_al(yazi):
    while True:
        yerel_degisken = input(yazi)
        if "," in yerel_degisken:
            indeks = yerel_degisken.find(",")
            yerel_degisken = yerel_degisken[:indeks] + "." + yerel_degisken[indeks + 1:]

        try:
            yerel_degisken = float(yerel_degisken)
            return yerel_degisken
        except ValueError:
            print("Girdi olarak harf girilemez ve de girdi alanı boş bırakılamaz.")

Bu sefer girdimizi “str” tipinde ve try&except dışında aldık. Ardından bu girdiyi “float” tipine dönüştürürken herhangi bir hata alıp almadığımızı kontrol ettik. Aslında float(input())'ta aynı işi bu sıra ile yapıyor fakat biz ayırmış olduk. Amacım ise girdi içerisinde virgülün olup olmadığını try&except’ten önce kontrol etmekti. Eğer içerisinde virgül varsa nokta ile değiştirmek için ise:

if "," in yerel_degisken:
            indeks = yerel_degisken.find(",")
            yerel_degisken = yerel_degisken[:indeks] + "." + yerel_degisken[indeks + 1:]

kısmını yazdık. indeks değişkenine virgülün bulunduğu indeks değerini atadık. Ardından şu büyülü [a:b] şeysini kullanarak karakter veri tipindeki yerel_degisken’i değiştirdik. Orada yapılan işlem [a:b] ile yerel_degiskenin “virgülsüz” kısımlarını almak, aralarına ise + "." + ile nokta eklemek. Yani virgül gitti ve nokta geldi. Bu işlemlerden sonra ise try&except ile virgülün yerine nokta geldikten sonra bu girdimiz float olabilecek niteliğe sahip mi diye kontrol ediyoruz. Çünkü girdi 20,20,1 gibi bir şey de olabilir :stuck_out_tongue:

Yani sonuç olarak, 3. kısımda belirtmiş olduğum fonksiyonu kodlarınızın arasına ekledikten sonra değişkenler için girdi alırken de input() yerine girdi_al() kullanacak olursanız bu iş olur diye umuyorum. İyi çalışmalar :slight_smile:

1 Beğeni

Yardımınız için teşekkür ederim. Elinize yüreğinize sağlık.

Ben henüz belgelerde bu kadar ileri gelmedim o yüzden def, try, return ve except’in ne olduğunu, ne yaptığını, çalışma mantığını henüz bilmiyorum. Şuan bakınca biraz karışık geldi ama kodları bu programda deneyip çalışma mantıklarını kavramaya çalışacağım.

1 Beğeni