lambda 内的循环

53 投票
10 回答
273528 浏览
提问于 2025-04-18 07:44

我想尽量简化我的代码,最好只用一行代码。
我需要在一个lambda表达式里面放一个for循环,类似这样的:

x = lambda x: (for i in x : print i)

10 个回答

1

如果你和我一样,只想在一个lambda表达式里打印一串数字,而不想得到返回值(返回的是一堆None)。

x = range(3)
from __future__ import print_function           # if not python 3
pra = lambda seq=x: map(print,seq) and None     # pra for 'print all'
pra()
pra('abc')
2

anon和chepner的回答是朝着正确的方向走的。Python 3.x有一个打印功能,如果你想在一个函数里面使用打印(包括lambda函数),你就需要这个功能。

不过,在Python 2.x中,你可以很简单地通过从标准库的future模块导入来获得打印功能。你可以看看这个:

>>>from __future__ import print_function
>>>
>>>iterable = ["a","b","c"]
>>>map(print, iterable)
a
b
c
[None, None, None]
>>>

我想这看起来有点奇怪,所以如果你想要隐藏[None, None, None]的输出,可以把返回值赋给_(我猜你只对副作用感兴趣):

>>>_ = map(print, iterable)
a
b
c
>>>
20

为了补充chepner的回答,如果你使用的是Python 3.0,可以这样做:

x = lambda x: list(map(print, x))

当然,这个方法前提是你将来能使用Python 3以上的版本……我觉得这样写看起来更简洁,不过它的返回值有点奇怪,但你可能也不会用到这个返回值。

我就把这个放在这里,供你参考。

43

如果有人遇到类似的问题,这里有一些信息供参考...

这里大多数的解决方案都很简洁,只有一行代码,读起来也很容易。我想再补充一个方法,它不需要用到lambda(我假设你使用lambda只是为了让代码变成一行)。

相反,你可以使用简单的列表推导式。

[print(i) for i in x]

顺便提一下,返回的结果将是一个包含None的列表。

25

因为 for 循环是一种语句(在 Python 2.x 中,print 也是),所以你不能把它放在一个 lambda 表达式里。相反,你需要使用 sys.stdoutwrite 方法,并结合 join 方法来实现。

x = lambda x: sys.stdout.write("\n".join(x) + "\n")

撰写回答