Взятие функции из входа с использованием лямбды - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь сделать цифровую интеграцию в Python и хочу создать конечный автомат, где вы спрашиваете у пользователя метод, функцию, диапазоны и интервалы.Но я не могу заставить его работать, он просто просит меня ввести другую функцию.

Я начинающий программист, поэтому я пробовал только код, показанный ниже.

def venstre_sum(start,end,inv,func):
    return sum([((end-start)/inv)*func(((end-start)/inv)*i+start) for i in range(inv)])

def hoejre_sum(start,end,inv,func):
    return sum([((end-start)/inv)*func(((end-start)/inv)+((end-start)/inv)*i+start) for i in range(inv)])

def trapez(start,end,inv,func):
    returnv  = (venstre_sum(start,end,inv,func)+hoejre_sum(start,end,inv,func))/2
    return returnv

def midtsum(start,end,inv,func):
    return sum([((end-start)/inv)*func(((end-start)/inv)*(i+0.5)+start) for i in range(inv)])


while True:

    state = input("Which method would you like to use? (v,h,t,m,s)")
    f = lambda x: eval(input("Funktion:"))
    ranges1 = int(input("Give a x0:"))
    ranges2 = int(input("Give a xn:"))
    inv = int(input("Amount of intervals:"))
    h = (ranges2-ranges1)/inv

    if state == "v":
        print("###########VENSTRESUMS-AREAL:")
        print(inv,"intervaller",f.__name__,"(x) A=",venstre_sum(ranges1,ranges2,inv,f))

Я хотел, чтобы он печатал мою область под функцией, но он просто спрашивал меня о другой функции.Извините, я продолжаю знать, как вставить мой код.: /

1 Ответ

0 голосов
/ 01 февраля 2019

Это:

f = lambda x: eval(input("Funktion:"))

является точным эквивалентом

def f(x):
    return eval(input("Funktion:"))

Затем вы передаете f в venstre_sum, что вызывает f, что выполняет input("Funktion"), передать результат в eval() и вернуть результат.

IOW, это ожидаемое поведение - даже если не то, что вас ожидал; -)

Первая точка здесь: НЕ используйте eval(), и особенно не для пользовательских вводов (если, конечно, вы не хотите, чтобы первый сценарий-детишка контролировал вашу программу).

Теперь вы не опубликовали ничего о том, что кто-то должен печатать как «функцию», но если это имя существующей функции, решение довольно простое и очень распространенный: создайте диктатразрешенные функции и получить функцию из этого, то есть:

def area(x):
    return x * x

def spam(x):
    return x * "spam"

# etc

FUNCTIONS = {
    "area": area,
    "spam": spam,
    # ...
    }

# and then:
funcname = input("Funktion:")
f = FUNCTIONS[funcname]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...