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则不打印).构建并返回列表也有点烦人.我宁愿只是为了循环.
更新这里还有另一个库/选项:我改编自 a并可在以下位置gist使用:pipyinfixpy
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)\nRun Code Online (Sandbox Code Playgroud)\npip3 install infixpy
年长的
\n我现在正在寻找一个更接近问题核心的答案:
\nfluentpy https://pypi.org/project/ Fluentpy / :
streams以下是程序员(在scala、 、其他人中)会欣赏的集合方法链接类型java:
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)\nRun Code Online (Sandbox Code Playgroud)\n而且效果很好:
\nResult[0]=20,Result[1]=40,Result[2]=60,Result[3]=80\nRun Code Online (Sandbox Code Playgroud)\n我现在正在尝试这个。如果它如上所示正常工作,那么今天将是非常美好的一天。
\n更新:看看这个:也许python可以开始更合理地作为一行 shell 脚本:
python3 -m fluentpy "lib.sys.stdin.readlines().map(str.lower).map(print)"\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n有一个额外的newline东西应该清理 - 但它的要点是有用的(无论如何对我来说)。
生成器、迭代器,并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)