Создание ряда функций, которые должны иметь возможность вызывать друг друга в Python - PullRequest
2 голосов
/ 20 февраля 2012

Итак, сначала позвольте мне сказать, что я новичок в Python, и функции, по-видимому, на данный момент находятся вне моего понимания, но в случае возникновения проблем, когда 3 функции могут вызывать друг друга. Вот мой код (да, я знаю, что это ужасно неправильно, но вы должны увидеть, куда я иду):

def menu():
    count=gearboxes
    cost=subtotal
    return subtotal


def quantity():

    gearboxes=raw_input("How many gearboxes would you like to order? ")

    return menu()



def subtotal(cost):
    if (gearboxes<=10):
        cost=gearboxes*100.0
        print cost
    elif (gearboxes>10 and gearboxes<20):
        cost=(gearboxes-10)*80.0+1000.0
        print cost
    elif (gearboxes>20):
        cost=(gearboxes-20)*70.0+1000.0+800.0
        print cost
    else:
        print "wtf m8"

    return menu()

def summary():
    print "="*80
    print "%60s %20f %20f" % ("motors",count,cost)
    print "="*80


print quantity()
print subtotal(menu)
print summary(menu)

Это возможно, и любая помощь будет принята с благодарностью, если бы вы могли объяснить, как функции вызывают друг друга.

Спасибо!

исправленная версия (все еще работает)

    def quantity():
        motors=raw_input("How many motors would you like to order? ")
        gearboxes=raw_input("How many gearboxes would you like to order? ")
        sensors=raw_input("How many sensor boards would you like to order? ")

        return int(motors),int(gearboxes),int(sensors)



   def subtotal(motors,gearboxes,sensors):

        if motors<=10 and gearboxes<=15:
            motorCost=motors*100
            gearboxCost=gearboxes*50
            sensorCost=sensors*66
            return motorCost, gearboxCost, sensorCost

        if motors>10 and motors<=20 and gearboxes>15 and gearboxes<=30:
            motorCost=(motors-10)*80+1000
            gearboxCost=(gearboxes-15)*40+750
            sensorCost=sensors*66
            return motorCost, gearboxCost, sensorCost

        elif motors>20 and gearboxes>30:
            motorCost=(motors-20)*70+1000+800
            gearboxCost=(gearboxes-30)*30+750+600
            sensorCost=sensors*66
            return motorCost, gearboxCost, sensorCost

    def summary(motors,gearboxes,sensors,motorCost,gearboxCost,sensorCost):
        print "="*80
        print "%60s %20d %20d" % ("motors",motors,motorCost)
        print "%60s %20d %20d" % ("gearboxes",gearboxes,gearboxCost)
        print "%60s %20d %20d" % ("sensor boards",sensors,sensorCost)
        print "="*80


   def menu():

        a,b,c=quantity()
        d,e,f=subtotal(a,b,c)
        summary(a,b,c,d,e,f)
        return


    menu()

Ответы [ 2 ]

5 голосов
/ 20 февраля 2012

Я внес некоторые изменения в ваш код.Относитесь к функции как к вопросу.Когда вы вызываете функцию;ты задаешь вопрос.То, что вы передаете return, является ответом на вопрос.Поэтому, когда кто-то просит subtotal некоторого количества коробок передач;мы возвращаем cost, что бы это ни было.

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

def quantity():
    count=raw_input("How many gearboxes would you like to order? ")
    return int(count)



def subtotal(count):
    if count<=10:
        cost=count*100.0
        return cost
    elif count>10 and count<20:
        cost=(count-10)*80.0+1000.0
        return cost
    elif count>20:
        cost=(count-20)*70.0+1000.0+800.0
        return cost

def summary(count, cost):
    print "="*80
    print "%60s %20f %20f" % ("motors",count,cost)
    print "="*80

def menu():
    items = quantity()
    sub = subtotal(items)
    summary(items, sub)

if __name__ == '__main__':
    menu()
0 голосов
/ 20 февраля 2012

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

Кроме того, я не вижу, что ваша программа должна делать - если ваши имена функций будут глаголами (print_menu, get_menu, set_menu, throw_menu_on_moon, Calculate_subtotal, ...), было бы лучше понять для людей.

Кроме того, имена, которые вы используете (в правой части =) внутри функции, должны быть известны там, например,

def menu():
    count=gearboxes

не имеет смысла (потому что "коробки передач" неизвестны - с другой стороны, "count" в порядке, поскольку он определяет новую переменную - поскольку он находится слева от =) ...

Обратите внимание, что переменные известны только в функции, в которой вы их определили, поэтому

def f():
    gearboxes = 2
def menu():
    count=gearboxes

тоже не имеет смысла.

Но

def f():
    return 2
def menu():
    gearboxes=f()
    count=gearboxes

будет иметь смысл.

Прочитайте

def calculate_subtotal(gearbox_count):

как «для вычисления промежуточного итога подсчета коробки передач».

Если вы потом скажете где-нибудь снаружи:

calculate_subtotal(5)
^^^^^^^^^^^^^^^^^^^^^

тогда подчеркнутая часть будет заменена возвращенным результатом.

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

«return» - это не «goto», «return» возвращает результат - и контроль - вызывающей функции. Затем результат помещается в программу «вместо вызова».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...