1.1函数式编程

面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

函数式编程:是使用一系列函数去解决问题,函数式编程就是根据编程的范式来的出想要的结果,只要是输入时确定的,输出就是确定的。

1.2高阶函数

能把函数作为参数传入,这样的函数就称为高阶函数。

1.2.1函数即变量

以python的内置函数print()为列,调用该函数一下代码

  1. >>> print("hello world")
  2. hello world
  3.  
  4. #只写print
  5. >>> print
  6. <built-in function print>
  7.  
  8. #可见print("hello world")是函数调用,而print是函数本身

要获得函数调用执行的结果,我们把结果赋值给变量:

  1. >>> aa = abs(-20)
  2. >>> aa
  3. 20

如果把函数本身赋值给变量

  1. >>> p = print
  2. >>> p
  3. <built-in function print>
  4.  
  5. #函数本身可以赋值给变量,变量可以指向函数

我们通过变量来调用这个print函数,验证结果如下

  1. >>> p("check")
  2. check

总结:函数名也是变量,对于print()这个内置函数,完全可以把函数名print看成变量,它指向一个可以打印任何东西的函数

注:实际程序代码绝不能这么写,上面只是为了举例说明,要恢复print函数,请重启python的交互环境

1.2.2传入函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一函数作为函数,这种函数就称为高阶函数,

函数的返回值是一个函数名,也是高阶函数。

例如:一个简单的高阶函数

  1. def add(x,y,z):
  2. return abs(x)+abs(y)
  3. aa = add(12,23,abs) #函数执行的结果 赋值给 aa
  4. print(aa) #查看aa的值
  5. #35
  6.  
  7. #注,abs()函数是求一个整数的绝对值

1.3匿名函数

什么是匿名函数:

在python中有一个匿名函数lambda,匿名函数就是指:无需定义标识符(函数名)的函数或子程序。

定义lambda表达式:

  1. lambda arguments:express
  2.  
  3. #arguments 参数(可以有多个参数)
  4. #express 表达式
  5.  
  6. #lambda返回值是一个函数的地址,也就是函数对象
  7. aa = lambda arguments:express #把的到lambda函数地址,赋值给变量aa
  8.  
  9. 查看这个lambda函数地址 ,用aa(argument) 查看这个函数的值

例1

  1. def pf(x=0):
  2. return x**2
  3. print(pf(3))

普通函数定义,求数字平方

  1. aa = lambda x:x**2
  2. print(aa(4))
  3. #

lambda函数,求数字平方

总结:

1.lambda函数可以参数可以有多个,包含的表达式不能超过一个,不要试图向lambda函数中塞入太多东西,如果你需要做复杂的功能,应该定义一个普通函数,想定义什么就定义什么。

2.lambda函数用在需要封装特殊的,非重用代码上,避免令我们的代码充斥大量的单行函数。

1.4map函数

map()函数,map映射

map(func,iterable)

map()函数接受两个参数,一个是函数,一个可迭代的对象(iterable),map将传入的函数依次作用到序列的每个元素,并把结果作为新的 可迭代的对象 的结果返回

例:有个函数,f(x) = x+1 把得到的数字 加1    要把这个函数作用在一个[1,2,3,4,5,6]上

  1. number = [1,2,3,4,5,6]
  2. #1.用普通函数定义方法
  3. def add_one(x):
  4. return x+1
  5. def map_test(func,arrey):
  6. res = []
  7. for i in arrey:
  8. i = func(i)
  9. res.append(i)
  10. return res
  11. print(map_test(add_one,number))
  12. #[2, 3, 4, 5, 6, 7]
  13.  
  14. #2.用lambda函数定义的得到结果,借助1定义的map_test函数
  15. print(map_test(lambda x:x+1,number))
  16. #[2, 3, 4, 5, 6, 7]
  17.  
  18. #3.用map()本身函数去定义
  19. print(list(map(lambda x:x+1 ,number)))
  20. #[2, 3, 4, 5, 6, 7]
  21.  
  22. #注:map()得出的结果是一个iterator ,需要用list()函数让它个整个序列都计算出来返回一个list

我们可能会想,写一个循环,也可以计算出结果,但要实现多个功能,是不是也要写多个循环 例:得出每个列表中元素的平方或则n次方

map()作为高阶函数,事实上把运算规则抽象了,不但可以计算简单的 f(x) = x+1 ,也能计算更复杂的函数。

总结:map() 处理序列中的每个元素,得到的结果是一个 iterator ,需通过list(iteratro),该list元素个数,与原来位置一样

1.5reduce函数

在python2可以直接用reduce()函数

在python3需要调用reduce模块

  1. from functools import reduce
  2. reduce(function, sequence, initial=None) #该函数的默认用法

reduce函数,将function作用sequence序列的元素,每次携带一对(先前的结果以及下一序列的元素),连续的将现有的结果和下一个作用在获得的随后的结果上,最后得到我们的序列为一个最终结果的返回值

  1. number1 = [2,3,4,10]
  2. #1.普通函数定义
  3. def chengfa(x,y):
  4. return x*y #返回得到两个数相乘的结果
  5. def reduce_test(func,seq,init=None):
  6. if init is None:
  7. res = seq.pop(0) #seq删除第一个元素,并获取删除这个元素 赋值给res
  8. else:
  9. res = init
  10. for i in seq:
  11. res = func(res,i) #循环一次,执行func这个函数
  12. return res
  13. print(reduce_test(chengfa,number1))
  14. #
  15. print(reduce_test(chengfa,number1,10))
  16. #
  17.  
  18. #如果给了init 初始值,就是从初始值 乘以列表的每个元素的的出结果
  19.  
  20. #2.lambda函数,借助reduce_test()函数定义
  21. print(reduce_test(lambda x,y:x*y,number1,init=3))
  22. #
  23.  
  24. #3.使用reduce(),结合lambda()
  25. print(reduce(lambda x,y:x*y, number1))
  26. #
  27.  
  28. 得到列表所有元素,相乘的结果
  29.  
  30. number1 = [2,3,4,10]
  31. #1.普通函数定义
  32. def chengfa(x,y):
  33. return x*y #返回得到两个数相乘的结果
  34. def reduce_test(func,seq,init=None):
  35. if init is None:
  36. res = seq.pop(0) #seq删除第一个元素,并获取删除这个元素 赋值给res
  37. else:
  38. res = init
  39. for i in seq:
  40. res = func(res,i) #循环一次,执行func这个函数
  41. return res
  42. print(reduce_test(chengfa,number1))
  43. #
  44. print(reduce_test(chengfa,number1,10))
  45. #
  46.  
  47. #如果给了init 初始值,就是从初始值 乘以列表的每个元素的的出结果
  48.  
  49. #2.lambda函数,借助reduce_test()函数定义
  50. print(reduce_test(lambda x,y:x*y,number1,init=3))
  51. #
  52.  
  53. #3.使用reduce(),结合lambda()
  54. from functools import reduce
  55. print(reduce(lambda x,y:x*y, number1))
  56. #

得到列表所有元素,相乘的结果

  1. print(reduce(lambda x,y:x+y,range(1,101)))

得到1-100的和

1.6filter函数

filter()函数用于过滤序列

和map()类似,filter()也接受一个函数和一个序列(可迭代的对象,也就是能被for循环),和map()不同的是,fillter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

例:

  1. aa = ['A', '', 'B', None, 'C', ' ']
  2. #1.自定义函数测试
  3. def not_empty(s):
  4. return s and s.strip()
  5. def filter_test(func,iter):
  6. res = []
  7. for i in iter:
  8. i = func(i)
  9. if i:
  10. res.append(i)
  11. return res
  12. print(filter_test(not_empty,aa))
  13.  
  14. #['A', 'B', 'C']
  15.  
  16. #2.filter内置函数测试
  17. print(list(filter(not_empty,aa)))
  18. #['A', 'B', 'C']

把列表中空字符串,空元素,都去掉

filter()这个函数,关键在于正确实现一个筛选函数,

注:filter()函数返回的是一个iterator,内存地址,需要看内存地址的值, 用list()函数或得该地址的值

1.7sorted函数

sorted()函数也是一个高阶函数,它可以接收key

sorted排序,排序是比较元素的大小,如果是数字可以直接比较,如果是字符串或则两个dict(字典)?

sorted()传入的参数是可迭代的对象,返回值的对象是一个列表

例:

  1. aa = [11,-10,20,21,30,-40]
  2. print(sorted(aa))

数字默认排序

接收一个key函数来实现自定义排序

例:根据绝对值大小来进行排序

  1. aa = [11,-10,20,21,30,-40]
  2. print(sorted(aa,key=abs))
  3. #[-10, 11, 20, 21, 30, -40]

根据绝对值排序

例:字符串排序

  1. print(sorted("hello"))
  2. #['e', 'h', 'l', 'l', 'o']
  3. print(sorted(["hello","ho","haha"]))
  4. # ['haha', 'hello', 'ho']

字符串排序

注:默认情况下,对字符串排序是按照ASCII编码表的大小进行比较的

最后总结:

python内置的几个高阶函数:map() ,reduce(),filter,sorted()

python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))的更多相关文章

  1. Python学习 Day 5 高阶函数 map/reduce filter sorter 返回函数 匿名函数 装饰器 偏函数

    高阶函数Higher-orderfunction 变量可以指向函数 >>> abs #abs(-10)是函数调用,而abs是函数本身 <built-in function ab ...

  2. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  3. (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)

    原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...

  4. 函数式编程 高阶函数 map&reduce filter sorted

    函数式编程 纯函数:没有变量的函数 对于纯函数而言:只要输入确定,那么输出就是确定的.纯函数是没有副作用的. 函数式编程:允许把函数本身作为参数传入另一个函数,还允许返回一个函数 高阶函数:一个函数的 ...

  5. python 函数式编程 高阶函数 装饰器

    # -*- coding:gb2312 -*- #coding=utf-8 # 高阶函数 import math def is_sqr(x): y = int(math.sqrt(x)) return ...

  6. Python函数式编程-高阶函数、匿名函数、装饰器、偏函数

  7. 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数

    函数式编程高阶函数 就是把函数作为参数的函数,这种抽象的编程方式就是函数式编程.--- - -跳过,不是很理解,汗 - ---

  8. Python map/reduce/filter/sorted函数以及匿名函数

    1. map() 函数的功能: map(f, [x1,x2,x3]) = [f(x1), f(x2), f(x3)] def f(x): return x*x a = map(f, [1, 2, 3, ...

  9. [python基础知识]python内置函数map/reduce/filter

    python内置函数map/reduce/filter 这三个函数用的顺手了,很cool. filter()函数:filter函数相当于过滤,调用一个bool_func(只返回bool类型数据的方法) ...

随机推荐

  1. 写了一个常规性生成merge 的小脚本

    现在使用数据库来写存储过程,动不动参数就会用到xml ,当然罗,优势也很明显,参数相对固定,而且灵活,如果要修改或者什么的,中间接口层也不需要做变化,只需要修改封装的存储过程以及程序传参就ok了. 随 ...

  2. 云计算与 OpenStack - 每天5分钟玩转 OpenStack(14)

    “云计算” 算是近年来最热的词了.现在 IT 行业见面不说这三个字您都不好意思跟人家打招呼. 对于云计算,学术界有各种定义,大家有兴趣可以百度一下. CloudMan 这里主要想从技术的角度谈谈对云计 ...

  3. docker核心原理

    容器概念. docker是一种容器,应用沙箱机制实现虚拟化.能在一台宿主机里面独立多个虚拟环境,互不影响.在这个容器里面可以运行着我饿们的业务,输入输出.可以和宿主机交互. 使用方法. 拉取镜像 do ...

  4. [django]从前端返回字符串,后端转换为字典,执行数据添加操作

    具体如题: js代码如下: $('#bill_add').click(function(){//合同添加 var bill1 = $("#bill1").val();var bil ...

  5. Oozie coordinator 作业自定义的配置的一些方法

    Oozie的coordinator有啥用? The Oozie Coordinator system allows the user to define and execute recurrent a ...

  6. transactionManager的type与dataSource的type

    1. 在ibatis的配置文件中dataSource 节点有这么个配置<datasource type="SIMPLE"></datasource>,根据原 ...

  7. BZOJ1500: [NOI2005]维修数列[splay ***]

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 12278  Solved: 3880[Submit][Statu ...

  8. Freemarker与普通java

    package com.sxt.test.freemarker; import java.io.File; import java.io.OutputStreamWriter; import java ...

  9. 第3章 Linux常用命令(4)_帮助、用户管理和解压缩命令

    4. 帮助命令 4.1 获取帮助信息:man (1)man命令 命令名称 man(英语原义:manual) 命令所在路径 usr/bin/man 执行权限 所有用户 语法 man [级别] [命令或配 ...

  10. java多线程系类:JUC锁:01之框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--"JUC锁"01之 框架02. Java多线程系列--"JUC锁&q ...