【问题标题】:Python functions within lists列表中的 Python 函数
【发布时间】:2013-02-19 00:18:43
【问题描述】:

所以今天在计算机科学中,我询问了将函数用作变量的问题。例如,我可以创建一个函数,例如returnMe(i),并创建一个用于调用它的数组。比如h = [help,returnMe],然后我可以说h1,它会调用returnMe("Bob")。对不起,我对此有点兴奋。我的问题是有没有办法像h.append(def function) 这样调用并定义一个只存在于数组中的函数?

编辑:

这是我用这个写的一些代码! 所以我刚刚用这个解决方案完成了一个很棒的 FizzBu​​zz 再次非常感谢你!以该代码为例:

funct = []
s = ""

def newFunct(str, num):
    return (lambda x: str if(x%num==0) else "")

funct.append(newFunct("Fizz",3))
funct.append(newFunct("Buzz",5))

for x in range(1,101):
    for oper in funct:
        s += oper(x)
    s += ":"+str(x)+"\n"

print s

【问题讨论】:

    标签: python list functional-programming


    【解决方案1】:

    您可以使用 lambda 关键字创建匿名函数。

    def func(x,keyword='bar'):
        return (x,keyword)
    

    大致相当于:

    func = lambda x,keyword='bar':(x,keyword)
    

    所以,如果你想创建一个包含函数的列表:

    my_list = [lambda x:x**2,lambda x:x**3]
    print my_list[0](2)  #4
    print my_list[1](2)  #8
    

    【讨论】:

    • 所以这太棒了!非常感谢!我们还在谈论 fizzBu​​zz,我认为解决它会很酷!
    【解决方案2】:

    不是真的在 Python 中。正如 mgilson 所示,您可以使用普通函数执行此操作,但它们只能包含表达式,而不是语句,因此非常有限(例如,您不能分配给变量)。

    当然,其他语言也支持这一点:例如,在 Javascript 中,创建大量匿名函数并传递它们是一种非常惯用的做法。

    【讨论】:

    • 刚刚完成:这是 Python 和 Javascript(以及其他允许函数式方法的语言)的独特之处之一。这是一种设计选择 - 以一些灵活性换取可读性。
    • 附注。 Lambda 术语不一定是“微不足道的”。它们不能包含语句的事实并没有限制它们,如果它确实限制了它们(使用纯函数方法,许多语句是多余的)。您不能分配给 lambda 项内的变量这一事实根本不会限制它。如果这些方面确实是限制,那么纯函数式语言将非常有限(它们不是)。我什至不确定是否存在一个不能写成 lambda 术语的 python 程序(如果不是因为 python 不做 LCO)。
    • 我也同意@Hyperboreus 我在 python 中使用 lambdas 玩了很多,甚至写了一个只有两行的遗传算法,一个导入随机,另一个大约 2000 个字符长。 ..
    • @Hovestar 您描述的程序的第一行似乎是多余的。您可以使用__import__ 导入功能。例如。 (lambda r: r.randint (0, 5) ) (__import__('random') ).
    【解决方案3】:

    您可以在原始范围内创建函数,将它们分配给数组,然后将它们从原始范围中删除。因此,您确实可以从数组中调用它们,但不能作为局部变量。我不确定这是否符合您的要求。

    #! /usr/bin/python3.2
    
    def a (x): print (x * 2)
    def b (x): print (x ** 2)
    
    l = [a, b]
    
    del a
    del b
    
    l [0] (3) #works
    l [1] (3) #works
    a (3) #fails epicly
    

    【讨论】:

      【解决方案4】:

      您可以创建一个 lambda 函数列表,以按从 0 到 9 的每个数字递增,如下所示:

      increment = [(lambda arg: (lambda x: arg + x))(i) for i in range(10)]
      increment[0](1) #returns 1
      increment[9](10) #returns 19
      

      旁注:

      我认为同样重要的是要注意 this(函数指针不是 lambdas)有点像 python 在大多数类中保存方法的方式,除了它不是一个列表,它是一个函数名指向函数的字典。在许多但并非所有情况下,instance.func(args) 等同于 instance.__dict__['func'](args)type(class).__dict__['func'](args)

      【讨论】:

        猜你喜欢
        • 2019-03-26
        • 1970-01-01
        • 2022-11-24
        • 2015-10-07
        • 2023-03-10
        • 2013-06-30
        • 2014-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多