2015-09-28 62 views
2

是新來的Python - 都做在PHP,JavaScript的一些腳本,但我不是一個程序員(雖然是一個高科技的作家有經驗記錄的API等,所以相當廣泛的「被動」的編程懂得):有什麼方法可以將函數存儲在變量中,並創建可變容量函數的列表?

  1. 在此處執行以下步驟:https://en.wikibooks.org/wiki/A_Beginner的_Python_Tutorial/Functions。具體見鏈接re:簡單的計算器程序

  2. 想弄清楚如果我可以通過以列表形式存儲所有組件的不同冗餘計算,然後有一個非常簡單的通用方法來處理任何計算請求,通過使用用戶的菜單選項作爲列表中的索引。我假設以這種方式構建事物是一種很好的形式,但不知道!原來的教程顯然更可讀,但將意味着同樣的錯誤檢查就需要重複做了每個小的「如果」塊...

在任何情況下,雖然,我無法弄清楚如何將實際計算作爲元素存儲在列表中。那可能嗎?這就是我所得到的......我在那裏設法封裝和調用列表中的一些細節,但仍需爲每個單獨的計算執行一系列「if」語句。

(很抱歉,如果這些問題都是基本的。我做了一堆沒有找到明確的文件重新搜索的:這裏是你可以和不能以列表的形式捕捉一切)這樣 - 我的鏈接代碼變化:

#simple calculator program 
# Prompts for possible calculations 

add = ["Add this: ", "to this: ", "+"] 
subtract = ["Subtract this: ", "from this: ", "-"] 
multiply = ["Multiply this: ", "by this: ", "*"] 
divide = ["Divide this: ", "by this: ", "/"] 

# List of possible calculations 
calcPrompts = [add, subtract, multiply, divide] 

def promptEntries(Arg): 
    try: 
     op1 = int(input(Arg[0])) 
     op2 = int(input(Arg[1])) 
     operator = (Arg[2]) 
     return op1, op2, operator 
    except: 
     print("Invalid entry. Please try again.") 
choice = 0 

#This variable tells the loop whether it should loop or not. 
# 1 means loop. Anything else means don't loop. 

loop = 1 

while loop == 1: 
    #Display the available options 
    print ("\n\nCalculator options are:") 
    print (" ") 
    print ("1) Addition") 
    print ("2) Subtraction") 
    print ("3) Multiplication") 
    print ("4) Division") 
    print ("5) Quit calculator.py") 
    print (" ") 

    try: 
     choice = int(input("Choose your option: ")) 
     choice = choice - 1 
     op1, op2, operator = promptEntries(calcPrompts[choice]) 
     print(op1, operator, op2, "=", end=" ") 
     if choice == 0: 
      print(op1 + op2) 
     elif choice == 1: 
      print(op1 - op2) 
     elif choice == 2: 
      print(op1 * op2) 
     elif choice == 3: 
      if op2 != 0: 
       print(op1/op2) 
      else: 
       print("Division by zero is invalid, please try again.") 
     elif choice == 4: 
      loop = 0 
      print ("Thank you for using calculator.py") 
    except: 
     print("invalid entry, please try again.") 

回答

2

對於您的情況,您可以使用運算符作爲operator標準庫模塊提供的函數。如你所見,你可以將這些函數分配給一個變量,例如,將所有的人都在名單

import operator as op 
f = [op.add, 
    op.sub, 
    op.mul, 
    op.div, 
    op.pow, 
    op.mod] 

則環就

while True: 
    #Display the available options 
    print ("\n\nCalculator options are:") 
    for i, fun in enumerate(f): 
     print("{}) {}".format(i+1, fun.__name__)) 
    print ("{}) Quit calculator.py".format(len(f))) 

    choice = int(input("Choose your option: ")) - 1 
    if choice == len(f): 
     print("Thank you for using calculator.py") 
     break 
    op1 = int(input("enter operand1: ")) 
    op2 = int(input("enter operand2: ")) 

    try: 
     result = f[choice](op1, op2) 
    except IndexError: 
     print("invalid entry, please try again.") 
    except ZeroDivisionError: 
     print("Division by zero is invalid, please try again.") 

    print('{} {} {} = {}'.format(op1, f[choice].__name__, op2, result)) 

注:例如適用於僅二元函數。如果您想要提供具有不同參數數量的函數組合,則需要做進一步的工作。

+0

感謝代碼Pynchia。非常感謝最初的信息:導入操作員..模塊(?)...以及作爲結果創建列表的能力。除此之外......我還不太熟悉的沒有註釋的代碼。將嘗試破譯它們並找出菜單消失的地方等等! :-)其中,彙總的語法對我來說是目前所不具備的:對於我來說,枚舉(f)中的樂趣: print(「{}){}」.format(i + 1,fun .__ name__)).. 。但我很欣賞這篇文章 - 思考的食物! : - )...很多學習 – Margarita

+0

不客氣。請善良,接受答案和/或upvote那些你得到 – Pynchia

+0

嗨Pynchia,讓我看看第一,如果我可以做一個,或兩個答案的組合在我的代碼練習,在這種情況下,我會很樂意接受回答/給予好評。 (可能沒有時間去幾天)。祝你有個美好的夜晚。 – Margarita

1

是的,在Python函數是第一類對象,你可以用任何方式使用它們,你會使用任何其他對象。例如,你可以有兩個變量引用相同的對象:從列表

def myFunction(): 
    pass 

newVariable = myFunction 
print(newVariable is myFunction) 

或引用函數或詞典:

myList = [myFunction, 1, 2, 3] 
print(myList[0] is myFunction) 
myDict = {0:myFunction, 1:1} 
print(myDict[0] is myFunction) 

以上是內置函數都蟒蛇的真實,功能標準庫和你寫的函數。例如:

from operator import add 

def countZeros(a): 
    return sum(item == 0 for item in a) 

listOfFunctions = [sum, add, countZeros] 
+0

謝謝,畢里科。將與你提供的東西一起工作,看看我能不能提出新的和改進的代碼位。 – Margarita

相關問題