Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 映射、lambda和append。。为什么';这不管用吗?_Python_Python 3.x - Fatal编程技术网

Python 映射、lambda和append。。为什么';这不管用吗?

Python 映射、lambda和append。。为什么';这不管用吗?,python,python-3.x,Python,Python 3.x,所以我试着这么做 a = [] map(lambda x: a.append(x),(i for i in range(1,5))) 我知道map需要一个函数,但为什么它不附加到列表中呢?或者append不是一个函数? 但是,将a打印到a的结果仍然是空的 现在一件有趣的事情是这是有效的 a = [] [a.append(i) for i in range(5)] print(a) 他们基本上不是在“说”同样的话吗 这就好像列表理解变成了某种混合的列表理解函数 那么为什么lambda和ma

所以我试着这么做

a = []
map(lambda x: a.append(x),(i for i in range(1,5))) 
我知道map需要一个函数,但为什么它不附加到列表中呢?或者append不是一个函数? 但是,将
a
打印到
a
的结果仍然是空的

现在一件有趣的事情是这是有效的

a = []

[a.append(i) for i in range(5)]
print(a)
他们基本上不是在“说”同样的话吗

这就好像列表理解变成了某种混合的列表理解函数

那么为什么lambda和map方法不起作用呢?

append()
返回
None
,所以将其与
map
函数结合使用是没有意义的。一个简单的
for
循环就足够了:

a = []
for i in range(5):
    a.append(i)
print a
或者,如果您想使用列表理解/映射功能

a = range(5) # Python 2.x
a = list(range(5)) # Python 3.x
a = [i for i in range(5)]
a = map(lambda i: i, range(5)) # Python 2.x
a = list(map(lambda i: i, range(5))) # Python 3.x

上面的代码也进行了追加,但是它也创建了一个
None
值列表,作为
range(5)
的大小,这完全是浪费内存

>>> a = []
>>> b = [a.append(i) for i in range(5)]
>>> print a
[0, 1, 2, 3, 4]
>>> print b
[None, None, None, None, None]

我假设您使用的是Python3.x,使用map()的代码不起作用的实际原因是,在Python3.x中,map()返回一个生成器对象,除非迭代map()返回的生成器对象,否则不会调用lambda函数。尝试做列表(映射(…),你会看到一个正在填充的列表

也就是说,你所做的没有多大意义,你可以使用-

a = list(range(5))

函数map和filter具有一个函数引用作为第一个参数,该函数引用作为第二个参数为序列中的每个元素(列表、元组等)调用,该调用的结果用于创建结果列表

函数reduce有一个函数引用作为第一个参数,该函数引用在作为第二个参数提供的序列中为前2个元素调用,结果在另一次调用中与第三个元素一起使用,然后结果与第四个元素一起使用,依此类推。最终只会产生一个值

>>> map(lambda e: e+10, [i for i in range(5)])
[10, 11, 12, 13, 14]
>>> filter(lambda e: e%2, [i for i in range(5)])
[1, 3]
>>> reduce(lambda e1, e2: e1+e2, [i for i in range(5)])
10
说明:

  • 映射示例:向列表[0,1,2,3,4]的每个元素添加10
  • 过滤器示例:仅保留列表[0,1,2,3,4]中奇数的元素
  • 减少示例:添加列表[0,1,2,3,4]的前两个元素,然后添加结果和列表的第三个元素,然后添加结果和第四个元素,依此类推

映射不起作用,因为
append()
方法返回
None
而不是列表:

>>> a = []
>>> type(a.append(1))
<class 'NoneType'>

你到底在干什么?我运行了第一个示例,它填充了列表a。它还返回另一个带有空值的列表,这很有意义。@MK.你确定什么?我在空闲状态下工作,列表
a
为空。你做了什么?这里实际上不需要lambda
a.append
已经是一个函数,可以调用它将
x
添加到
a
中。a被填充-作为副作用,这通常是个坏主意。列表理解的结果是list of None-因为list.append返回None或只是a.extend(range(5))@ozgur是的,但是这一个非常简单。不是我想要一个填充的列表,而是为什么不填充。使用lambda。因为map接受一个iterable和一个函数,并将所有这些iterable运行到一个函数,所以不应该填充list
a
?不管这样做是否有意义,都要采用这种方法not@volcano这不是关于扩大名单的问题,呵呵。我更困惑的是为什么它不起作用。当map接受一个函数和iterable并将所有iterable应用于该函数时。那么为什么不填充一个呢?@Zion,与Python 2.7不同,
map
range
函数在Python 3中返回一个生成器对象,因此您必须使用
list()
@ozgur强制对它们求值,我知道这是一个被诅咒的懒惰求值!哈哈,但是是的。我仍然在努力理解这些堆积如山的概念,因为我是一个彻头彻尾的傻瓜。但是,是的,谢谢你花时间回答我的问题,并对我进行教育。我真的很感激:给你。这就是我现在要找的,如果你把它列成一个清单就行了。是的,尽管如此。我试图测试我对lambdas的理解是没有任何意义的。这只是我想测试的概念。是的,就像其他人说的。这没有道理。但我想我现在对lambdas有了更多的了解。。谢谢你,你的过滤功能真的很酷。因为一开始我是这样的。它不应该返回所有的偶数值吗?但我记得过滤器返回的是
truthy
东西,所有等于零的数字
%
2都不会被包括在内,因为零是
假的
,所以这很简洁
>>> a = []
>>> type(a.append(1))
<class 'NoneType'>
>>> from functools import reduce
>>> reduce(lambda p, x: p+[x], (i for i in range(5)), [])
[0, 1, 2, 3, 4]