Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在字典[Python]中存储函数_Javascript_Python_Arrays_Dictionary_Data Structures - Fatal编程技术网

Javascript 在字典[Python]中存储函数

Javascript 在字典[Python]中存储函数,javascript,python,arrays,dictionary,data-structures,Javascript,Python,Arrays,Dictionary,Data Structures,我目前正在构建一个应用程序,在这个应用程序中,我需要迭代一系列步骤,这些步骤基本上完成相同的工作,只需保存少量代码(~15行)。步骤的数量取决于项目的配置方式,因此为每个潜在实例创建单独的函数似乎有点傻 在JavaScript中,我会这样做: var switches = [true, true, false, true]; var holder = { 0: function() { /* do step0 */ } 1: function() { /* do step1 *

我目前正在构建一个应用程序,在这个应用程序中,我需要迭代一系列步骤,这些步骤基本上完成相同的工作,只需保存少量代码(~15行)。步骤的数量取决于项目的配置方式,因此为每个潜在实例创建单独的函数似乎有点傻

在JavaScript中,我会这样做:

var switches = [true, true, false, true];

var holder = {
    0: function() { /* do step0 */ }
    1: function() { /* do step1 */ }
    2: function() { /* do step2 */ }
    3: function() { /* do step3 */ }
    // ...etc...
}

for (var i = 0; i < switches.length; i++)
    if (switches[i])
        holder[i]();
switches = [True, True, False, True]

class Holder(object):
    @staticmethod
    def do_0():
        # do step0

    @staticmethod
    def do_1():
        # do step 1

    # ...etc...

    def __repr__(self):
        return [self.do_0, self.do_1, ...]

for action in Holder:
    action()

如果我有大量的步骤,这看起来效率非常低。有没有更好的方法来解决这个问题?

您可以按如下方式进行:

# define your functions
def fun1():
    print("fun1")

def fun2():
    print("fun2")

def fun3():
    print("fun3")


switches = [True, False, True];

# put them in a list (list makes more sense than dict based on your example)
func_list = [fun1, fun2, fun3]

# iterate over switches and corresponding functions, and execute 
# functions when s is True    
for s,f in zip(switches, func_list):
    if s: f() 
这只是一种方式。还有很多其他的。e、 g.根据需要使用lambdas、dict等

若要在函数仅为一行时使用lambdas,可以执行以下操作:

func_list = [lambda: print("lambda1"), 
             lambda: print("lambda2"), 
             lambda: print("lambda1")]
简化代码

d = {0: lambda: 'Performing Step 0',
     1: lambda: 'Performing Step 1',
     2: lambda: 'Performing Step 2',
     3: lambda: 'Performing Step 3',
     4: lambda: 'Performing Step 4'}

for index, switch in enumerate([1, 0, 1, 1, 0]):
    if switch == 1: d[index]() 

在Python中似乎没有这样做的方法,这是一个故意做出的设计决策,因为它被认为是非Python的。哦,看来我一直在定义方法,然后手动将它们添加到列表中进行迭代


来源:

我通常会这样做。 我喜欢这种方法,因为它为代码增加了最少的键入开销,而且如果以后编写了其他方法,则不需要在文件的其他地方修改任何内容

def steptest0():
    code
def steptest1():
    code
def steptest2():
    code

...

tests = filter(lambda x: x.startswith('steptest'),
               dir())
for t in tests: eval(t + '()')
在Python中,每个方法都已自动放入字典中,
dir()
允许我们访问它


免责声明。一看到“eval”,普通行人狂热者的头脑中就开始响起多个警钟,有些人甚至会癫痫发作。让他们通过使用反射机制来避免eval(这可能会降低可读性,但仍然值得,因为他们不会被指责使用“eval”)。

您的代码确实有效,但我试图避免在字典范围之外定义一堆函数。我可以使用我已有的代码。不幸的是,我正在使用的代码比示例要复杂得多,如果不快速使代码不可读,我无法真正定义一组函数。但是你不能把所有的东西都放在lambda中,Python没有像JS这样的匿名函数。是的,有s,但它们只限于一个表达式。是的,如果lambdas的限制稍微小一点就好了。不幸的是,对于一些更复杂的函数,我需要大约15行。@RobertIngrum,所以需要将它们分开。您可以使用这些函数创建一个模块,也可以像以前那样创建一个类。在我的实际示例中,Holder类实际上只是一个helper类,用于保存步骤处理器的所有设置。起初我也考虑过使用lambdas,但看起来它们不会太复杂(也就是说,它们不适用于15行代码)。装饰师可能更符合您的要求。做这件事的最佳方式是什么?如果我用同一个decorator定义所有函数,有没有简单的方法来循环它们而不创建循环列表?
def steptest0():
    code
def steptest1():
    code
def steptest2():
    code

...

tests = filter(lambda x: x.startswith('steptest'),
               dir())
for t in tests: eval(t + '()')