在python中定义循环中的许多函数

时间:2014-05-15 22:19:09

标签: python function loops

我想根据我在循环中的位置制作很多函数。例如:

k=0    
for i in range(1,64):
    for j in range (1,64):
        for h in range(1,65-i):
            for w in range(1,(65-j)/2):
               k = k+1
               def make_feature+str(k)(imgmat, i, j, h, w):

这样的事情可能吗?我需要很多像这样的功能。

4 个答案:

答案 0 :(得分:4)

您尝试做的事情是为ijkw创建预先指定值的函数。也就是说,您不希望传递这些值,您希望函数已经知道它们,并且根据您调用的确切函数使它们不同。

这几乎没有意义,你只需要调用函数并传入值就可以了,但可以完成。

首先,我们需要一个能够产生所需功能的功能,然后在"中烘烤。预定义的变量。由于您是Python的新手,我不会详细了解原因,我只是指出我们需要它。 (您也可以使用functools.partial或默认参数值。)

def make_make_feature(i, j, k, w):

    def make_feature(imagemat):
        # do whatever make_feature does
        # using imagemat, i, j, k, and w

    return make_feature

我们这里有一个函数make_make_feature(),它接受​​四个参数,并返回一个函数(make_feature()),该函数接受一个参数,并且可以使用传递给它的变量。 "壶"功能。 imgmat必须在稍后调用时传递给构造函数,但它已经知道其他四个值。

现在我们有了定义函数的嵌套循环。我们将它们存储在字典中;密钥将是四个参数的元组。

make_feature_funcs = {}

for i in range(1, 64):
    for j in range (1, 64):
        for h in range(1, 65 - i):
            for w in range(1, (65 - j) / 2):
                 make_feature_funcs[i, j, k, w] = make_make_feature(i, j, k, w)

现在我们有了字典make_feature_funcs。因此,make_feature_funcs[1, 2, 3, 4]是为变量i,j,k和w烘焙了值1,2,3和4的函数。然后我们可以调用该函数并传入imgmat

 make_feature_funcs[1, 2, 3, 4](imgmat)

正如您所看到的,这并不比直接调用make_feature()并传入您想要的变量更清楚。

一个(次要)优势是你只能使用i,j,k和w的预定义值,但你也可以只添加代码到函数来验证值,如果这是你的目标。这就是为什么我说这样做几乎没有意义。

答案 1 :(得分:1)

不是创建不同的函数,而是创建一个类,只需实例化该类并每次调用该函数。或者,您可以使init函数接受参数。

class foo():
  def make_features(self,h,i,j,k,w):
    blah


   k=0    
for i in range(1,64):
    for j in range (1,64):
        for h in range(1,65-i):
            for w in range(1,(65-j)/2):
               k = k+1
               item = foo()
               item.make_features(h,i,j,k,w)

答案 2 :(得分:1)

通常,最好使用字典而不是动态创建变量名(包括函数名)。您最终会遇到类似的行为,您可以根据名称的动态部分执行查找,但使用字典而不是当前范围被认为更清晰。

这可能是这样的:

make_feature = {}
k=0    
for i in range(1,64):
    for j in range (1,64):
        for h in range(1,65-i):
            for w in range(1,(65-j)/2):
               k = k+1
               def func(imgmat, i=i, j=j, h=h, w=w):
                   # do something
                   pass
               func.__name__ = 'make_feature' + str(k)
               make_feature[k] = func

在此之后,您可以调用类似make_feature[1](...)的函数,如果您使用当前的方法,它将与make_feature1(...)所做的基本相同。

请注意,我还使用函数定义中的默认值将这些变量的当前值绑定到您创建的每个函数,因为看起来这可能是您想要做的。

虽然我真的想知道你是否真的有必要在循环中创建这些多个函数,但是你的问题没有足够的信息来说明你实际上在做什么来提出替代方案。

答案 3 :(得分:1)

您可以分别为h,i,j,k和w的所有值调用make_feature。例如,这看起来像....

def make_feature(imgmat, i, j, h, w): 
    #Compute Sum of Pixels in [i,i+h-1] x [j,j+w-1]
    S1=imgmat

    #Compute Sum of Pixels in [i,i+h-1] x [j,j+w-1]
    S2= something

    #Record this feature parameterized by (1,i,j,w,h) 
    return(S1 - S2)

for i in range(1,64):
    for j in range (1,64):
        for h in range(1,65-i):
            for w in range(1,(65-j)/2):
                make_feature(imgmat, i, j, h, w)