Clojure中是否有类似于Python的any
和all
函数的内置函数?
例如,在Python中,all([True, 1, 'non-empty string']) == True
。
(every? f data)
[文档] 的作用与all(f(x) for x in data)
相同。
(some f data)
[文档] 类似于Python中的any(f(x) for x in data)
,但它会返回f(x)
的值(必须是真值),而不仅仅是true
。
如果您想要与 Python 完全相同的行为,可以使用 identity
函数,该函数将只返回其参数(等效于 (fn [x] x)
)。
user=> (every? identity [1, true, "non-empty string"])
true
user=> (some identity [1, true "non-empty string"])
1
user=> (some true? [1, true "non-empty string"])
true
and
和or
与Python的all
和any
非常相似,但(就像clojure.core/some
一样)它们返回满足条件的元素...因此您可以将其与boolean
一起使用来进行转换。(boolean (or "" nil false)) ; "" is truthy in clojure
; => true
(boolean (and [] "" {} () 0)) ; also [], {}, () and 0 are truthy
; => true
我使用boolean
代替true?
,因为后者只有当参数是true时才返回true...所以boolean
更类似于python中的bool
,它评估真值。
与some
和every?
不同,and
和or
是宏,所以如果你总是想将结果转换为布尔值,就不能简单地执行(def any (comp boolean or))
,而是必须定义一个宏,比如:
(defmacro any [& v] `(boolean (or ~@v)))
(defmacro all [& v] `(boolean (and ~@v)))
and
和 or
一样,它们是中缀二元运算符)。(any "" (/ 1 0))
; => true
(all nil (/ 1 0))
; => false
它们与Python的any
和all
非常相似,即使在没有参数的情况下调用也是如此。
(any)
; => false
(all)
; => true
在Python中:
>>> any([])
False
>>> all([])
True
any
/all
,您可以这样做:(defmacro all [v] `(boolean (and ~@v)))
(all [])
; => true
(all [nil (/ 1 0)])
; => false
(some true? data)
不是你从 Python 中期望的any
:(some true? [1 [true] "non-empty-string"])
会产生一个假值。 - berdario