当我在调查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) 我正在尝试在循环内创建函数并将它们存储在字典中.问题是字典中的所有条目似乎最终都映射到最后创建的函数.代码如下:
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)
知道为什么吗?
我想编写一个返回函数列表的函数.作为一个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.
有没有办法在Keras设置全球减重?
我知道使用正规化器(https://keras.io/regularizers/)的分层智能,但我找不到任何关于设置全局权重衰减的方法的信息.
我想知道是否有一种可接受的方法将函数作为参数传递给对象(即在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 的一些神圣原则,在这种情况下,我只需要做其他事情,但它似乎也可能被证明是有用的。
我想出了几种可能的方法来解决这个问题,我想知道哪种(如果有的话)被认为是最可接受的。
foobar1.func(foobar1,3)
# 12
# seems ugly
Run Code Online (Sandbox Code Playgroud)
class FooBar2(object):
def __init__(self, …Run Code Online (Sandbox Code Playgroud) 我遇到的部分代码如下,其中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用于什么?
考虑以下代码:
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 ×7
function ×2
lambda ×2
closures ×1
keras ×1
late-binding ×1
list ×1
oop ×1
python-3.x ×1