相关疑难解决方法(0)

在循环内创建lambda

可能重复:
(lambda)函数闭包在Python中捕获了什么?
lambda函数不关闭Python中的参数?

我试图在循环中创建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)

我得到了相同的价值.这是最后的价值objobj_list,因为那是在列表迭代器的块中的最后一个变量.任何想法都能很好地(pythonic)重写代码以使其工作?

python

28
推荐指数
3
解决办法
1万
查看次数

Python lambda闭包范围

我试图使用闭包来消除函数签名中的变量(应用程序将编写连接接口的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)

python lambda closures

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

tkinter在for循环传递命令参数中创建按钮

我试图在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值以坚持使用该特定按钮?

python tkinter button

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

lambda函数访问外部变量

我想玩匿名函数,所以我决定做一个简单的寻找者.这里是:

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)

然而,我发现了什么,就是ilambda x:x%i==0每次访问,而我希望它是一个字面上的数字.我怎么能让它变成lambda x:x%3==0呢?

python scope

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

地图与列表; 为何不同的行为?

在为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)

python functional-programming python-3.x

13
推荐指数
2
解决办法
476
查看次数

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

我想编写一个返回函数列表的函数.作为一个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
查看次数

为什么map()和列表理解的结果不同?

以下测试失败:

#!/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

11
推荐指数
2
解决办法
2264
查看次数

什么是Python中的"lambda绑定"?

我理解Python中的lambda函数是什么,但是通过搜索Python文档我找不到"lambda binding"的含义.阅读它的链接会很棒.一个简单的解释例子会更好.谢谢.

python lambda binding

11
推荐指数
2
解决办法
4815
查看次数

lambda函数不关闭Python中的参数?

代码说明更多:


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 lambda

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

在Python中创建一个简单的主筛

我使用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

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