Amacım kullanıcı girdisine göre basit hesaplama yapmak fakat kullanıcı sayı girdiğinde program hiçbir şey yapmıyor

işlem = input("işlem giriniz")
args = tuple(input("{}  istediğiniz sayıları giriniz".format(işlem))) 
def fonksiyon(*args):
    
    def fonk1(args):
        toplam = 0
        for i in args:
            toplam += i
        return toplam 
    return fonk1(args)
   
    def fonk2(args):
        çarpım=1
        for i in args:
            çarpım *= i
        return çarpım
    return fonk2(args)
    
    if işlem == "toplama":
        return fonk1
    elif işlem == "çarpma":
        return fonk2


fonksiyonu çağırmamışsın.
ek olarak kullanıcının sayıları nasıl girmesini bekliyorsun. örneğin virgülle ayırarak girdiğini varsayalım 5, 4 demiş olsun. args değişkeninin içinde tek bir string eleman olacaktır. print(args) ve print(type(args)) ile kontrol et.

Hocam kullanıcının girdiği değer 235 olsun diyelim bu sayıların def fonksiyon(*args): kısmına nasıl fonksiyon(2,3,5) şeklinde yazılmasını sağlayabilirim . Bu arada fonksiyonu çağırmamışım uyarınız için teşekkürler .

şöyle deneyebilir misiniz?

def fonksiyon(args, islem): 
    #args zaten liste olduğu için yeniden listeye çevirmene (packing yapmana) gerek yok.
    
    def fonk1(args):
        toplam = 0
        for i in args:
            toplam += i
        return toplam 
    return fonk1(args)
   
    def fonk2(args):
        çarpım=1
        for i in args:
            çarpım *= i
        return çarpım
    return fonk2(args)
    
    if islem == "toplama":
        return fonk1
    elif islem == "çarpma":
        return fonk2

islem = input("işlem giriniz")   # "toplama"
sayilar = tuple(input("{}  istediğiniz sayıları giriniz".format(islem)))  # ['2', '3', '5']
sayilar =  list(int(i) for i in sayilar)

sonuc = fonksiyon(sayilar, islem)
2 Beğeni

Bu post direkt soruna cevap vermiyor. Onun yerine yapmaya calistigin seyi nasil daha iyi yapabilecegini anlatmaya calisacagim.

Oncelikle istisnai durumlar disinda Python’da fonksiyon icinde fonksiyon tanimlaman gerekmez. Basitce kafamizda ne yapmamiz gerektigini tasarlayarak ise koyulalim.

Kullanicidan kac tane olacagi belli olmayan sayilar aliyoruz. Daha sonra kullanicinin yapmak istedigi islemi secmesi lazim.

Aldigimiz bu sayilari hepsine birden kullanicinin sectigi matematiksel islemi yapiyoruz ve sonucu ekrana yazdiriyoruz. Ilk olarak input’lari almakla baslayalim:

numbers = list(map(lambda n: int(n), input("Sayilari girin: ").split()))
# "1 2 43 123 44 10" -> [1,2,43,123,44,10]
operator_input = input("Yapmak istediginiz islem (+, -, *, /): ")

Simdi ise basit bir fonksiyon yapalim. Fonksiyon bir sayi listesi ve bir fonksiyon alsin. Butun sayilara toplu olarak o fonksiyonu uygulasin ve sonucu dondursun. (Evet fold.) Imperatif olarak basitce yaziyorum:

# Ver 1
def apply_numbers(numbers, func):
    result = numbers[0]

    for number in numbers[1:]: # Listenin ilk elemani haric kalanini veriyor.
        result = func(result, number)

    return result

Kodu okumak cok zor degil. Anlasilmasinin kolay oldugunu dusundugum icin geciyorum burayi.

Su anda elimizde su isi yapan bir fonksiyon var;

In [2]: apply_numbers([1,2,3,4,5], lambda n, nn: n + nn)
Out[2]: 15

In [3]: apply_numbers([1,2], lambda n, nn: n + nn)
Out[3]: 3

In [4]: apply_numbers([1], lambda n, nn: n + nn)
Out[4]: 1

(Lambda kisminda yaptigim sey sunla esdeger:

def topla(a, b):
    return a + b

apply_numbers([1,2], topla)

)

Elimizdeki fonksiyon tam olarak istedigimiz seyi yapiyor. Bunu yukaridaki inputlarimizla birlestirmeliyiz. Ama ondan once yapmak istedigim bir sey var. Kullanicinin yapmak istedigi matematiksel islec "+, -, /, *" isleclerinden biri olacak. Ama yazdigimiz fonksiyon ikinci argumani icin bir fonksiyon istiyor. Bize matematik operatorlerinin fonksiyon halleri lazim. Soyle bir sey yapabilirdik:

def add(a, b):
    return a + b

Ama python’da bunlarin tanimli oldugu bir modul zaten var: operator.

import operator
operator.add(1,2)

Simdi ise bu fonksiyonlarla kullanicidan gelecek string inputunu eslestirmemiz lazim. Normal sartlarda soyle bir sey akla gelir:

if i == "+":
    islec = operator.add
...

Ama buna da gerek yok. Dinamik bir yapi olusturmak icin sozluk (dict) kullaniyoruz:

# Burada hangi kullanici input'u hangi isleme
# tekabul edecek onu belirliyoruz. operators[operator_input]
# bize kullanicinin hangi islemi istedigini verecek.
operators = {
    "+": operator.add,
    "-": operator.sub,
    "*": operator.mul,
    "/": operator.truediv,
}

Guzel. Simdi hepsini toparliyoruz:

import operator

# Burada hangi kullanici input'u hangi isleme
# tekabul edecek onu belirliyoruz. operators[operator_input]
# bize kullanicinin hangi islemi istedigini verecek.
operators = {
    "+": operator.add,
    "-": operator.sub,
    "*": operator.mul,
    "/": operator.truediv,
}

numbers = list(map(lambda n: int(n), input("Sayilari girin: ").split()))
operator_input = input("Yapmak istediginiz islem (+, -, *, /): ")

# Ver 1
def apply_numbers(numbers, func):
    result = numbers[0]

    for number in numbers[1:]: # Listenin ilk elemani haric kalanini veriyor.
        result = func(result, number)

    return result

print(
    apply_numbers(numbers, operators[operator_input])
)

Kodun bu hali calisiyor:

[🔴] × python test.py
Sayilari girin: 1 2
Yapmak istediginiz islem (+, -, *, /): +
3

Buraya kadar bile birsuru sey ogrendik. Simdi asil yapmak istedigim yere geliyoruz: fold.

apply_numbers fonksiyonu yerine kendi fold’umuzu yazacagiz. (functools’ta olur sandim, yokmus)

def fold(func, initial, l):
    if l == []:
        return initial

    return fold(func, func(initial, l[:1][0]), l[1:])

Bu recursive ve fonksiyonel stilde yazilmis bir fonksiyon. Hic recursive gormediysen/okumadiysan ustune dusersen okumanin cok zor olmadigini dusunuyorum. Guzel bir egzersiz olur.

Simdi bunu kodumuzda kullanma zamani.

import operator

# Burada hangi kullanici input'u hangi isleme
# tekabul edecek onu belirliyoruz. operators[operator_input]
# bize kullanicinin hangi islemi istedigini verecek.
operators = {
    "+": operator.add,
    "-": operator.sub,
    "*": operator.mul,
    "/": operator.truediv,
}

numbers = list(map(lambda n: int(n), input("Sayilari girin: ").split()))
operator_input = input("Yapmak istediginiz islem (+, -, *, /): ")

# Ver 1
def apply_numbers(numbers, func):
    result = numbers[0]

    for number in numbers[1:]: # Listenin ilk elemani haric kalanini veriyor.
        result = func(result, number)

    return result

# Ver 2
def fold(func, initial, l):
    if l == []:
        return initial

    return fold(func, func(initial, l[:1][0]), l[1:])


print(fold(
    operators[operator_input],
    # Toplama ve cikarmada ilk degerin 0 olmasi lazim,
    # ama carpma ve bolmede 0 yaparsak etkisiz eleman oldugu icin sonuc hep
    # 0 oluyor.
    0 if operator_input == "+" or operator_input == "-" else 1,
    numbers,
))

Test ediyorum:

╰─λ python test.py
Sayilari girin: 1 20 42 90
Yapmak istediginiz islem (+, -, *, /): *
75600
4 Beğeni