如何在clojure中的每一行打印数字列表?

Posted

技术标签:

【中文标题】如何在clojure中的每一行打印数字列表?【英文标题】:How do I print a list of numbers on each line in clojure? 【发布时间】:2011-09-25 03:06:13 【问题描述】:

如何在 10 行上打印一个包含 n 个(例如 10 个)数字的列表?我刚刚了解了循环和递归,但似乎无法将副作用 (println i)(recur (+ i 1)) 以循环形式结合起来。 非常清楚:我想要这样的输出:

1
2
3
4
5
6
7
8
9
10

当 n 为 10 时。

【问题讨论】:

【参考方案1】:

您可以为此使用doseq,这意味着在迭代涉及副作用时使用,

(doseq [i (range 10)]
   (println i))

你可以使用 map 指出,但这会产生一个充满 nil 的序列,这既不惯用又浪费资源,doseq 也不是懒惰的,所以不需要用 doall 强制它。

【讨论】:

这会打印数字 0 到 9;在 println 中使用 (inc i),如下面的其他答案所示,给出 1 到 10。 而不是 inc 只是做(范围 1 11)【参考方案2】:

对于这种简单的循环,我建议 dotimes

(dotimes [i 10]
  (println (inc i)))

请注意,dotimes 是非惰性的,因此它适用于像 println 这样会导致副作用的东西。

【讨论】:

【参考方案3】:

带循环/递归:

(loop [i 1]
  (when (<= i 10)
    (println i)
    (recur (inc i))))

但是,map 函数 println 比 1..10 中的数字更惯用(阅读:更多“Clojuristic”)。但是因为map返回的是惰性序列,所以必须force its evaluation with doall:

(doall (map println (range 1 (inc 10))))

【讨论】:

事实上,在这种情况下使用doseq(或dotimes)更为惯用,因为这都是关于副作用的。 map 只有在您对返回值感兴趣时才应使用。否则你很容易被懒惰抓住。 那就是 (dotimes [i 10] (println i)) 谢谢!会记得当我读到“实用 Clojure”的第 14 章时(现在完成第 3 章):-)【参考方案4】:

为了全面起见,您也可以使用地图:

(doseq (map #(println %) (range 10))

【讨论】:

【参考方案5】:

如果您只想在屏幕上打印输出,您也可以在输入条件之前简单地输入(println i)

(loop [i 0]
  (println i)
  (if (< i 10)
    (recur (inc i))
    (println "done!")))

每行输出一个数字。

【讨论】:

以上是关于如何在clojure中的每一行打印数字列表?的主要内容,如果未能解决你的问题,请参考以下文章

在一行上组合并打印不同的变量

Clojure - 如何返回序列?

如何将 csv 文件读入 SWI prolog 中的列表列表,其中内部列表代表 CSV 的每一行?

如何将 DataFrame 中的每一行/单元格值转换为 pandas 中的字典列表?

如何使网格列表中的每一行具有相同数量的项目(使用 Flexbox)? [复制]

如何让 Perl 和 Python 打印正在执行的程序的每一行?