我正在使用Python 3.我正在尝试编写lambda function/expression
并生成字符串类型输出。我不确定在这个问题上我不理解。
Cel = [39.5, 36.5, 37.3, 37.8]
Fer = lambda x: (float(9)/5*x for x in Cel + 32)
print(Fer)
打印:
<function <lambda> at 0x7fafc369eea0>
但是,我希望值列表为:
[103.1, 97.70, 99.14, 100.03]
然后我尝试用lambda映射
Fer2 = map(lambda x: (float(9)/5)*x + 32, Cel)
print(Fer2) # prints:
<map object at 0x7fafc36b5b38> # still no success
for x in Fer:
print(x) # this doesn't work and gives following error
TypeError: 'function' object is not iterable
for x in Fer2:
print(x) # but this works and prints
103.10
97.7
99.14
100.039
为什么我不能将print(Fer or Fer2)
简单地作为值列表,例如:
[103.1,97.70,99.14,100.03]
如何在lambda中解决这个问题,而不另外编写def function
?
答案 0 :(得分:6)
不完全确定为什么你需要lambda这是一个简单的列表理解
Fer = list(map(lambda x: (float(9)/5*x + 32),Cel))
或者如果你想使用lambda,你将不得不使用map
list
由于您正在迭代Fer,因此可以省略Fer = map(lambda x: (float(9)/5*x + 32),Cel)
Fer
您当前的尝试基本上是尝试混合地图和列表推导。为了进一步说明,你在下一行代码中所做的是创建一个lambda函数并将其分配给一个名为Fer = lambda x: (float(9)/5*x for x in Cel + 32)
的变量,这不是你想要的。
{{1}}
答案 1 :(得分:3)
你的问题与lambda
无关,如果你使用的函数会遇到同样的问题 - map
会返回一个对象,这是一个
iterable ,即。它可以转换为值列表,但不是值列表。要打印此类列表,您必须明确要求创建它:
print(list(map(lambda x: (float(9)/5)*x + 32, Cel)))
答案 2 :(得分:1)
我个人更喜欢使用带有定义函数的map而不是lambda
def func(e):
return float(((9/5)*e)+32)
此外,如果你想在Python 3中使用map()创建一个列表或元组,你必须放入列表(或元组(在map()之前
Cel = [39.5, 36.5, 37.3, 37.8]
Fer = list(map(func,Cel))
print (Fer)
此外,在这种情况下,列表理解似乎更快(可能是因为Cel很短,超长列表和许多函数调用地图会稍微快一点):
import time
Cel = [39.5, 36.5, 37.3, 37.8]
def func(e):
return float(((9/5)*e)+32)
st = time.time()
for i in range(1000000):
Fer = [32+float(9)/5*x for x in Cel]
end = time.time()
print ('COMP TIME: '+str(end-st))
st = time.time()
for i in range(1000000):
Fer = list(map(func,Cel))
end = time.time()
print ('MAP TIME: '+str(end-st))
结果:
COMP TIME: 1.8918001651763916
MAP TIME: 2.031294584274292
答案 3 :(得分:0)
所以我们在这里:P 这甚至可以工作:)
print((lambda x, y: (x + y,x * y))(5, 3))