Python - 在for循环

时间:2017-12-01 22:55:30

标签: python list for-loop overwrite dynamic-function

我正在尝试创建一个函数列表。例如,如果我有一个接受两个参数f(x,y)的函数,我想创建一个函数列表f(x),如[f(x,0),f(x,1),f(x) ,2),f(x,3)]。

这是一个人为的例子:给定f(x,i)= x ** i。制作一个列表[f(x,0),f(x,1),f(x,2),f(x,3)],其中列表中的函数只接受一个参数。因此,如果列表命名为' a',则可以将函数称为

a[index](x)

以下是我尝试编码此问题的方法。

n = 4

def func_creator_1(n):
    func_list = list()
    for i in range(n):
        def func(x):
            return x ** i
        func_list.append(func)
    return func_list

f_list_1 = func_creator_1(n)


def func_creator_2(i):
    def func(x):
        return x ** i
    return func

f_list_2 = [func_creator_2(i) for i in range(n)]


def func_creator_3(n):
    def func_outer(i):
        def func(x):
            return x ** i
        return func
    func_list = [func_outer(i) for i in range(n)]
    return func_list

f_list_3 = func_creator_3(n)


def func_creator_4(n):
    def func_x_i(x,i):
        return x ** i
    return [lambda x: func_x_i(x,i) for i in range(n)]

f_list_4 = func_creator_4(n)


def func_creator_5(n):
    return [lambda x: x**i for i in list(range(n))]

f_list_5 = func_creator_5(n)

接下来我将变量x分配给2并打印输出。 n已经分配给4,因此它可以被方法2下面的列表推导使用。

x = 2

print('function\tmethod 1\tmethod 2\tmethod 3\tmethod 4\tmethod 5')
print('-'*90)

for c, f_tuple in enumerate(zip(f_list_1, f_list_2, f_list_3, f_list_4, f_list_5)):
    f1, f2, f3, f4, f5 = f_tuple

    print('{}^{}:\t\t{}\t\t{}\t\t{}\t\t{}\t\t{}\n'.format(
          x, c, f1(x), f2(x), f3(x), f4(x), f5(x)))

这是输出:

function    method 1    method 2    method 3    method 4    method 5  
2^0:        8       1       1       8       8

2^1:        8       2       2       8       8  

2^2:        8       4       4       8       8

2^3:        8       8       8       8       8

除了格式在控制台上看起来更好......

无论如何,在我看来,方法1是最具可读性的,并且代表我将如何编码,但它失败了。我是一个python初学者,但我的猜测是,当列表中的函数被创建时,变量' i'是某种指针,因此所有列表函数都引用相同的内存位置,在退出循环时,其值为3.

方法2成功,但我不喜欢在函数之后我必须有一个列表理解。如果我改变了n,我必须同时调用func_creator_2并重做列表理解。

方法3只是将方法2功能和列表理解步骤捆绑到一个功能中。它有效,并且只修复了我对方法2的抱怨,但它很难看。

方法4是另一种尝试......

在方法5中,我试图"复制"或者制作“我”。变量更永久。我会喜欢这个工作,因为它很简洁,但它也失败了。

所以,经过这一切,我有两个问题:
1.)为什么方法1,4和5失败?
2.)什么是最pythonic解决方案?

如果问题二是一个意见问题太多,我道歉。

谢谢!

0 个答案:

没有答案