Python流畅的过滤器,地图等

Thi*_*obo 5 python functional-programming fluent

我喜欢python.然而,有一点让我感到困惑的是,我不知道如何以流畅的方式格式化功能活动,如javascript中的can.

示例(当场随机创建):你能帮助我以流畅的方式将其转换为python吗?

var even_set = [1,2,3,4,5]
.filter(function(x){return x%2 === 0;})
.map(function(x){
    console.log(x); // prints it for fun
    return x;
})
.reduce(function(num_set, val) {
    num_set[val] = true;
}, {});
Run Code Online (Sandbox Code Playgroud)

我想知道是否有流体选择?也许是图书馆.

一般来说,我一直在使用列表推理来处理大多数事情,但如果我想要打印,这是一个真正的问题

例如,我如何使用列表理解(Python 3 print()作为函数打印python 2.x中的1到5之间的每个偶数,但Python 2则不打印).构建并返回列表也有点烦人.我宁愿只是为了循环.

jav*_*dba 7

更新这里还有另一个库/选项:我改编自 a并可在以下位置gist使用:pipyinfixpy

\n
from infixpy import *\na = (Seq(range(1,51))\n     .map(lambda x: x * 4)\n     .filter(lambda x: x <= 170)\n     .filter(lambda x: len(str(x)) == 2)\n     .filter( lambda x: x % 20 ==0)\n     .enumerate()                                            \xc3\x8f\n     .map(lambda x: \'Result[%d]=%s\' %(x[0],x[1]))\n     .mkstring(\' .. \'))\nprint(a)\n
Run Code Online (Sandbox Code Playgroud)\n

pip3 install infixpy

\n

年长的

\n

我现在正在寻找一个更接近问题核心的答案:

\n

fluentpy https://pypi.org/project/ Fluentpy / :

\n

streams以下是程序员(在scala、 、其他人中)会欣赏的集合方法链接类型java

\n
from infixpy import *\na = (Seq(range(1,51))\n     .map(lambda x: x * 4)\n     .filter(lambda x: x <= 170)\n     .filter(lambda x: len(str(x)) == 2)\n     .filter( lambda x: x % 20 ==0)\n     .enumerate()                                            \xc3\x8f\n     .map(lambda x: \'Result[%d]=%s\' %(x[0],x[1]))\n     .mkstring(\' .. \'))\nprint(a)\n
Run Code Online (Sandbox Code Playgroud)\n

而且效果很好:

\n
Result[0]=20,Result[1]=40,Result[2]=60,Result[3]=80\n
Run Code Online (Sandbox Code Playgroud)\n

我现在正在尝试这个。如果它如上所示正常工作,那么今天将是非常美好的一天。

\n

更新:看看这个:也许python可以开始更合理地作为一行 shell 脚本:

\n
python3 -m fluentpy "lib.sys.stdin.readlines().map(str.lower).map(print)"\n
Run Code Online (Sandbox Code Playgroud)\n

这是它在命令行上的操作:

\n
$echo -e "Hello World line1\\nLine 2\\Line 3\\nGoodbye" \n         | python3 -m fluentpy "lib.sys.stdin.readlines().map(str.lower).map(print)"\n\nhello world line1\n\nline 2\n\nline 3\n\ngoodbye\n
Run Code Online (Sandbox Code Playgroud)\n

有一个额外的newline东西应该清理 - 但它的要点是有用的(无论如何对我来说)。

\n


hpa*_*ulj 2

生成器、迭代器,并itertools为链接和过滤操作提供附加功能。但我不会记住(或查找)很少使用的东西,而是倾向于辅助函数和理解。

例如,在本例中,使用辅助函数来处理日志记录:

def echo(x):
    print(x)
    return x
Run Code Online (Sandbox Code Playgroud)

if使用推导式子句可以轻松选择偶数值。由于最终输出是字典,因此请使用这种理解:

In [118]: d={echo(x):True for x in s if x%2==0}
2
4

In [119]: d
Out[119]: {2: True, 4: True}
Run Code Online (Sandbox Code Playgroud)

或者要将这些值添加到现有字典中,请使用update.

new_set.update({echo(x):True for x in s if x%2==0})
Run Code Online (Sandbox Code Playgroud)

另一种写法是使用中间生成器:

{y:True for y in (echo(x) for x in s if x%2==0)}
Run Code Online (Sandbox Code Playgroud)

或者将回声和滤波器组合在一台发生器中

def even(s):
    for x in s:
        if x%2==0:
            print(x)
            yield(x)
Run Code Online (Sandbox Code Playgroud)

接下来是使用它的 dict comp:

{y:True for y in even(s)}
Run Code Online (Sandbox Code Playgroud)