相关疑难解决方法(0)

在循环中创建函数

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

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万
查看次数

使用python中的lambda表达式在循环内生成函数

如果我制作两个函数列表:

def makeFun(i):
    return lambda: i

a = [makeFun(i) for i in range(10)]
b = [lambda: i for i in range(10)]
Run Code Online (Sandbox Code Playgroud)

为什么名单ab不相等?

例如:

>>> a[2]()
2
>>> b[2]()
9
Run Code Online (Sandbox Code Playgroud)

python lambda scope

29
推荐指数
3
解决办法
8761
查看次数

在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
查看次数

在python参考思维拼图中的lambda

考虑这个例子

def dump(value):
    print value

items = []    
for i in range(0, 2):
    items.append(lambda: dump(i))

for item in items:
    item()
Run Code Online (Sandbox Code Playgroud)

输出:

1
1
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到:

0
1
Run Code Online (Sandbox Code Playgroud)

python lambda reference

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

使用自由变量警告每个(嵌套)函数(递归)

我想做以下事情:

for every nested function f anywhere in this_py_file:
    if has_free_variables(f):
        print warning
Run Code Online (Sandbox Code Playgroud)

为什么?主要是作为对其他地方描述的后期约束关闭的保险.即:

>>> def outer():
...     rr = []
...     for i in range(3):
...         def inner():
...             print i
...         rr.append(inner)
...     return rr
... 
>>> for f in outer(): f()
... 
2
2
2
>>> 
Run Code Online (Sandbox Code Playgroud)

每当我收到有关自由变量的警告时,我都会添加一个显式异常(在极少数情况下我会想要这种行为)或者像这样修复它:

...         def inner(i=i):

然后,行为变得更像Java中的嵌套类(其中任何要在内部类中使用的变量必须是final).

(据我所知,除了解决后期绑定问题之外,这还会促进更好地使用内存,因为如果函数"关闭"外部作用域中的某些变量,那么外部作用域不能被垃圾收集因为功能就在附近.对吗?)

我找不到任何方法来获取嵌套在其他函数中的函数.目前,我能想到的最好的方法是使用解析器,这看起来很多工作.

python reflection closures nested-function

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

Python函数组合(最大递归深度错误,范围?)

这个功能有什么问题?这似乎是一个范围错误(虽然我认为我通过将每个callable放在列表中而不是直接使用它来修复它).错误是达到最大递归深度(调用comp(inv,dbl,inc)时)...

注意:问题是:为什么它甚至会递归,而不是它达到最大深度的原因......

def comp(*funcs):
    if len(funcs) in (0,1):
        raise ValueError('need at least two functions to compose')
    # get most inner function
    composed = []
    print("appending func 1")
    composed.append(funcs[-1])
    # pop last and reverse
    funcs = funcs[:-1][::-1]
    i = 1
    for func in funcs:
        i += 1
        print("appending func %s" % i)
        composed.append(lambda *args, **kwargs: func(composed[-1](*args,**kwargs)))
    return composed[-1]

def inc(x):
    print("inc called with %s" % x)
    return x+1
def dbl(x):
    print("dbl called with %s" % x)
    return x*2
def inv(x):
    print("inv …
Run Code Online (Sandbox Code Playgroud)

python recursion functional-programming composition function-composition

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