我试图在循环中创建lambdas迭代一个对象列表:
lambdas_list = []
for obj in obj_list:
lambdas_list.append(lambda : obj.some_var)
Run Code Online (Sandbox Code Playgroud)
现在,如果我遍历lambdas列表并像这样调用它们:
for f in lambdas_list:
print f()
Run Code Online (Sandbox Code Playgroud)
我得到了相同的价值.这是最后的价值obj在obj_list,因为那是在列表迭代器的块中的最后一个变量.任何想法都能很好地(pythonic)重写代码以使其工作?
我试图使用闭包来消除函数签名中的变量(应用程序将编写连接接口的Qt信号所需的所有函数,以控制大量参数到存储值的字典).
我不明白为什么使用lambda未包装在另一个函数中的情况会返回所有情况的姓氏.
names = ['a', 'b', 'c']
def test_fun(name, x):
print(name, x)
def gen_clousure(name):
return lambda x: test_fun(name, x)
funcs1 = [gen_clousure(n) for n in names]
funcs2 = [lambda x: test_fun(n, x) for n in names]
# this is what I want
In [88]: for f in funcs1:
....: f(1)
a 1
b 1
c 1
# I do not understand why I get this
In [89]: for f in funcs2:
....: f(1)
c 1
c 1
c …Run Code Online (Sandbox Code Playgroud) 我试图在for循环中创建tkinter中的按钮.并且每个循环都将i count值作为参数传递给命令值.因此,当从命令值调用函数时,我可以判断按下了哪个按钮并相应地执行操作.问题是,假设len为3,它将创建3个按钮,标题为"Game 1"到"Game 3",但是当按下任何按钮时,打印值总是2,即最后一次迭代.因此看起来按钮是作为单独的实体制作的,但命令参数中的i值似乎完全相同.这是代码:
def createGameURLs(self):
self.button = []
for i in range(3):
self.button.append(Button(self, text='Game '+str(i+1),command=lambda:self.open_this(i)))
self.button[i].grid(column=4, row=i+1, sticky=W)
def open_this(self, myNum):
print(myNum)
Run Code Online (Sandbox Code Playgroud)
有没有办法在每次迭代时获得当前的i值以坚持使用该特定按钮?
我想玩匿名函数,所以我决定做一个简单的寻找者.这里是:
tests = []
end = int(1e2)
i = 3
while i <= end:
a = map(lambda f:f(i),tests)
if True not in a:
tests.append(lambda x:x%i==0)
print i
print tests
print "Test: "+str(i)
print str(a)
i+=2
Run Code Online (Sandbox Code Playgroud)
然而,我发现了什么,就是i在lambda x:x%i==0每次访问,而我希望它是一个字面上的数字.我怎么能让它变成lambda x:x%3==0呢?
在为Bayes'Nets程序实现"变量消除"算法的过程中,我遇到了一个意外的错误,这是一系列对象的迭代映射转换的结果.
为简单起见,我将在这里使用类似的代码:
>>> nums = [1, 2, 3]
>>> for x in [4, 5, 6]:
... # Uses n if x is odd, uses (n + 10) if x is even
... nums = map(
... lambda n: n if x % 2 else n + 10,
... nums)
...
>>> list(nums)
[31, 32, 33]
Run Code Online (Sandbox Code Playgroud)
这绝对是错误的结果.由于[4,5,6]包含两个偶数,10因此每个元素最多应加两次.我在VE算法中也遇到了意想不到的行为,因此我修改它以在每次迭代后将迭代map器转换为a list.
>>> nums = [1, 2, 3]
>>> for x in [4, 5, 6]:
... # Uses n if …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.
以下测试失败:
#!/usr/bin/env python
def f(*args):
"""
>>> t = 1, -1
>>> f(*map(lambda i: lambda: i, t))
[1, -1]
>>> f(*(lambda: i for i in t)) # -> [-1, -1]
[1, -1]
>>> f(*[lambda: i for i in t]) # -> [-1, -1]
[1, -1]
"""
alist = [a() for a in args]
print(alist)
if __name__ == '__main__':
import doctest; doctest.testmod()
Run Code Online (Sandbox Code Playgroud)
换一种说法:
>>> t = 1, -1
>>> args = []
>>> for i in t:
... args.append(lambda: i)
... …Run Code Online (Sandbox Code Playgroud) python closures list-comprehension generator-expression late-binding
我理解Python中的lambda函数是什么,但是通过搜索Python文档我找不到"lambda binding"的含义.阅读它的链接会很棒.一个简单的解释例子会更好.谢谢.
代码说明更多:
from pprint import pprint
li = []
for i in range(5):
li.append(lambda : pprint(i))
for k in li:
k()
Run Code Online (Sandbox Code Playgroud)
让:
4 4 4 4 4
为什么不
0 1 2 3 4
??
谢谢.
PS如果我写完整的装饰器,它按预期工作:
from pprint import pprint
li = []
#for i in range(5):
#li.append(lambda : pprint(i))
def closure(i):
def _func():
pprint(i)
return _func
for i in range(5):
li.append(closure(i))
for k in li:
k()
Run Code Online (Sandbox Code Playgroud) 我使用Python编写了一个简单的主筛(Eratosthenes的无界筛子),但由于某种原因,它无法正常工作.这是筛子:
from itertools import count
def sieve():
nums = count(2)
while True:
n = next(nums)
nums = filter(lambda k: k%n != 0, nums)
yield n
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用.相反,它只返回与count(2)迭代器相同的值.
为了比较,这个:
nums = count(2)
print(next(nums))
nums = filter(lambda k: k%2 != 0, nums)
print(next(nums))
nums = filter(lambda k: k%2 != 0, nums)
print(next(nums))
Run Code Online (Sandbox Code Playgroud)
将打印:
2
3
5
Run Code Online (Sandbox Code Playgroud)
而筛选功能将打印:
2 3 4
我认为问题在于Python的lambda的奇怪行为,但是替换了这一行:
nums = filter(lambda k: k%n != 0, nums)
Run Code Online (Sandbox Code Playgroud)
有:
def f(k): return k%n != 0
nums = filter(f, nums)
Run Code Online (Sandbox Code Playgroud)
没有解决问题.
python ×10
lambda ×3
closures ×2
python-3.x ×2
binding ×1
button ×1
late-binding ×1
scope ×1
tkinter ×1