我正在学习 Python 和 Java 中的函数式编程。
我有一些 Java 代码,可以从列表中找出双偶数之和。
我想在Python中使用函数式编程来做同样的事情(即从列表中找到双偶数的总和)。将filter()、map() 和sum() 一起使用并使代码变得可读有什么好的做法?
我用 Python 编写的内容(见下文)可以完成这项工作,但可读性不太好。
感谢您的帮助!
# JAVA
import java.util.Arrays;
import java.util.List;
public class GFG {
public static void main(String[] args)
{
List<Integer> numbers
= Arrays.asList(11, 22, 33, 44,
55, 66, 77, 88,
99, 100);
System.out.println(
numbers.stream()
.filter(number -> number % 2 == 0)
.mapToInt(e -> e * 2)
.sum());
}
}
// OUTPUT: 640
# PYTHON
class GFG:
@staticmethod
def main():
numbers = [11, 22, 33, 44, 55, 66, 77, 88, 99, 100]
print(sum(map(lambda x: x * 2, (filter(lambda x: x % 2 == 0, numbers)))))
GFG.main()
# OUTPUT: 640
Python 可读性较差的原因是
map
、filter
等在 Java 中是方法,而在 Python 中是函数。这意味着在 Java 中,您可以使用缩进使所有内容以流畅的方式从左到右阅读。
没有什么特别的原因不能在 Python 中创建自己的流:
class MyStream:
def __init__(iterator):
self.iterator = iterator
def map(func):
return MyStream(map(func, self.iterator))
def filter(func):
return MyStream(filter(func, self.iterator))
...
实际上没有人会在 Python 中执行此操作,因为列表理解和生成器表达式被认为更具可读性。
streamable
模块(很想得到反馈!):
你的例子看起来像:
from typing import List
from streamable import Stream
numbers: List[int] = [11, 22, 33, 44, 55, 66, 77, 88, 99, 100]
print(
sum(
Stream(lambda: numbers)
.filter(lambda number: number % 2 == 0)
.map(lambda e: e * 2)
)
)
640
Stream[T]
课程扩展Iterable[T]