以下测试失败:
#!/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
给出这段代码:
funcs = []
for x in range(3):
funcs.append(lambda: x)
print [f() for f in funcs]
Run Code Online (Sandbox Code Playgroud)
我希望它能够打印出来[0, 1, 2],而是打印出来[2, 2, 2].关于lambdas如何使用范围,我是否缺少一些基本的东西?
下面是我从某人关于python闭包的博客中得到的一个例子.我在python 2.7中运行它并获得与我的期望不同的输出.
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)
我的预期输出是:0,2,4
但是输出是:
4,4,4有没有人可以帮忙解释一下?
先感谢您.
在这段代码中:
results = []
for i in [1, 2, 3, 4]:
def inner(y):
return i
results.append(inner)
for i in results:
print i(None)
Run Code Online (Sandbox Code Playgroud)
输出是"函数内部在0x107dea668"
如果我改变我到其他盘符,例如:
results = []
for i in [1, 2, 3, 4]:
def inner(y):
return i
results.append(inner)
for j in results:
print j(None)
Run Code Online (Sandbox Code Playgroud)
输出为"4"
回答
results = []
for i in [1, 2, 3, 4]:
def inner(y):
print "in inner:%s " % id(i)
return i
results.append(inner)
# i -> 4
for i in results: …Run Code Online (Sandbox Code Playgroud) 我对这个范围行为感到困惑:
class Bar:
def __init__(self):
for fn in ["open","openW","remove","mkdir","exists","isdir","listdir"]:
print "register", fn
def func_wrapper(filename):
print "called func wrapper", fn, filename
setattr(self, fn, func_wrapper)
bar = Bar()
bar.open("a")
bar.remove("b")
bar.listdir("c")
Run Code Online (Sandbox Code Playgroud)
这给出了输出:
register open
register openW
register remove
register mkdir
register exists
register isdir
register listdir
called func wrapper listdir a
called func wrapper listdir b
called func wrapper listdir c
Run Code Online (Sandbox Code Playgroud)
但我原以为这func_wrapper将永远是正确的功能.我知道范围func_wrapper是整个函数,但我在每次循环迭代中重新定义它,最后一个实例在attrib中保存.我也尝试在func_wrapper = None下面添加,setattr但这没有帮助(也会让我感到奇怪......).
我瞎了吗?我甚至不知道如何解决/解决这个问题.
可能重复:
使用lambda表达式中的变量值
我正在使用python并尝试隔离我使用lambda函数的问题.
从下面的代码我期望创建两个lambda函数,每个函数得到一个不同的x,输出应该是
1 2
但输出是2 2
为什么?我怎样才能创造两种不同的功能?使用def?
def main():
d = {}
for x in [1,2]:
d[x] = lambda : print(x)
d[1]()
d[2]()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud) 任何人都可以做健全性检查吗?
我正在尝试在 for 循环中创建函数。我无法理解的一点总结在以下代码中:
f_list = []
for i in range(10):
f = lambda j : i
f_list.append(f)
Run Code Online (Sandbox Code Playgroud)
然后,
>>> f_list[0](0)
9 #I hope this is 0.
>>> f_list[1](0)
9 #I hope this is 1.
Run Code Online (Sandbox Code Playgroud)
为什么会这样??
我有一个关于在访问Spark RDD时在闭包中使用局部变量的问题.我想解决的问题如下:
我有一个应该读入RDD的文本文件列表.但是,首先我需要向从单个文本文件创建的RDD添加其他信息.从文件名中提取此附加信息.然后,使用union()将RDD放入一个大的RDD中.
from pyspark import SparkConf, SparkContext
spark_conf = SparkConf().setAppName("SparkTest")
spark_context = SparkContext(conf=spark_conf)
list_of_filenames = ['file_from_Ernie.txt', 'file_from_Bert.txt']
rdd_list = []
for filename in list_of_filenames:
tmp_rdd = spark_context.textFile(filename)
# extract_file_info('file_from_Owner.txt') == 'Owner'
file_owner = extract_file_info(filename)
tmp_rdd = tmp_rdd.map(lambda x : (x, file_owner))
rdd_list.append(tmp_rdd)
overall_content_rdd = spark_context.union(rdd_list)
# ...do something...
overall_content_rdd.collect()
# However, this does not work:
# The result is that always Bert will be the owner, i.e., never Ernie.
Run Code Online (Sandbox Code Playgroud)
问题是循环中的map()函数没有引用"正确的"file_owner.相反,它将引用file_owner的最新值.在我的本地机器上,我设法通过为每个RDD调用cache()函数来解决问题:
# ..
tmp_rdd = tmp_rdd.map(lambda x : (x, file_owner)) …Run Code Online (Sandbox Code Playgroud) 我有一个C++的背景,并试图学习一些python.
我理解C++的虚函数,遗憾的是我不明白python中后期绑定的含义是什么意思.
链接:https://gist.github.com/deemson/8efabf56d67623ead804
从教程复制面食:
functions = []
for n in [1, 2, 3]:
def func(x):
return n*x
functions.append(func)
# You would expect this to print [2, 4, 6]
print(
'calling a list of bad closures and output is: {}'
.format(str([function(2) for function in functions]))
)
Run Code Online (Sandbox Code Playgroud)
到底发生了什么?当函数附加到列表中时,它具有什么值?有人可以简化这段代码让我理解.
考虑以下想法:我想生成一系列函数f_k,k = 1,...,50并将它们存储在Python字典中.举一个具体的例子,让我们说
f_k(x) = f_{k-1}(x) * sqrt(x)
Run Code Online (Sandbox Code Playgroud)
这只是一个例子,我遇到的问题更复杂,但这对我的问题无关紧要.因为在我的实际问题f_{k-1}是非常嘈杂并且包含舍入误差,我不想f_k直接构建f_{k-1},而是我首先f_{k-1}通过样条近似近似,然后f_k从该样条逼近来确定.奇怪的是,这会导致错误消息表明超出了最大递归深度.以下是代码示例:
import numpy as np
from scipy.interpolate import interp1d
n = 50 # number of functions I want to create
args = np.linspace(1,4,20) # where to evaluate for spline approximation
fdict = dict() # dictionary that stores all the functions
fdict[0] = lambda x: x**2 # the first function
# generate function f_k as follows: First, take function …Run Code Online (Sandbox Code Playgroud) python ×9
closures ×3
lambda ×3
for-loop ×2
apache-spark ×1
append ×1
late-binding ×1
pyspark ×1
python-3.x ×1
rdd ×1
recursion ×1