Нужен main для правильного вызова функций по порядку

#python #function #python-3.x

#python #функция #python-3.x

Вопрос:

 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: "))
        name=input("nEnter stock name OR -999 to Quit: ")

totalpr=0
def calc():
    global amount_paid
    global amount_sold
    global profit_loss
    global commission_paid_sale
    global commission_paid_purchase
    global totalpr
    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()
    calc()
    display()

main()

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

Мне нужно main(): вызывать load() calc() и display() в таком порядке. Однако программа останавливается после загрузки. Вывод будет просто выполнять циклическую загрузку без вычисления или печати.

Мне было специально дано указание НЕ размещать calc() and display() в блоке цикла while, каким бы заманчивым это ни было. Также обратите внимание, что это решает проблему, но это не то решение, которое я специально ищу.

Что мне нужно сделать, чтобы эта программа работала правильно?

ВЫВОД ДОЛЖЕН ВЫГЛЯДЕТЬ СЛЕДУЮЩИМ ОБРАЗОМ:

 Enter stock name OR -999 to Quit: APPLE
Enter number of shares: 10000
Enter purchase price: 400
Enter selling price: 800
Enter commission: 0.04

Stock Name: APPLE
Amount paid for the stock:       $ 4,000,000.00
Commission paid on the purchase: $ 160,000.00
Amount the stock sold for:       $ 8,000,000.00
Commission paid on the sale:     $ 320,000.00
Profit (or loss if negative):    $ 3,520,000.00

Enter stock name OR -999 to Quit: FACEBOOK
Enter number of shares: 10000
Enter purchase price: 5
Enter selling price: 500
Enter commission: 0.04

Stock Name: FACEBOOK
Amount paid for the stock:       $  50,000.00
Commission paid on the purchase: $   2,000.00
Amount the stock sold for:       $ 5,000,000.00
Commission paid on the sale:     $ 200,000.00
Profit (or loss if negative):    $ 4,748,000.00

Enter stock name OR -999 to Quit: -999
Total Profit is $ 14,260,000.00
 

ВОТ ОШИБКА ВЫВОДА, КОТОРУЮ Я ПОЛУЧАЮ:

 ====== RESTART: C:UsersElsaDesktopHomework 3, Problem 1.py ======
Enter stock name OR -999 to Quit: YAHOO!
Enter number of shares: 10000
Enter purchase price: 10
Enter selling price: 100
Enter commission: 0.04

Enter stock name OR -999 to Quit: GOOGLE
Enter number of shares: 10000
Enter purchase price: 15
Enter selling price: 150
Enter commission: 0.03

Enter stock name OR -999 to Quit: -999

Stock Name: -999
Amount paid for the stock:       $ 150,000.00
Commission paid on the purchase: $   4,500.00
Amount the stock sold for:       $ 1,500,000.00
Commission paid on the sale:     $  45,000.00
Profit (or loss if negative):    $ 1,300,500.00

Total Profit is $ 1,300,500.00
>>> 
 

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

1. судя по вашему описанию, он работает так, как задумано. Можете ли вы уточнить свою проблему? load , calc , display вызываются последовательно, следующий вызывается после завершения предыдущего (возвращается из вызова). Вы уверены, что правильно понимаете, как работают функции и циклы?

2. Вы используете globals много. Было бы намного лучше, если бы вы передавали их в качестве аргументов функции.

3. Это третий пост с практически тем же кодом за несколько дней. Какие ограничения у вас, ребята?

4. ваш учитель, похоже, указывает вам использовать списки для хранения значений. В настоящее время вы теряете все значения, поскольку они перезаписываются последним (и имя всегда равно -999).

5. Если программа работала правильно (чего не происходит), она запрашивала входные данные, вычисляла, а затем немедленно отображала входные данные. Прямо сейчас он просто запрашивает входные данные, затем выполняет цикл и снова запрашивает входные данные. И снова. Имеет ли это смысл?

Ответ №1:

Первая проблема заключается в том, что вы блокируете переменную name каждый раз, когда выполняете оператор ввода. Вам нужно присвоить результат ввода временной переменной и проверить ее на равенство -999, вот так:

 def load():    
    global name
    global count
    global shares
    global pp
    global sp
    global commission
    count =0
    while True:
        s=input("Enter stock name OR -999 to Quit: ")
        if s == '-999':
            break
        name = s
        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 будет действительное стандартное имя.

Вторая проблема заключается в том, что ваш учитель, по-видимому, дал вам указание не делать именно то, что вам нужно сделать, чтобы заставить вашу программу работать. Если вы не можете поместить функции, которые вам нужно вызвать внутри цикла, они могут выполняться только один раз. В этом случае логически невозможно получить отдельную распечатку для каждого запаса. Я не могу вам в этом помочь.

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

1. В соответствии с его желаемым результатом, name никогда не используется снова после установки "-999" .

2. За исключением того, что он используется в первой строке display . Я только что заметил, что он сказал в одном из комментариев, что он «обязан использовать функции», а затем, по-видимому, запретил вызывать эти функции изнутри цикла! Возможно, между ним и учителем какое-то недопонимание.

3. Я почти уверен, что есть. 😉

Ответ №2:

На основе вашего комментария

 take the calc() and display() inside the loop and move them directly into def main():
 

это соответствует вашему ожидаемому результату:

 def main():
    name=input("Enter stock name OR -999 to Quit: ")
    count, totalpr = 0, 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: "))
        # calculation
        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
        # printing
        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'))
        # next loop
        name=input("nEnter stock name OR -999 to Quit: ")

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

Это похоже на упражнение по рефакторингу — объединение функций в одну функцию.

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

1. Вы переместили код из calc display цикла while и внутри него, а не вызовы функций. Я бы назвал это шагом назад в том, что касается стиля программирования, но, возможно, вы правы, что это то, чего хочет учитель.

2. @PaulCornelius согласился, это нехорошо. Однако это кажется намного приятнее, чем тонны global объявлений. Я бы использовал a dict для хранения всех данных, но это противоречит предоставленной четкой инструкции.