#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. Обратите внимание, что как только одна из ваших функций будет названа
Ответ №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'))