相关疑难解决方法(0)

为什么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 lambdas和范围

给出这段代码:

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 lambda

7
推荐指数
2
解决办法
436
查看次数

关于python闭包

下面是我从某人关于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有没有人可以帮忙解释一下?
先感谢您.

python closures

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

为什么不同的变量名会得到不同的结果(python2.7)?

在这段代码中:

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)

python for-loop

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

奇怪的Python函数范围行为

我对这个范围行为感到困惑:

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但这没有帮助(也会让我感到奇怪......).

我瞎了吗?我甚至不知道如何解决/解决这个问题.

python

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

Python lambda不记得for循环中的参数

可能重复:
使用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)

python lambda for-loop

6
推荐指数
3
解决办法
1434
查看次数

Python:将 lambda 函数附加到列表中

任何人都可以做健全性检查吗?

我正在尝试在 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)

为什么会这样??

python lambda append

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

访问Spark RDD时在闭包中使用局部变量

我有一个关于在访问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)

closures apache-spark rdd pyspark

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

后期绑定python闭包

我有一个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)

到底发生了什么?当函数附加到列表中时,它具有什么值?有人可以简化这段代码让我理解.

python

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

Python中的迭代函数生成

考虑以下想法:我想生成一系列函数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 recursion python-3.x

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