2012-02-20 52 views
2

所以,首先讓我說我是Python的新手,功能似乎超出了我目前的理解範圍,但在遇到問題的時候是有3個功能可以互相呼叫。這裏是我的代碼(是的,我知道這是極其錯誤的,但你應該看到我要去的地方):創建一些需要能夠在Python中互相調用的函數

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

[教程](http://docs.python.org/tutorial/controlflow.html#defining-functions)的哪一部分有問題? – 2012-02-20 03:17:16

回答

5

我做了一些改動你的代碼。對待一個功能就像一個問題。當你調用函數時;你在問這個問題。你傳遞給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

你可以用'if'替換'elif'。 – refaim 2012-02-20 04:41:43

+1

有很多方法可以改善這個代碼(如果有興趣,我可以刺穿它),但是'elif'在那裏是正確的。如果其中一個已經匹配,它將跳過對條件的評估。 – FakeRainBrigand 2012-02-20 05:12:37

+2

refaim的說法是,返回會讓你擺脫這個功能,所以,雖然在精神上更加正確,但elif在塊中只能做到3。事實上,你可以將'return cost'移到最後,而不是重複太多的代碼。正如你所說的,很多改進代碼的方法和你給函數的一般指導是可靠的。這感覺就像是一個家庭作業問題,所以我毫不猶豫地將其重新設計成理想的解決方案。 – gfortune 2012-02-20 05:26:53

0

「小計」已經調用菜單(),所以我不知道你在問什麼,因爲你已經調用另一個內的功能。

另外,我看不到你的程序應該做什麼 - 如果你的函數名稱是動詞(print_menu,get_menu,set_menu,throw_menu_on_moon,calculate_subtotal,...),那麼對於人類來說會更好。

此外,可以使用(在=的右側)函數中的名稱必須有知,因此,例如

def menu(): 
    count=gearboxes 

是沒有意義的(因爲「變速箱」是未知的 - 上另一方面,「數」是好的,因爲它定義了新的變量 - 因爲它是=的左邊)...

注意變量只能在函數中認識你定義它們,所以

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」將結果和控制返回給函數的調用者。然後將結果放入程序中「而不是呼叫」。

相關問題