如前所述,您可以使用列表理解进行的所有操作都可以分解为高阶函数,但是在Python中这样做的一个很大一部分问题是Python缺乏对您可以与filter、map和Haskell中的friends一起使用的那种无点编程的支持。这里有一个有点做作的例子,但我想你会明白的。在
让我们看一下这个Python代码:
[(x,y) for x,y in zip(xrange(20), xrange(20, 0, -1)) if x % 2 == 0 and y % 2 == 0]
它所做的就是把这个打印出来:
[(0, 20), (2, 18), (4, 16), (6, 14), (8, 12), (10, 10), (12, 8), (14, 6), (16, 4), (18, 2)]
下面是过滤器的等效版本:
filter(lambda ns : ns[0] % 2 == 0 and ns[1] % 2 == 0, zip(xrange(20), xrange(20, 0, -1)))
我希望你能同意我的观点,那是更丑陋的。在不定义单独的函数的情况下,要使它变得不那么难看,实在做不到什么。在
但是让我们看看Haskell中的等效版本:[(x,y) | (x,y)
好吧,和Python列表理解版一样好。过滤器的等效版本是什么?在
^{pr2}$
好的,我们必须进行导入,但是一旦您理解了它的作用,代码(imo)就会清晰得多,尽管有些人可能仍然喜欢f被指向,或者甚至是带有过滤器的lambda。在我看来,无点版本更简洁,概念更清晰。但我想说的主要一点是,在Python中,这并不是很清楚,因为在不引入单独的库的情况下无法部分应用函数,并且缺少组合运算符,所以在Python中,最好选择列表理解而不是map/filter,但是在Haskell中,这两种方法都可以视具体问题而定。在