Функция не вызывается должным образом

#python #function #python-3.x #calling-convention

#питон #функция #python-3.x #вызов-соглашение

Вопрос:

 def main():

    def load():
        name=0
        count=0
        totalpr=0
        name=input("Enter stock name OR -999 to Quit: ")
        while name != '-999':
            count=count 1
            shares=int(input("Enter number of shares: "))
            pp=float(input("Enter purchase price: "))
            sp=float(input("Enter selling price: "))
            commission=float(input("Enter commission: "))
            name = input("Enter stock name OR -999 to Quit: ")

    def calc():
        amount_paid=shares*pp
        commission_paid_purchase=amount_paid*commission
        amount_sold=shares*sp
        commission_paid_sale=amount_sold*commission
        profit_loss=(amount_sold - commission_paid_sale) -(amount_paid   commission_paid_purchase)
        totalpr=totalpr profit_loss

    def print():
        print("nStock Name:", name)
        print("Amount paid for the stock:       $",      format(amount_paid, '10,.2f'))
        print("Commission paid on the purchase: $", format(commission_paid_purchase, '10,.2f'))
        print("Amount the stock sold for:       $", format(amount_sold, '10,.2f'))
        print("Commission paid on the sale:     $", format(commission_paid_sale, '10,.2f'))
        print("Profit (or loss if negative):    $", format(profit_loss, '10,.2f'))
        print("Total Profit is $", format(totalpr, '10,.2f'))
        return main()




load() #to input the values
calc()
print()
  

Я не уверен, что я делаю не так:

Должен ли я вводить имена переменных в def load(): , def calc(): и def print(): ?

Когда я запускаю его сейчас, он говорит "load" , что не определен. Как бы я мог определить load ? И если уж на то пошло, если я не определил def calc(): и def print(): как мне их определить?

Я правильно вызываю их в конце кода, в том порядке, в котором я хотел бы их вызвать — load , calc , и затем print .

Является ли мое « return main() » правильным поступком? Я не знаю, я просто хочу, чтобы этот код выполнялся правильно, без ошибок, вот и все. У меня сложилось впечатление, что я просто упускаю несколько вещей. Любая помощь будет признательна.

Комментарии:

1. Вы определили load внутри main , поэтому она не видна снаружи main . Почему вы определяли функции внутри main , если вы не собирались использовать main ?

2. Хорошо, как мне использовать main, продолжая вызывать load(), calc() и print()?

3. Мне лично не нравится использовать основные функции. Я нахожу их лишними. Многие категорически не согласны. Но если это так, обычно вы определяете свои функции вне main , а затем вызываете функции в том порядке, в котором вы хотите внутри main . Тогда последняя строка файла является вызовом main() . Нет необходимости возвращать что-либо из main .

4. Не связано, но смотрите Здесь о том, как правильно форматировать строки. pyformat.info

5. Обратите внимание, что как только одна из ваших функций будет названа print , вы больше не сможете использовать встроенную print !

Ответ №1:

Вы определяете load() внутри области видимости main() . Это означает, что вы не можете использовать функцию вне main() .

Простое решение заключается в том, что вы должны поместить определения вашей функции для load , calc и print вне определения main() (кстати, назовите это как-то иначе print_stock info , print уже является функцией!)

Вам также не нужно return main() . Я не уверен, что вы пытаетесь сделать, но это совсем не обязательно.

Комментарии:

1. Что я пытаюсь сделать:

2. def main(): load() calc() print()

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

4. вы абсолютно можете это сделать. определите свои функции над main, а затем вызовите их внутри main.

5. Итак, теперь у меня есть [в порядке сверху] def load(): за которым следует def calc():, def print(): и, наконец, def main(): и внутри def main(): это load(), calc() и print() . Но когда я запускаю ее, я не получаю абсолютно ничего. Вывод пустой.

Ответ №2:

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

 class Main:
    def load(self):
        #do a thing
  

тогда вам нужно будет сделать

 main = Main()
main.load()
  

вашей второй ошибкой было определение новой функции print(), которая использует функции печати, поскольку она уже существует. Переименуйте его, так как это приведет к огромной ошибке

Комментарии:

1. Определенно нет необходимости в классе. Это не Java.

2. Кроме того, вызов функций из других функций является совершенно нормальным (если, конечно, вы не имеете в виду бесконечную рекурсию, которая возникает при вложении этих функций друг в друга).

Ответ №3:

Это минимальный рабочий пример, иллюстрирующий, как можно решить то, что вы пытаетесь сделать.

 # helper for interpreting input
import ast
#: initial starting values
thing, count, cost, total = 'Nothing', 0, 0, 0

# define all functions at module indentation
def get_user_input():
    global thing, count, cost  # write to the GLOBAL names thing, count and cost
    thing = input('What have you?')  # ask for a string
    count = ast.literal_eval(input('How much do you have?'))  # ask for a string and interpret it: "3.2" => float
    cost = ast.literal_eval(input('How much does each cost?'))

def compute():
    global total  # write to global name total
    total = count * cost  # can read from global names

def pretty_print():  # not named print! we still need print to print!
    print("You have", count, thing)
    print("At", cost, "each, that makes", total, "in total")

# call functions at module indentation
get_user_input()  # ducks, 3, 42
compute()
pretty_print()
# You have 3 ducks
# At 42 each, that makes 126 in total
  

Следует предупредить вас об одном: работа с глобальными переменными, как правило, является плохой идеей. Для небольшого скрипта это нормально, но вы уже испортили основы — глобальные переменные сложны, поэтому избегайте их, когда это возможно. Если вы просто хотите выполнить эти команды, не записывайте их как функции, выполняйте их напрямую. В принципе, оставьте def ... строки global ... и и поместите все в один и тот же отступ, затем удалите последние три строки.

Если вы действительно хотите хранить и печатать несколько объектов, вам нужно использовать контейнеры. Простое присвоение значения в цикле, например thing = input('What have you?') , оставит его на последнем введенном значении. Вместо этого вам нужен контейнер, подобный a list . Затем вы можете append добавить к ней дополнительные значения.

 container = []  # [] is a list literal
for _ in range(3):  # non-infinite loop
    next_thing = ast.literal_eval(input('Place your order...n'))
    container.append(next_thing)
print("You ordered", container)
  

Комментарии:

1. Спасибо. Я попробовал это. Итак, теперь у меня есть [в порядке сверху] def load(): за которым следует def calc():, def print(): и, наконец, def main(): и внутри def main(): это load(), calc() и print() . Но когда я запускаю ее, я не получаю абсолютно ничего. Вывод пустой.

2. Это для школьного задания — то, что было прямой строкой кода, было сказано преобразовать в 3 функции. Вот почему это действительно неуклюже.

3. Если вы пробовали это и все еще def load используете, def calc и def print , вам обязательно следует попробовать это снова… Подсказка: у вас не должно быть def print .

Ответ №4:

 def load():    
    global name
    global count
    global shares
    global pp
    global sp
    global commission
    name=input("Enter stock name OR -999 to Quit: ")
    count =0
    while name != '-999':
        count=count 1
        shares=int(input("Enter number of shares: "))
        pp=float(input("Enter purchase price: "))
        sp=float(input("Enter selling price: "))
        commission=float(input("Enter commission: "))
        calc()
        display()
        name=input("nEnter stock name OR -999 to Quit: ")

def calc():
    global amount_paid
    global amount_sold
    global profit_loss
    global commission_paid_sale
    global commission_paid_purchase
    global totalpr
    totalpr=0
    amount_paid=shares*pp
    commission_paid_purchase=amount_paid*commission
    amount_sold=shares*sp
    commission_paid_sale=amount_sold*commission
    profit_loss=(amount_sold - commission_paid_sale) -(amount_paid   commission_paid_purchase)
    totalpr=totalpr profit_loss

def display():
    print("nStock Name:", name)
    print("Amount paid for the stock:       $",      format(amount_paid, '10,.2f'))
    print("Commission paid on the purchase: $", format(commission_paid_purchase, '10,.2f'))
    print("Amount the stock sold for:       $", format(amount_sold, '10,.2f'))
    print("Commission paid on the sale:     $", format(commission_paid_sale, '10,.2f'))
    print("Profit (or loss if negative):    $", format(profit_loss, '10,.2f'))

def main():
    load()


main()

print("nTotal Profit is $", format(totalpr, '10,.2f'))