函数式编程的python风格

2024-10-02 14:29:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python没有太多的经验。我试着用我习惯用Java和JavaScript的函数式编写代码

var result = getHeroes('Jedi')
  .map(hero => { hero: hero, movies: getMovies(hero) })
  .filter(x => x.movies.contains('A New Hope'));

我试图在Python中做一些类似的事情,但是我不能得到相同的链接样式。我不得不把它分成两种说法,我不喜欢:

^{2}$

我有两个问题:

  1. Python中有没有一种方法可以接近第一种样式?在
  2. 在Python中执行此操作的惯用方法是什么?在

谢谢。在


Tags: 方法函数代码mapvar样式经验java
3条回答

作为一个热爱函数式编程的人,不要用Python编写函数式的代码。在

这个硬性的规则有点笨拙,当然也有一些方法可以使用一些典型的函数性工具来完成您所要做的事情,比如mapfilter,和{}(Python中称为functools.reduce),但是很可能您的函数代码看起来比sin更难看,在这种情况下,没有理由比命令性的东西更喜欢它而且很漂亮。在

result = []
for hero in get_heros("Jedi"):
    movies = get_movies(hero)
    for movie in movies:
        if "A New Hope" in movies:
            result.append((hero, movies))

这可以通过列表理解来完成,但可能可读性较差。在

^{pr2}$

生成器表达式是python方法,但是通过^{}^{}的组合,函数解决方案是可能的:

mapper = map(lambda x: (x, get_movies(x)), get_heroes('jedi'))
result = filter(lambda x: x[1].contains('A New Hope'), mapper)

在我看来,他们在python中以函数式的方式(实际上不是python),使用map和{}:

result = filter (
    lambda x: x[1].contains('A New Hope'),
    map(
        lambda x: (hero, get_movies(hero)),
        get_heroes('jedi')
    )
)

pythonic方法(不是很实用)是使用生成器表达式:

^{pr2}$

相关问题 更多 >