Python-14-高级特性-函数式编程、lambda表达式、高阶函数、map、reduce、filter、排序、返回函数、闭包closure、装饰器Decrator、偏函数
2019-07-23 13:06
931 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mk1843109092/article/details/96968465
Python函数时编程只是借鉴函数式编程的一些特点
高阶函数
返回函数
匿名函数
装饰器
偏函数
lambda表达式(匿名函数)
不是一个代码块,仅仅是一个表达式
可以有参数,逗号隔开
filter函数怎么写:
返回值一定时布尔值
调用格式:filter(f,data),f时过滤函数,data数据
Python高级特性
函数式编程(FunctionalProgramming)
- 基于lambda盐酸的一种编程方式 程序中只有函数
- 函数可以作为参数,同样可以作为返回值
- 纯函数式编程语言:LISP,Haskell
lambda表达式
- 函数:最大程度复用代码 存在问题:如果函数很小,很短,则会造成啰嗦
- 如果函数被调用次数少,则会造成浪费
- 对于阅读者来说,造成阅读流程的被迫中断
-
一个表达式,函数体相对简单
# lambda表达式的用法 #以lambda开头 #紧跟一定的参数 #参数后用冒号和表达式主题隔开 #没有return stm = lambda x:100*x print(stm(89)) >>> 8900 ---- stmt = lambda x,y,z:x+y*12+z*90 print(stmt(100,34,5)) >>> 958
高阶函数
- 把函数作为参数来使用的函数
def funA(): print("In funA") funB = funA funB() >>> In funA
- 函数名称时变量
- funA和funB是指名称不一样
- 既然时变量就可以当参数传入
# funA是一个普通函数, def funA(n): return n * 100 def funC(n, f): return f(n)*3 print(funC(9, funA)) >>> 2700
map
- 愿意就是映射,即把集合或者列表的元素,每一个人元素都按照一定规则进行操作,生成一个新的列表或者集合
- map函数时系统提供的具有映射功能的函数,返回值是一个迭代对象
l1 = [i for i in range(10)] def mulTen(n): return n*10 l2 = map(mulTen, l1) # l2的类型是可迭代的,直接用for、循环遍历 for i in l2: print(i)
reduce
- 愿意时归并,缩减
- 把一个课迭代的内容最后归并为一个结果
- 对于作为参数的函数要求,必须有两个参数,必须有两个返回结果
- reduce([1,2,3,4,5]) == f(f(f(f(1,2),3),4),5)
- 需要导入functools包
from functools import reduce def myAdd(x,y): return x+y # 先把前两个参数计算,返回值再与第三个数计算,返回值再与第四个数计算...... rst = reduce(myAdd, [1,2,3,4,5,6]) print(rst) >>> 21
filter 函数
- 过滤函数,对一组数据进行过滤,符合条件的数据会生成一个新的列表返回
- 跟map相比较 相同:都对列表的每一个元素进行操作
- 不同: map生成一个跟原来数据相对应的新列表
- filter不一定,只要符合条件的才会进入新的数据集合
-
利用给定函数进行判断
# 对于一个列表,对其进行过滤,偶数组成一个新列表 def isEven(a): return a%2 == 0 l = [3,4,45,23,345,56,57,56,8,86,9,45,24,2] rst = filter(isEven, l) print([i for i in rst]) >>> [4, 56, 56, 8, 86, 24, 2]
排序
- 把一个序列按照给定算法进行排序
- key:在排序前对每一个元素进行key函数运算
a = [23,43,5,65,77,68,99,732,4] al = sorted(a, reverse = True) # reverse倒序 print(al) >>> [732, 99, 77, 68, 65, 43, 23, 5, 4] ----- a = [-23, 34,54,675,78,-54,-76,3] # 按照绝对值排序 al = sorted(a, key=abs, reverse = True) print(al) >>> [675, 78, -76, 54, -54, 34, -23, 3] ----- astr = ['dana', 'Danna','nihao','Taobao'] str = sorted(astr) print(str) >>> ['Danna', 'Taobao', 'dana', 'nihao']
返回函数
- 函数可以返回具体的值
- 也可以返回一个函数作为结果
# 函数作为返回值返回,被返回的函数在函数体内定义 def myF2(): def myF3(): print("In myF3") return 3 return myF3 f3 = myF2() print(type(f3)) print(f3) print(f3()) >>> <class 'function'> <function myF2.<locals>.myF3 at 0x000001525EA8BC80> In myF3 3
def myF4(*args): def myF5(): rst = 0 for n in args: rst += n return rst return myF5 f5 = myF4(1,2,3,4,5,6,7,8,9,0) print(f5()) >>> 45
闭包closure
- 当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当作返回值的时候,相关参数和变量保存在返回的函数中,这种结果叫做闭包
# 闭包常见的坑 def count(): fs = [] for i in range(1,4): def f(): return i*i fs.append(f) return fs f1,f2,f3=count() print(f1()) print(f2()) print(f3()) # 本来期望的是1,4,9 >>> 9 9 9
- 造成上述状况的是,返回函数引用了变量i,i并非立即执行,而是等到三个函数都返回的时候才同意使用,此时i已经变成3,最终调用的都是3*3
- 返回闭包是,返回函数不能引用任何循环变量
- 解决方案:在创建一个函数,用该函数的参数绑定循环变量的当前值,无论循环变量以后如何改变,已经绑定的函数参数值不再改变
def count2(): def f(j): def g(): return j*j return g fs = [] for i in range(1,4): fs.append(f(i)) return fs f1,f2,f3 = count2() print(f1()) print(f2()) print(f3()) >>> 1 4 9
装饰器decrator
- 在不改动函数代码的基础上无限制扩展函数功能的一种机制,本质上讲,装饰器是一个返回函数的高阶函数
- 装饰器的使用,使用@语法,即每次要扩展到函数定义前使用@+函数名
import time def printTime(f): def wrapper(*args, **kwargs): print("Time:", time.ctime()) return f(*args, **kwargs) return wrapper # 在执行hello之前,先打印时间 @printTime # 借助于@语法糖 def hello(): print("hello world") hello() >>> Time: Tue Jul 23 12:26:53 2019 hello world ---- # 手动执行装饰器 hello3 = printTime(hello) hello3() >>> Time: Tue Jul 23 12:34:14 2019 Time: Tue Jul 23 12:34:14 2019 hello world
偏函数
# 新建一个函数,此函数是默认输入的字符串是16进制数字 # 把此字符串返回十进制的数字 def int16(x, base=16): return int(x, base) int16("12345") >>> 74565
- 偏函数
- 参数固定的函数,相当于一个由特定参数的函数体
- functools.partial的作用是,把一个把函数某些函数固定,返回一个新函数
import functools int16 = functools.partial(int, base=16) print(int16("12345")) >>> 74565
相关文章推荐
- Python入门 第四天(函数式编程、map、reduce、filter、排序函数、函数返回函数、闭包、匿名函数lambda)
- python--lambda表达式,高阶函数map,reduce,filter,sorted,闭包,偏函数,装饰器
- Python高级特性: 函数编程 lambda, filter,map,reduce
- 【语言工具】Python闭包,装饰器,生成器,偏函数,函数式编程,lamda,map,reduce,filter
- Python 函数式编程(高阶函数、把函数作为参数、map()函数、reduce()函数、filter()函数、自定义排序函数、函数返回函数、闭包、匿名函数、装饰器decorator)
- python 的高级特性:函数式编程,lambda表达式,装饰器
- Python学习 Day 5 高阶函数 map/reduce filter sorter 返回函数 匿名函数 装饰器 偏函数
- Python高阶函数 filter 、排序、返回函数、闭包、装饰器、偏函数------21
- python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))
- python 高阶函数 map reduce filter sorted 闭包 装饰器
- Python中特殊函数和表达式 filter,map,reduce,lambda
- 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数
- Python函数式编程(高阶函数 <map/reduce filter sorted> 返回函数 匿名函数 装饰器 偏函数)
- python中map、reduce、filter、自定义排序函数、装饰器函数和偏函数
- python的lambda表达式 内建函数filter map reduce
- Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊
- Python高阶函数(Map、Reduce、Filter)和lambda函数一起使用 ,三剑客
- Python 函数式编程--高阶函数Map、Reduce、Filter、Sorted
- python 的 map(),reduce(),filter(),返回函数,闭包
- Python函数式编程学习:lambda, map, reduce, filter