【问题标题】:Python: how to make functions in arraysPython:如何在数组中创建函数
【发布时间】:2014-01-20 20:07:28
【问题描述】:

我正在尝试使我的代码更加动态和更小,因此我尝试使用一些数组,但我需要将一个函数放入数组中。我听说过 lambda,但问题是它不需要返回任何值,但它确实需要设置一个值。这是我尝试过但没有奏效的方法:

variableArray = [lambda: value = '2' if variable == 1 else None,lambda: value = '3' if variable == 1 else None]
    for k in range(len(variableArray)):
        print(variableArray[k](2))

但我无法使用此方法设置值,也无法找到任何其他方法。那么还有其他方法可以与我正在尝试做的事情一起使用吗?

【问题讨论】:

  • 这看起来真的很难阅读。有可能让它工作 - 但你应该这样做吗?我反对。
  • 如果函数足够独特,您别无选择,只能编写几个函数声明。如果它们有一个模式,则可以自动化函数构造,但如果这是真的,那么一个函数可能就足够了。如果您打算使用这两个 lambda 函数,我建议您不要这样做;用不同的代码表达相同的想法会容易得多。你到底想做什么?
  • 另请注意,“自动函数构造”有其陷阱。例如[(lambda: x+1) for x in range(5)] 返回一个函数列表,但是它们都表现得好像x4

标签: python arrays function lambda


【解决方案1】:

Python 区分expressionsstatements(这里是compound statements)。表达式可以包含任何语句。 assignment 是一个语句lambdas表达式,因此无法通过该语法使用lambda

但是使用普通的defs 不会有太大变化:

def function():
    value = '2' if variable == 1 else None

这里function 正在创建一个新的本地 变量value,为其分配其值,然后将其删除。如果你想修改一个非局部变量,你必须将它声明为global:

def function():
    global value
    value = '2' if variable == 1 else None

请注意,您可以将使用defs 定义的函数放入列表中:

some_list = [function, #other functions]

然而你应该尽量避免使用全局变量。 您应该更喜欢函数参数和返回值,以便在函数和程序的其余部分之间进行通信。

您可能特别想编写如下函数:

variableArray = [lambda arg: '2' if arg == 1 else None, lambda arg: '3' if arg == 1 else None]

你可以这样做:

for func in variableArray:
    value = func(2)

这将与您的代码具有相同的效果。


注意lambdas 应该有一个参数,否则用(2) 调用它们会引发错误。

【讨论】:

  • 问题是虽然我不想为每件事都添加一个单独的函数,因为它会变得很大所以这就是为什么我想把它放在数组中以便于更改等等
  • @user3080469 我相信您应该尝试解释您发布的代码的用途是什么。在不知道函数代表什么的情况下,我不知道我们如何帮助您找到解决方案。
  • 顺便说一句,全局变量有什么问题?它会使文件变大还是变慢或类似?
  • @user3080469 全局变量引入共享状态。共享状态增加了复杂性。复杂性增加错误。使用共享状态,如果您在其中一个函数中有错误,它可能会影响程序中修改这些全局变量的任何东西。如果没有全局变量,这种问题就会大大减少。如果您想要进行多线程和并行编程,其中可能同时发生不止一件事,则尤其如此。请参阅:en.wikipedia.org/wiki/Global_variablec2.com/cgi/wiki?GlobalVariablesAreBad
  • 如果您有一堆与某些数据相关的函数,那么也许您应该编写一个class 以协调的方式处理该状态。
【解决方案2】:

数组中的函数是可能的。但是你不能在 lambdas 中赋值。尽管将 2 传递给它们,但您的 lambda 没有接受任何参数。

for k in range(len(variableArray)): 是一种浪费的坏形式。试试吧:

for k in variableArray:
    print(k(2))

至于功能,也许你想要这个?

variableArray = [lambda x: '2' if x == 1 else None, lambda x: '3' if x == 1 else None]

【讨论】:

  • 然后,OP,要设置一个值,你可以做类似var = variableArray[1](2)
  • 谢谢@jmu303。固定
  • 再一次,我希望能够设置我想在数组中更改的变量,因为它将是不同的变量
  • 您能否举例说明您想在问题中设置哪些变量?
  • 只是一大堆变量,它基本上改变了我正在制作的游戏的状态,所以我需要改变“帧”、“动作”、“加速度”、“跳跃时间”等.它可能会变得更大,所以我想尝试将它们设置在一个数组中
【解决方案3】:

尚不完全清楚您需要什么,但也许这更接近您所追求的。


如果您想从函数列表中获取值列表,将单个参数传递给函数列表,请尝试以下操作:

functions = [lambda x: '2' if x == 1 else None, lambda x: '3' if x == 1 else None]
values = [function(2) for function in functions]

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 2016-02-24
    • 2016-02-27
    • 2015-12-07
    • 2021-12-11
    • 2017-09-03
    相关资源
    最近更新 更多