Archive for September 28th, 2007

函数式编程-考验人品

Friday, September 28th, 2007

函数式编程-考验人品

好友jorge(附加形容词:牛人,超牛,巨牛无比,变态,下流)推荐我学函数式编程语言scheme,以前倒是考虑过erlang,不过实在没空所以暂时没有动手。不过Python中对函数式编程倒是有支持,所以最近尝试了一下。

问题如下,一个字符串形式的IP地址,比如”12.24.0.9″,需要转换成32bit无符号整数形式表示的数字。这个其实可以用socket.inet_aton来实现,但是问题是,我拿到的这些IP地址都是这个形式”012.024.000.009″,来自珊瑚虫IP数据库的导出结果,而inet_aton会把这些一段段的以0开头的数字识别为八进制,所以,只能自己写转换函数。

最终呢,就是用函数式编程来解决了问题,实际代码只有一行。代码如下:

ipstr=”012.024.000.009″
numset=reduce(lambda x,y:x*256+y,map(lambda numlist:reduce(lambda x,y:x*10+y,numlist),map(lambda strlist:map(int,strlist),map(list,list(ipstr.split(‘.’,3))))))
from socket import inet_ntoa
import struct
print inet_ntoa(struct.pack(‘!L’,numset))

可以看出函数式编程的代码可读性确实河蟹的可以,我午饭前写的,现在就已经基本看不懂了。不过在TDD(测试驱动开发)的指导下,所有测试用例通过了,就算过了。

函数式编程看起来确实很酷,写这么长的语句一看就是人品很河蟹,所以有如国外的牛说的那样,他们一直希望取缔Python中的函数式编程支持。读者么如果有希望考验自己人品的,也可以多用用函数式编程。呵呵,先这样吧。