相关疑难解决方法(0)

词法闭包如何工作?

当我在调查Javascript代码中的词法闭包问题时,我在Python中遇到了这个问题:

flist = []

for i in xrange(3):
    def func(x): return x * i
    flist.append(func)

for f in flist:
    print f(2)
Run Code Online (Sandbox Code Playgroud)

请注意,此示例谨慎避免lambda.它打印"4 4 4",这是令人惊讶的.我期待"0 2 4".

这个等效的Perl代码是正确的:

my @flist = ();

foreach my $i (0 .. 2)
{
    push(@flist, sub {$i * $_[0]});
}

foreach my $f (@flist)
{
    print $f->(2), "\n";
}
Run Code Online (Sandbox Code Playgroud)

打印"0 2 4".

你能解释一下这个区别吗?


更新:

这个问题是不是i是全球性的.这显示相同的行为:

flist = []

def outer():
    for i in xrange(3):
        def inner(x): return x * i …
Run Code Online (Sandbox Code Playgroud)

python closures late-binding lazy-evaluation

144
推荐指数
5
解决办法
3万
查看次数

在循环中创建函数

我正在尝试在循环内创建函数并将它们存储在字典中.问题是字典中的所有条目似乎最终都映射到最后创建的函数.代码如下:

functions = []

for i in range(3):
    def f():
        return i

    # alternatively: f = lambda: i

    functions.append(f)
Run Code Online (Sandbox Code Playgroud)

这输出:

print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output:   [2, 2, 2]
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

python function

79
推荐指数
2
解决办法
3万
查看次数

如何返回使用变量值的函数?

我想编写一个返回函数列表的函数.作为一个MWE,这是我的函数尝试,它给出了三个函数,它们将0,1和2添加到输入数字:

def foo():
    result = []
    for i in range(3):
        temp = lambda x: x + i
        print(temp(42))  # prints 42, 43, 44
        result.append(temp)
    return result

for f in foo():
    print(f(42))  #prints 44, 44, 44
Run Code Online (Sandbox Code Playgroud)

与我的期望相反,每个函数最终使用i的最后一个值.当我将一个列表用作函数的参数但Python实际上使用指向列表的指针时,我经历过类似的行为,但这里是一个整数,所以我不明白这里发生了什么.我正在运行Python 3.5.

python python-3.x

13
推荐指数
1
解决办法
480
查看次数

Keras的全球重量衰减

有没有办法在Keras设置全球减重?

我知道使用正规化器(https://keras.io/regularizers/)的分层智能,但我找不到任何关于设置全局权重衰减的方法的信息.

python neural-network deep-learning keras

9
推荐指数
3
解决办法
6544
查看次数

Python:将函数作为参数传递来初始化对象的方法。Pythonic 与否?

我想知道是否有一种可接受的方法将函数作为参数传递给对象(即在init块中定义该对象的方法)。

更具体地说,如果函数依赖于对象参数,我们将如何做到这一点。

将函数传递给对象似乎足够Pythonic,函数就像其他东西一样是对象:

def foo(a,b):
    return a*b

class FooBar(object):
    def __init__(self, func):
        self.func = func

foobar = FooBar(foo)
foobar.func(5,6)

# 30
Run Code Online (Sandbox Code Playgroud)

这样就可以了,一旦引入对对象其他属性的依赖,问题就会出现。

def foo1(self, b):
    return self.a*b

class FooBar1(object):
    def __init__(self, func, a):
        self.a=a
        self.func=func

# Now, if you try the following:
foobar1 = FooBar1(foo1,4)
foobar1.func(3)
# You'll get the following error:
# TypeError: foo0() missing 1 required positional argument: 'b'
Run Code Online (Sandbox Code Playgroud)

这可能简单地违反了 python 中 OOP 的一些神圣原则,在这种情况下,我只需要做其他事情,但它似乎也可能被证明是有用的。

我想出了几种可能的方法来解决这个问题,我想知道哪种(如果有的话)被认为是最可接受的。

解决方案1

foobar1.func(foobar1,3)

# 12
# seems ugly
Run Code Online (Sandbox Code Playgroud)

解决方案2

class FooBar2(object):
    def __init__(self, …
Run Code Online (Sandbox Code Playgroud)

python oop

7
推荐指数
1
解决办法
6689
查看次数

python 中 lambda 的一个奇怪用法

我遇到的部分代码如下,其中workers是类对象的列表:

worker_threads = []
for worker in workers:
    worker_fn = lambda worker=worker: worker.run(sess, coord, FLAGS.t_max)
    t = threading.Thread(target=worker_fn)
    t.start()
    worker_threads.append(t)
Run Code Online (Sandbox Code Playgroud)

通常我期望lambdais的语法lambda x : func(x),但在这里worker=worker用于什么?

python lambda

2
推荐指数
1
解决办法
63
查看次数

在 Python 中,为什么列表推导式中的 lambda 回想起来会覆盖自己?

考虑以下代码:

def f (a):
    return 1
def g (a):
    return 2

[lambda a: i(a) for i in (f,g)][0](0)
Run Code Online (Sandbox Code Playgroud)

结果是 2。它显然应该是 1!我希望这段代码执行如下。创建一个列表。将函数 f 复制到第一个索引中。将 g 复制到第二个索引中。鳍。

为什么会这样执行?!

python lambda list-comprehension function list

1
推荐指数
1
解决办法
613
查看次数