#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
объявлений. Я бы использовал adict
для хранения всех данных, но это противоречит предоставленной четкой инструкции.