【问题标题】:for loop with print in functional programming style python [closed]函数式编程风格python中带有打印的for循环[关闭]
【发布时间】:2017-07-08 07:18:56
【问题描述】:

如何将 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 for-loop functional-programming


【解决方案1】:

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

def printFrom(col):
    i = iter(col)
    while True:
        try:
            print(next(i))
        except StopIteration:
            break

作为函数式,你可以使用recursion:

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)))))

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

【讨论】:

  • 此外,在 python 3 中,map 返回一个惰性迭代器。因此,在您实际循环生成的map 之前,不会评估打印函数。这可以使用str.join(map(...))list(map(...)) 来完成。
  • @HåkenLid,你不应该在 list(map(...)) 中调用 print whithing map,你最终会建立一个完全有用的列表。
  • 是的,但是 OP 询问为什么代码没有产生任何结果。为什么没有任何东西打印到标准输出可能并不明显。原因是map 是懒惰的。我并不是说映射具有副作用的函数是一个好习惯。
  • @HåkenLid 是的,绝对是,这就是为什么我只是指出用列表来消费地图不是一个好主意,我不是说其他​​信息没有错,抱歉,如果我没有解释我自己。
猜你喜欢
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多