我正在尝试在循环内创建函数并将它们存储在字典中.问题是字典中的所有条目似乎最终都映射到最后创建的函数.代码如下:
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)
知道为什么吗?
如果我制作两个函数列表:
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)
为什么名单a和b不相等?
例如:
>>> a[2]()
2
>>> b[2]()
9
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)
没有解决问题.
考虑这个例子
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) 我想做以下事情:
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).
(据我所知,除了解决后期绑定问题之外,这还会促进更好地使用内存,因为如果函数"关闭"外部作用域中的某些变量,那么外部作用域不能被垃圾收集因为功能就在附近.对吗?)
我找不到任何方法来获取嵌套在其他函数中的函数.目前,我能想到的最好的方法是使用解析器,这看起来很多工作.
这个功能有什么问题?这似乎是一个范围错误(虽然我认为我通过将每个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
python ×6
lambda ×2
closures ×1
composition ×1
function ×1
recursion ×1
reference ×1
reflection ×1
scope ×1