有没有办法在变量中存储函数并创建可变容纳函数的列表?

时间:2015-09-28 20:36:41

标签: python list function

我是Python的新手 - 已经用PHP,javascript完成了一些脚本,但我不是程序员(虽然我是一位有文档API等经验的技术作家,所以非常广泛的'被动'编程知道如何)。:

  1. 在此处执行了以下步骤:https://en.wikibooks.org/wiki/A_Beginner's_Python_Tutorial / Functions。具体请参见链接re:简单计算器程序

  2. 想要弄清楚我是否可以通过以列表形式存储不同计算的所有组件来减少程序冗余,然后使用用户的菜单选项作为处理任何计算请求的非常简单的通用方法列表的索引。我认为以这种方式构建事物的形式很好,但不知道!原始教程显然更具可读性,但意味着需要对每个小“if”块重复进行相同的错误检查...

  3. 无论如何,我无法弄清楚如何将实际计算存储为列表中的元素。那可能吗?这就是我所得到的...我设法封装并调用列表中的一些细节,但是仍然必须为每个单独的计算执行一系列“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 个答案:

答案 0 :(得分: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))

注意:该示例仅适用于二元函数。如果您想要提供具有不同数量参数的混合函数,则需要进一步的工作。

答案 1 :(得分: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)

以上内容适用于python的内置函数,标准库中的函数和您编写的函数。例如:

from operator import add

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

listOfFunctions = [sum, add, countZeros]