可爱的 Python : Python中的函数式编程,第三部分
admin
2023-07-31 00:47:56
0

英文原文:Charming Python: Functional programming in Python, Part 3,翻译:开源中国

摘要:  作者David Mertz在其文章《可爱的Python:“Python中的函数式编程”》中的第一部分和第二部分中触及了函数式编程的大量基本概念。本文中他将继续前面的讨论,解释函数式编程的其它功能,如currying和Xoltar Toolkit中的其它一些高阶函数。

表达式绑定

有一位从不满足于解决部分问题读者,名叫Richard Davies,提出了一个问题,问是否可以将所有的绑定全部都转移到一个单个的表达式之中。首先让我们简单看看,我们为什么想这么做,然后再看看由comp.lang.python中的一位朋友提供的一种异常优雅地写表达式的方式。

让我们回想一下功能模块的绑定类。使用该类的特性,我们可以确认在一个给定的范围块内,一个特定的名字仅仅代表了一个唯一的事物。
具有重新绑定向导的 Python 函数式编程(FP)

123456789101112 >>> from functional import *>>> let = Bindings()>>> let.car = lambda lst: lst[0]>>> let.car = lambda lst: lst[2]Traceback (innermost last):  File \”\”, line 1, in ?  File \”d:\\tools\\functional.py\”, line 976, in __setattr__ raise BindingError, \”Binding \’%s\’ cannot be modified.\” % namefunctional.BindingError:  Binding \’car\’ cannot be modified.>>> let.car(range(10))0

绑定类在一个模块或者一个功能定义范围内做这些我们希望的事情,但是没有办法在一条表达式内使之工作。然而在ML家族语言(译者注:ML是一种通用的函数式编程语言),在一条表达式内创建绑定是很自然的事。
Haskell 命名绑定表达式

12345678910111213 car (x:xs) = x   *could* create modulelevel bindinglist_of_list = [[1,2,3],[4,5,6],[7,8,9]]  \’where\’ clause for expressionlevel bindingfirsts1 = [car x | x < list_of_list] where car (x:xs) = x  \’let\’ clause for expressionlevel bindingfirsts2 = let car (x:xs) = x in [car x | x < list_of_list]  more idiomatic higherorder \’map\’ techniquefirsts3 = map car list_of_list where car (x:xs) = x  Result: firsts1 == firsts2 == firsts3 == [1,4,7]

Greg Ewing 发现用Python的list概念实现同样的效果是有可能的;甚至我们可以用几乎与Haskell语法一样干净的方式做到。
Python 2.0+ 命名绑定表达式

1234 >>> list_of_list = [[1,2,3],[4,5,6],[7,8,9]]>>> [car_x for x in list_of_list for car_x in (x[0],)][1, 4, 7]

在列表解析(list comprehension)中将表达式放入一个单项元素(a single-item tuple)中的这个小技巧,并不能为使用带有表达式级绑定的高阶函数提供任何思路。要使用这样的高阶函数,还是需要使用块级(block-level)绑定,就象以下所示:
Python中的使用块级绑定的’map()’

12345 >>> list_of_list = [[1,2,3],[4,5,6],[7,8,9]]>>> let = Bindings()>>> let.car = lambda l: l[0]>>> map(let.car,list_of_list)[1, 4, 7]

这样真不错,但如果我们想使用函数map(),那么其中的绑定范围可能会比我们想要的更宽一些。然而,我们可以做到的,哄骗列表解析让它替我们做名字绑定,即使其中的列表并不是我们最终想要得到的列表的情况下也没问题:
从Python的列表解析中“走下舞台”

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...