前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python: 函数式编程

Python: 函数式编程

作者头像
用户2183996
修改2019-09-22 17:41:46
6220
修改2019-09-22 17:41:46
举报
文章被收录于专栏:技术沉淀技术沉淀

开公众号啦,分享读书心得,欢迎一起交流成长。

函数式编程

Map

map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回,比循环更简洁,更易读。

代码语言:javascript
复制
# default function
name_len = map(len, ["Sam", "John", "Ned Stark"])
print name_len
代码语言:javascript
复制
[3, 4, 9]
代码语言:javascript
复制
# lambda function
squares = map(lambda x: x * x, range(9))
print squares
代码语言:javascript
复制
[0, 1, 4, 9, 16, 25, 36, 49, 64]
代码语言:javascript
复制
# self defined function
def toUpper(item):
      return item.upper()
 
upper_name = map(toUpper, ["sam", "john", "ned stark"])
print upper_name
代码语言:javascript
复制
['SAM', 'JOHN', 'NED STARK']

Reduce

reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算(相当于计算结果后把这个值再放回去),其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

代码语言:javascript
复制
# 累加
print reduce(lambda x, y: x+y, [1,2,3,4])
代码语言:javascript
复制
10
代码语言:javascript
复制
# 累乘
print reduce(lambda x, y: x*y, [1, 2, 3,4])
代码语言:javascript
复制
24
代码语言:javascript
复制
# 要把序列[1,2,3,4]变换成整数1234
print reduce(lambda x,y: 10*x + y, [1,2,3,4])
代码语言:javascript
复制
1234

Filter

filter 函数的功能相当于过滤器。调用一个布尔函数bool_func来迭代遍历每个seq中的元素;返回一个使bool_seq返回值为true的元素的序列。

map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

代码语言:javascript
复制
# 剔除偶数
def is_odd(n):
    return n % 2 == 1

filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
代码语言:javascript
复制
[1, 5, 9, 15]

All

当可迭代对象(比如list)里所有元素都为True的时候,返回True,类似对所有元素做and操作,但注意当可迭代对象为空时,仍然返回True。等级于:

代码语言:javascript
复制
def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True
代码语言:javascript
复制
all(['a', 'b', 'c'])  #列表list,元素都不为空或0
代码语言:javascript
复制
True
代码语言:javascript
复制
all([0, 1, 2, 3])  #列表list,存在一个为0的元素
代码语言:javascript
复制
False
代码语言:javascript
复制
all(('a', 'b', '', 'd'))  #元组tuple,存在一个为空的元素
代码语言:javascript
复制
False
代码语言:javascript
复制
all([]) # 空列表
代码语言:javascript
复制
True

Any

当可迭代对象有任何一个元素为True时,返回True,否则返回False,当可迭代对象为空时,返回False.

代码语言:javascript
复制
def any(iterable):
    for element in iterable:
        if element:
            return True
    return False
代码语言:javascript
复制
any([0,1,2])
代码语言:javascript
复制
True
代码语言:javascript
复制
any([0, '', False])  #列表list,元素全为0,'',false
代码语言:javascript
复制
False

Sorted

python内置的sorted()函数就可以对list进行排序:

sorted(iterable, cmp=None, key=None, reverse=False)

代码语言:javascript
复制
lst = [36, 5, -12, 9, -21]
代码语言:javascript
复制
sorted(lst)
代码语言:javascript
复制
[-21, -12, 5, 9, 36]

sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序,其实相当于用传入的函数(比如abs)对list进行map,作为key,然后按key排序,返回list。

keys排序结果 => [5, 9, 12, 21, 36] ===========|==|==|==|==| 最终结果=====> [5, 9, -12, -21, 36]

代码语言:javascript
复制
sorted(lst,key=abs)
代码语言:javascript
复制
[5, 9, -12, -21, 36]
代码语言:javascript
复制
# 忽略大小写
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']
代码语言:javascript
复制
['about', 'bob', 'Credit', 'Zoo']
代码语言:javascript
复制
# 逆序
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
代码语言:javascript
复制
['Zoo', 'Credit', 'bob', 'about']

Pipeline

该部分来自酷壳函数式编程,写的真好。

这个技术的意思是,把函数实例成一个一个的action,然后,把一组action放到一个数组或是列表中,然后把数据传给这个action list,数据就像一个pipeline一样顺序地被各个函数所操作,最终得到我们想要的结果。

pipeline 管道借鉴于Unix Shell的管道操作——把若干个命令串起来,前面命令的输出成为后面命令的输入,如此完成一个流式计算。(注:管道绝对是一个伟大的发明,他的设哲学就是KISS – 让每个功能就做一件事,并把这件事做到极致,软件或程序的拼装会变得更为简单和直观。这个设计理念影响非常深远,包括今天的Web Service,云计算,以及大数据的流式计算等等)

我们先来看一个如下的程序,这个程序的process()有三个步骤:

  1. 找出偶数。
  2. 乘以3
  3. 转成字符串返回
代码语言:javascript
复制
def process(num):
    if num % 2 != 0:
        return
    num = num * 3
    num = 'The Number: %s' % num
    return num
 
nums = [1, 2, 3, 4, 5]
 
for num in nums:
    print process(num)
代码语言:javascript
复制
None
The Number: 6
None
The Number: 12
None

我们可以看到,输出的并不够完美,另外,代码阅读上如果没有注释,你也会比较晕。下面,我们来看看函数式的pipeline应该怎么写?

不用这样嵌套pipeline = convert_to_string(multiply_by_three(even_filter(nums)))

代码语言:javascript
复制
# 用map reduce filter等
def even_filter(nums):
    return filter(lambda x: x%2==0, nums)

def multiply_by_three(nums):
    return map(lambda x: x*3, nums)

def convert_to_string(nums):
    return map(lambda x: 'The Number: %s' % x,  nums)

def pipeline_func(data, fns):
    return reduce(lambda a, x: x(a), fns, data)

nums = [1, 2, 3, 4]
pipeline_func(nums, [even_filter, multiply_by_three, convert_to_string])
代码语言:javascript
复制
['The Number: 6', 'The Number: 12']

参考

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.07.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数式编程
    • Map
      • Reduce
        • Filter
          • All
            • Any
              • Sorted
                • Pipeline
                  • 参考
                  相关产品与服务
                  流计算 Oceanus
                  流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的企业级实时大数据分析平台,具备一站开发、无缝连接、亚秒延时、低廉成本、安全稳定等特点。流计算 Oceanus 以实现企业数据价值最大化为目标,加速企业实时化数字化的建设进程。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档