Fonksiyondan fonksiyon döndrüme

try:
    def outer(islem_ismi):
        def cikarma(*args):
            toplam = 0
            for x in args:
                toplam -= x
            return toplam
        def bolme(*args):
            bolum = 1
            for y in args:
                bolum /= y
            return bolum
            
        def carpma(*args):
            carpim = 1
            for z in args:
                carpim *= z
            return carpim
            
        if islem_ismi == "cikarma":
            return cikarma
        if islem_ismi == "bolme":
            return bolme
        if islem_ismi == "carpma":
            return carpma
        else:
            raise TypeError("Böyle bir işlem programda yüklü deil.Kekw")

    a = outer("carpma")
    b = [int(i) for i in input("Argümanlarınız:").split()]
    
    print(a(b))    
    
    
    
except Exception as ss:
    print(ss)

Selamlar herkese,argüman giriyorum(12 ve 3) ama program [12,3] yazdırıyor.print(a(b)) ifadesinde mi yanlış yaptım?Cevaplarsanız sevinirim teşşekkürler

Bu fonksiyona pozisyonel olarak pasladığınız tüm argümanlar args isimli tuple’da toplanır. Örneğin carpma([12, 3]) şeklinde çağrıldığında, args

([12, 3],)

şeklinde 1 elemanlı bir tuple olur.

Sonrasında burada for 1 kere döner, z de [12, 3] listesine eşit olur. Tam sayılar da listeler ile “yerinde” (in-place) çarpılabildiğinden, carpim değişkeninin değeri [12, 3] * 1 yani [12, 3] olur. Sonrasında da return’e gidilir zira args 1 elemanlı ve for döneceği kadar döndü.

İki şekilde istediğinizi elde edebilirsiniz:

1- Fonksiyonun imzasından *'ı kaldırırsınız:

def carpma(args):

Böylelikle args direk ne geliyorsa ona eşit olur, yani [12, 3] yukarıdaki örnekte (tuple söz konusu değil artık). Bunun da üzerinden for ile geçtiğinizde hedeflenen sonuç elde edilir.

2- Fonksiyonu çağırırken * kullanırsınız:

a(*b) 

Yani carpma(*[12, 3]). Bu durumda ise “argument unpacking” gerçekleşiyor ve sanki şöyle çağırmışsınız gibi oluyor: carpma(12, 3). Dolayısıyla üstte belirtildiği üzere bu pozisyoneller args’da toplanır ve args değişkeninin değeri (12, 3) olur. Bu da for ile üzerinden geçildiğinde istenilen sonuç olan 36’yı verir.


Aslında tam sayıların yerinde (in-place) çarpılma olayları yok immutable oldukları için. Dolayısıyla carpim’ın tam sayı, z’nin de bir liste olduğu carpim *= z’de sırasıyla şunlar deneniyor:

carpim.__imul__(z)     # AttributeError; tam sayılar immutable
carpim.__mul__(z)      # NotImplemented; `1 * [12, 3]` bu sırayla çarpılamıyor
z.__rmul__(carpim)     # Çalışıyor; `[12, 3] * 1` yukarıdaki sonucu veriyor.
4 Beğeni

Teşşekkürler baya açıklayıcı olmuş :slight_smile:

1 Beğeni