函数式编程风格python中带打印的for循环

函数式编程风格python中带打印的for循环,python,for-loop,functional-programming,Python,For Loop,Functional Programming,如何将Python中的以下程序更改为函数式 from itertools import permutations for p in permutations(range(1, int(input()) + 1)): print(*p, sep='') 我知道地图,但是 map(lambda p: print(*p, sep=''), permutations(range(1, int(input()) + 1))) 不产生预期的输出 我想知道是否可以在不“重新定义”for循环的情况下

如何将Python中的以下程序更改为函数式

from itertools import permutations
for p in permutations(range(1, int(input()) + 1)):
    print(*p, sep='')
我知道地图,但是

map(lambda p: print(*p, sep=''), permutations(range(1, int(input()) + 1)))
不产生预期的输出


我想知道是否可以在不“重新定义”for循环的情况下执行此操作。

map
不应用于副作用功能。
print
函数返回
None
,因此您正在构建一个列表(或python3中的生成器),其中包含的None与您正在迭代的集合中的项一样多,完全无用。 您可以使用
while
循环:

def printFrom(col):
    i = iter(col)
    while True:
        try:
            print(next(i))
        except StopIteration:
            break
作为函数样式,您可以使用递归:

def printFrom(col):
    it = iter(col)
    def printit(i):
        try:
            print(next(i))
            printit(i)
        except StopIteration:
            return
    printit(it)
或者仅仅是这样:

print(" ".join(map(lambda x: " ".join(map(str, x)),permutations(range(1, 10)))))

最后一种解决方案的思想是,在打印之前,只需调用一次即可构建实际的最终字符串。

map
不应用于副作用函数。
print
函数返回
None
,因此您正在构建一个列表(或python3中的生成器),其中包含的None与您正在迭代的集合中的项一样多,完全无用。 您可以使用
while
循环:

def printFrom(col):
    i = iter(col)
    while True:
        try:
            print(next(i))
        except StopIteration:
            break
作为函数样式,您可以使用递归:

def printFrom(col):
    it = iter(col)
    def printit(i):
        try:
            print(next(i))
            printit(i)
        except StopIteration:
            return
    printit(it)
或者仅仅是这样:

print(" ".join(map(lambda x: " ".join(map(str, x)),permutations(range(1, 10)))))

最后一种解决方案的思想是,在打印字符串之前,只需一次调用即可构建实际的最终字符串。

这样做有什么好处?(还有其他答案)这是我的一门课程中的一个练习,因为这是不允许的,你从中得到了什么好处?(还有其他答案)这是我的一门课程中的一个练习,对于它是不允许的。此外,在Python3中,
map
返回一个惰性迭代器。因此,在实际循环生成的
map
之前,不会计算打印函数。这可以通过使用
str.join(map(…)
list(map(…)
@HåkenLid来实现,你不应该在
list(map(…)
中调用
print
whithing
map
,你将最终建立一个完全可用的LSS列表。是的,但OP会询问代码为什么没有产生任何结果。可能不太清楚为什么没有打印到标准输出。原因是
map
是懒惰的。我并不是说映射有副作用的函数是一种好的做法。@HåkenLid是的,绝对的,这就是为什么我刚才指出使用列表来映射不是一个好主意,我并不是说另一条消息没有错,如果我没有正确解释我自己,很抱歉。此外,在python 3中,
map
返回惰性迭代器。因此,在实际循环生成的
map
之前,不会计算打印函数。这可以通过使用
str.join(map(…)
list(map(…)
@HåkenLid来实现,你不应该在
list(map(…)
中调用
print
whithing
map
,你将最终建立一个完全可用的LSS列表。是的,但OP会询问代码为什么没有产生任何结果。可能不太清楚为什么没有打印到标准输出。原因是
map
是懒惰的。我并不是说映射有副作用的函数是一种好的做法。@HåkenLid是的,绝对的,这就是为什么我刚才指出使用列表来映射不是一个好主意,我并不是说另一条消息没有错,如果我没有正确解释我自己,对不起。