Break ve continue deyimlerini içeren bir fonksiyon yazmak mümkün mü?

Kodlar :

gcd = __import__('math').gcd
pi = __import__('math').pi
factorial = __import__('math').factorial

def checkPrime(number):
    primeList = list()
    
    divisors = [i for i in range(number+1)]
    del divisors[0], divisors[0], divisors[number-2]

    figure = [i for i in range(10)]
    del figure[0]
    
    for divisor in divisors:
        y = number / divisor 
        for i in figure:
            if y % i in figure:
                primeList.append(y)
    
    if primeList == []:
        return fr"|{number}| Is a Prime Number \ "
    else:
        return fr"|{number}| Is not a Prime Number \ "

def sqrt(number):
    return number ** 0.5

def expNum(coefficient, exponential):
    superscript = {
        "0": "\u2070",
        "1": "\u00b9",
        "2": "\u00b2",
        "3": "\u00b3",
        "4": "\u2074",
        "5": "\u2075",
        "6": "\u2076",
        "7": "\u2077",
        "8": "\u2078",
        "9": "\u2079"
    }
    equals = coefficient ** exponential
    return str(coefficient) + superscript[str(exponential)] + f" = {equals}"

def findDivisors(x):
    divisors = []
    numbers = [i for i in range(1, x + 1)]
    for number in numbers:
        if x % number == 0: divisors.append(number)
    return divisors

def lcm(x,y):
    return x*y/gcd(x,y)

optionMenu = (
    """
    Chose an Action and let me help you !
    (enter the operation's number)
    
    [1]  basic mathematical operations (addition, divison ...)
    [2]  prime checking
    [3]  exponential calculation
    [4]  calculate square root 
    [5]  calculate divisors
    [6]  calculate factorial
    [7]  calculate greatest common divisor
    [8]  calculate least common multiple 
    'Q' for exit
    """
)

print (
    """
    ========================================
    Hello ! I am a smart mathematician bot.
    I am here for helping you.
    
    Let's Go On !
    Warning : You Should Use '*' Operator for Multiplication and '/' For Division
    ========================================
    """, end="\n\n\n"
)


while True:
    
    req = input(optionMenu)
    request = req.lower()
    
    if request == 'q':
        print("Good Bye !")
        break
    
    elif request == '1':
        while True:
            var = input("Write Your Operation As : 5 + 5 : \t")
            try:
                evalution = eval(var)
                print(f"{var} = {evalution}")    
            except NameError: print("You Should Enter a Mathematical Operation")
            
            finish = input("Wanna Quit ? Or continue ? \t q = quit | c = continue :  ")
            if finish.lower() == "q":
                break
            elif finish.lower() == "c":
                continue
            else:
                print("You Must Dial 'q' or 'c'")
                
    elif request == '2':
        while True:
            try:
                number = int(input('Enter a Number :  '))
                print(checkPrime(number))
            except:
                print('Just Enter a Number')
            
            finish = input("Wanna Quit ? Or continue ? \t q = quit | c = continue :  ")
            if finish.lower() == "q":
                break
            elif finish.lower() == "c":
                continue
            else:
                print("You Must Dial 'q' or 'c'")
                
    elif request == '3':
        while True:
            try:
                coefficient = int(input("Enter a Coefficient : \t"))
                exponential = int(input("Enter an Exponential : \t"))
                print(expNum(coefficient, exponential))
            except: print("You Must Use Integers")
            
            finish = input("Wanna Quit ? Or continue ? \t q = quit | c = continue :  ")
            if finish.lower() == "q":
                break
            elif finish.lower() == "c":
                continue
            else:
                print("You Must Dial 'q' or 'c'")
                
    elif request == '4':
        while True:
            try:
                number = int(input('Enter a Positive Number : \t'))
                response = sqrt(number)
                print(f'√{number} =', response)
            except:
                print('Please Enter a Natural Number')
            
            finish = input("Wanna Quit ? Or continue ? \t q = quit | c = continue :  ")
            if finish.lower() == "q":
                break
            elif finish.lower() == "c":
                continue
            else:
                print("You Must Dial 'q' or 'c'")
                
    elif request == '5':
        while True:
            try:
                number = int(input('Enter a Number : \t'))
                response = findDivisors(number)
                print(f'Divisors Of {number} :  {response}')
            except:
                print("Please Enter a Number")
            
            finish = input("Wanna Quit ? Or continue ? \t q = quit | c = continue :  ")
            if finish.lower() == "q":
                break
            elif finish.lower() == "c":
                continue
            else:
                print("You Must Dial 'q' or 'c'")
    
    elif request == '6':
        while True:
            try:
                number = int(input("Enter a Positive Number : \t"))
                response = factorial(number)
                print(f'The Factorial Of {number} is : {response}')
            except:
                print("Please Enter Natural Number")
            
            finish = input("Wanna Quit ? Or continue ? \t q = quit | c = continue :  ")
            if finish.lower() == "q":
                break
            elif finish.lower() == "c":
                continue
            else:
                print("You Must Dial 'q' or 'c'")
                
    elif request == '7':
        while True:
            try:
                num1 = int(input("Enter the First Number : \t"))
                num2 = int(input("Enter the Second Number : \t"))
                response = gcd(num1, num2)
                print(f'gcd(|{num1}|,|{num2}|) = {response}')
            except:
                print("Please Enter A Number")
            
            finish = input("Wanna Quit ? Or continue ? \t q = quit | c = continue :  ")
            if finish.lower() == "q":
                break
            elif finish.lower() == "c":
                continue
            else:
                print("You Must Dial 'q' or 'c'")
                
    elif request == '8':
        while True:
            try:
                num1 = int(input("Enter the First Number : \t"))
                num2 = int(input("Enter the Second Number : \t"))
                response = lcm(num1, num2)
                print(f'lcm(|{num1}|,|{num2}|) = {response}')
            except: 
                print("Please Enter A Number")
            
            finish = input("Wanna Quit ? Or continue ? \t q = quit | c = continue :  ")
            if finish.lower() == "q":
                break
            elif finish.lower() == "c":
                continue
            else:
                print("You Must Dial 'q' or 'c'")
                
    else:
        print("Please enter a number from option list")   

Merhabalar, yukarıdaki kodları incelerseniz

finish = input("Wanna Quit ? Or continue ? \t q = quit | c = continue :  ")
            if finish.lower() == "q":
                break
            elif finish.lower() == "c":
                continue
            else:
                print("You Must Dial 'q' or 'c'")

buradaki kodların sürekli tekrar ettiğini göreceksiniz. Bu kodları bir fonksiyona aldığımda herhangi bir loop olmadığı için break ve continue deyimleri hataya yol açıyor. Break ve continue deyimlerini içeren bu kodları bir fonksiyona almak mümkün müdür ? Yoksa tekrar etmek zorunda mıyız ?

def kontrol(harf):
    if harf=="q":
        return False
    elif harf!="c":
        print("You Must Dial 'q' or 'c'")
    return True

x = True
while x:
    x = kontrol(finish.lower())

Eğer harf ‘q’ ise x False oluyor. Döngü başa sardığında biter. Harf “c” değilse yazı yazdırır. “q” hariç bütün durumlarda True döndürüp döngüyü devam ettirir.

Telefonda yazdığım için birkaç girinti hatası olabilir. O yüzden burayı wiki olarak bırakıyorum.

1 Beğeni

merhaba,

evet bundan dolayı mümkün değildir

Bu tekrarlardan kurtulmak adına tasarımı biraz değiştirebilirsiniz belki: her alt seçeneği (örn. 5, 7) bir while True: ... döngüsüne almaktansa, halihazırdaki daha kapsamlı olan while True:...ya işi bırakabilirsiniz. Demek istediğim, şu durumda kullanıcı 6’ya basıp faktöriyel hesabını tercih ettikten ve işlem gerçekleştikten sonra eğer devam etmek isterse, tekrar faktöriyel hesabı seçeneğinde kalıyor. Bunun yerine her bir alt seçenekte devam / tamam diye sormaktansa, bir defalığına tüm seçenekler bittiğinde, yani alt seçenek iflerinin hizasında sorabilirsiniz. Şu an zaten herhangi bir alt seçenekte "q"ya basıldığında ana menü gösteriliyor, dolayısıyla kullanıcı çıkmak için iki kere "q"ya basmak durumunda gibi oluyor. Ama tabii siz bilirsiniz, böyle tutmak isterseniz, tekrardan kurtulmak pek mümkün durmuyor.

Tabii alt seçeneklerdeki while True:...ları input validasyonu için hala orada tutmak isteyebilirsiniz.

ek olarak bazı gözlemler 

elinize sağlık öncelikle, birkaç yere değineyim dedim ama dikte etmek için değil, es geçebilirsiniz

__import__'u hiç kullanmadan programlama hayatımızı devam ettirebiliriz :d Yani kullanmamalıyız diyebiliriz.

Bunların yerine

from math import factorial, gcd, pi

veya

import math

deyip sonrasında math.... şeklinde kullanmalıyız.


list(), dict() gibi ilklendirmeler yerine “literal” karşılıklarını tercih etmeliyiz: [], {} gibi.


Burası çok çılgın olmuş, del operatörü yerine list-comprehension’ı istediğinizi elde edecek şekilde yazmanız kodu okuyanlar açısından (çok) daha anlaşılır olacaktır. (kodu okuyanlara siz de dahilsiniz, mesela 24 gün sonraki siz).

Hatta bu duruma özel olarak, sadece döngüde kullandığınız için list-comprehension yerine direkt olarak range ile yazabilirsiniz.

Belki yorum yazmak yararlı olabilir bu durumda “bu kod ne yapıyor” sorusunun cevabı için daha az süre harcar okuyan kişi. Ama yorum olsa dahi “pythonik” bir yaklaşım değil liste oluşturup hemen akabinde kırpmak :d


benzer bir durum oluyor, figure = range(1, 10) tercih edilebilir


for.. if.. append.. biçimi ortaya çıktığında list-comprehension’ı tercih etmeliyiz (daha hızlı, daha okunaklı)


Listelerin boş olup olmadığına bakmanın yöntemlerinden biri de direkt sorgulama yapmak:

if primeList:
    print("sayı asal")

Değişkeninizin isminin değişkenin liste olduğunu göstermesi de bu kullanımı daha da kolaylaştırıyor okunaklık açısından.


math.sqrt!


Bu fonksiyonu bir satıra indirebilirsiniz eğer yukarıdakileri göz önüne almak isterseniz :d


Halihazırda """ kullanıyorken bu \n karakterlerinin birkaçını oraya aktarabilirsiniz


Tek tırnak veya çift tırnaktan birini seçip olabilidiğimiz kadar tutarlı olmakta fayda var.


tek satırda yazmak okunaklılığı azaltmakta


finishi ìf`lere girmeden bir kere lower’layıp sonra kontrol etmek tercih edilebilir. İki kere yapabilme ihtimalinin önüne geçeriz.


tryın içerisini olabildiği kadar dar tutmalıyız. Bu sayede beklenen hataların exceptte daha kolay dile getirilmesini sağlarız. (input çevrilirken gelen hata mı yakalanmak isteniyor yoksa checkPrime da hata verebilir o mu tutulmak isteniyor, gibi.)


NameError yazdığınız gibi ne tür bir hata beklediğinizi yazsanız daha iyi, çünkü beklemediğiniz bir hata da gelebilir bu haliyle.


Bir de son olarak (aşırıya kaçmadan) yorum yazmak program için çok önem arz ediyor. Mesela:

bu fonksiyonun ne yaptığını anlamak çok kolay değil, ama okek yazsanız yorum olarak bir anda süper anlaşılır olabilir.

2 Beğeni

Python3.9’da:

from math import gcd, lcm
1 Beğeni

Bu konuda haklısınız :smiley: Farkında olaraktan böyle yazmak istedim. İki alt çizgi arasına alınan birçok ifade var ve bunları neredeyse hiç kullanmamışımdır. Python’da bu ifadeleri de bir bakıma keşfetmek istiyorum. Bu iki alt çizgi arasına alınan ifadelere nasıl seslenmeliyiz ? print “fonksiyonu” diyoruz mesela. Ya da break “deyimi” diyoruz. Bunlarda olduğu gibi bu iki alt çizgi arasına alınan ifadelere nasıl hitap etmeliyiz ?
Bu ifadelerin en çok işe yarayabilecek olanlarını anlatan bir kaynak var mı ? Python öğretmeye çalışanların hiçbir zaman böyle ifadelere yer verdiğini görmedim. Modüller konusunda hiçbir zaman __import__ diye bir şeyden bahsedilmedi. Oysaki bunların da önemli olduğunu düşünüyorum ben.


Bu kötü bir alışkanlıktan kaynaklı, üzerine gideceğim :+1:


buradan del kullanarak "0"ı, "1"i ve girilen sayının kendisini listeden siliyorum.

Burada demek istediğiniz sanırım range(1,10) diyerek "0"ı silmekten ( del divisors[0]) ) kurtulmak gibi bir şey oluyor. Haklısınız. Biraz şapşallık etmişim :smiley:


Burada demek istediğinizi anlamadım. Mesela list-comprehansion’ı tercih edersek aynı kodlar nasıl görünecekti ?


Bu hiç aklıma gelmemişti, doğru söylüyorsunuz :+1:


math.sqrt sadece tam kare sayılarda iş yapıyor. O yüzden kendim bu şekilde yazmayı tercih ettim.
Edit : Yanlış biliyormuşum. Şimdi deneme fırsatım oldu.


Try’ı mümkün olduğu kadar dar tutmaya çalışıyorum.
Fakat mesela :

Bu satırı try’ın dışına yazarsam coefficient ve exponential değişkenlerine erişemem.


Bunların dışındaki diğer önerileriniz için de çok teşekkür ederim :slight_smile:

2 Beğeni

Python 3.9’da olmadığım için bilmiyordum. Teşekkürler :+1:

“dunder” diyorlar “double underscore” namına. Türkçe’de durum nedir bilmiyorum.

Şuraya bakabilirsiniz A Guide to Python's Magic Methods « rafekettler.com

range(2, number)?

primeList = [y 
             for divisor in divisors
             for i in figure
             if (y := number / divisor) % i in figure
             ]

Burada pek açık olmadı (iki tane for ve walrus’tan dolayı) ama şöyle bir örnek verebiliriz daha iyi olabilir:

tekler_listesi = []
for sayi in range(21, 45):
    if sayi % 2 == 1:
        tekler_listesi.append(sayi)

yerine

tekler_listesi  = [sayi for sayi in range(21, 45) if sayi % 2 == 1]

Daha fazlası için Listeler ve Demetler — Yazbel Python Belgeleri veya Python List Comprehensions: Explained Visually

Aslında erişebilirsiniz, else ile. Eğer herhangi bir hata olmaz ise (yani except kısmına girilmezse), try/excepte bir else bağlarsanız, o kısma girilir:

try:
    coefficient = int(input("Enter a Coefficient : \t"))
    exponential = int(input("Enter an Exponential : \t"))
except ValueError:
    print("You Must Use Integers")
else:
    print("herhangi bir hata olmadı")
    print(expNum(coefficient, exponential))
1 Beğeni