Python函数式编程(高阶函数)

函数式编程简介

  • 函数是python内建的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂的任务分解成简单的任务,这种分解称为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。
  • 函数式编程(functional programming),也可以归到面向过程的程序设计,但思想更接近于数学计算
  • 函数式编程是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此任意一个函数,只要输入时确定的,输出就是确定的,这种纯函数我们称之为没有副作用。反之亦反(python不是纯函数式编程语言)
  • 函数式编程的一个特点是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数

高阶函数简介

  • 变量可以指向函数
    • 一般要获得函数调用结果,是把函数调用结果赋值给变量 x = abs(-10)
    • 函数本身也可以赋值给变量,即变量可以指向函数 f = abs
       如果一个变量指向了一个函数,那也可以通过变量调用该函数
       即 f(-10) 相当于 abs(-10)
  • 函数名也是变量
    • 函数名其实就是指向函数的变量
       对于abs()这个函数,完全可以把函数名abs看成变量,它指向一个可以计算绝对值的函数
    • 修改函数名变量的指向,只在当前模块生效,如果想在其他模块也生效,要用import 原函数模块; 原函数模块.函数名 = 新赋值(import builtins;builtins.abs = 10)
  • 传入函数
    • 既然变量可以指向函数,函数的参数能接受变量,那么一个函数就可以接受另一个函数作为参数,这种函数称之为高阶函数
    • 编写高阶函数,就是让函数的参数能接收别的函数

map/reduce

python内建了map()和reduce()函数

  • map
    • map()函数接收两个参数,一个是函数,一个是iterable
    • map将传入的函数依次作用到序列的每个元素,并把结果作为新的iterable返回
       map(str,[1,2,3,4,5,6,7,8,9]) 把后面的list的所有数字转化成字符串
       效果map(f,[1,2,3,4]) = [f(1),f(2),f(3),f(4)]
  • reduct
    • reduct()函数接收两个参数,一个是函数,一个是iterable
    • reduct把一个函数作用在一个序列[x1,x2,x3,…]上,这个函数必须接受两个参数,reduct把结果继续和序列的下一个元素做累积计算
       效果reduct(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
  • 注意:
    • map()和reduct()函数的第一个参数是函数本身,而不是函数调用,所以不带()
    • 即一个函数为另一个函数的参数时,应该传入的是函数本身,不是函数调用结果,不带()

filter

  • python内建的filter()函数用于过滤序列
  • 也是接收一个函数和一个序列,filter()把传入的函数依次作用于每个元素,然后根据返回值是True或False决定保留还是丢弃该元素
  • 返回的是iterator(迭代器),是惰性序列
    • 所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list
    • map和reduct返回的都是可迭代对象
  • 计算素数的一个方法是埃拉托色尼筛选法
  • 由于filter()使用了惰性计算,所以只有在取filter()结果的时候,才会真正筛选并返回下一个筛出结果

sorted

  • sorted()和sort()的区别
    • sort 是应用在 list 上的方法,属于列表的成员方法,sorted 可以对所有可迭代的对象进行排序操作。
    • list 的 sort 方法(ls.sort())返回的是对已经存在的列表进行操作,而内建函数 sorted 方法(sorted(ls))返回的是一个新的 list,而不是在原来的基础上进行的操作。
    • sort使用方法为ls.sort(),而sorted使用方法为sorted(ls)
  • 排序算法
    • 核心是比较两个元素的大小(只有数字可以直接比较)
    • 包含冒泡排序、快速排序等
  • python内置的sorted()是高阶函数
    • 可以接受key函数来实现自定义的排序
    • 接受reverse=True进行倒序排列
    • 用sorted()排序的关键在于实现一个映射函数
  • sorted()对list进行排序
    • 默认正序排列
      sorted([36,2,0,-1]) [-1,0,2,36]
    • 按绝对值排序
      sorted([36,2,0,-1],key = abs) [0,-1,2,36]
      sbs()函数求绝对值
    • 原理
      key指定的函数将作用于list的每一个元素上,返回key函数返回的结果keys
      sorted()函数按照keys排序
      并根据原list和keys对应关系返回原来list的值
  • sorted()对字符串排序
    • 默认按照首字母大小正序排列(先排大写再排小写,按照ASCLL排)
      sorted([‘bob’, ‘about’, ‘Zoo’, ‘Credit’]) [‘Credit’, ‘Zoo’, ‘about’, ‘bob’]
    • 忽略大小写排序
      sorted([‘bob’, ‘about’, ‘Zoo’, ‘Credit’],key=str.lower) [‘about’, ‘bob’,‘Credit’, ‘Zoo’]
      str.lower()将大写转化为小写
    • 反向排序
      sorted([‘bob’, ‘about’, ‘Zoo’, ‘Credit’], key=str.lower, reverse=True) [‘Zoo’, ‘Credit’, ‘bob’, ‘about’]
  • 对字典进行排序
    • 先创建一个取出字典键或值的函数
    • 然后使用sorted()对键或值排序
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_score(t):
    return t[1]
L2 = sorted(L,key=by_score,reverse=True) #reverse=True倒序排列
print(L2)

结果:[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值