Python3(十) 函数式编程: 匿名函数、高阶函数、装饰器
一.匿名函数
1.定义:定义函数的时候不需要定义函数名
2.具体例子:
#普通函数
def add(x,y):
return x + y
#匿名函数
lambda x,y: x + y
调用匿名函数:
f = lambda x,y: x + y #赋值后可以调用 print(f(1,2)
lambda中(也就是:后面)只能进行简单的表达式操作,不能进行赋值操作。
二. 三元表达式
格式为:条件为真时返回的结果 if 条件判断 else 条件为假时返回的结果
x = 2 y = 1 r = x if x > y else y print(r) #
三元表达式在lambda中运用比较多。
三.map类
1.定义:map(函数,序列),把序列中所有值依次传到函数中并依次接受返回结果组成一个list。
其实是一个函数的映射。
2.求平方:
list_x = [1,2,3,4,5,6,7,8]
def square(x):
return x * x
r = map(square,list_x)
print(list(r))
#[1, 4, 9, 16, 25, 36, 49, 64]
四.map与lambda
将map和lambda函数结合:
1
list_x = [1,2,3,4,5,6,7,8] r = map(lambda x: x * x,list_x) print(list(r)
2 接受多个参数:
list_x = [1,2,3,4,5,6,7,8] list_y = [1,2,3,4,5,6,7,8] r = map(lambda x,y: x * x + y,list_x,list_y) print(list(r))
注意:若个数不相等,不会报错,但只能计算到最少的那位
五.reduce
1.

2. reduce运算的规则:做连续的计算,连续的调用lambda表达式。
reduce下的函数一定要有两个参数。
3.例子:
from functools import reduce list_x = [1,2,3,4,5,6,7,8] r = reduce(lambda x,y:x + y,list_x) print(r) #
运算过程:初始取前两位,之后将计算结果作为x传进去继续顺序取:
((((((1 + 2)+3) + 4)+ 5)+6)+7)+8
4.注意点:
- 继续做什么操作是lambda确定的,不仅只能够相加。
- 最后一位可以设定初始值,在第一次计算中就进行计算了:
eg:r = reduce(lambda x,y:x + y,list_x,10)
六. filter
1.filter可以过滤掉不符合规则的数据。

2.例子:
剔除数据为0的元素:
list_x = [1,0,0,1,0,1,1,0,1] r = filter(lambda x: True if x == 1 else False,list_x) print(list(r)) #[1, 1, 1, 1, 1]
简化为:
list_x = [1,0,0,1,0,1,1,0,1] r = filter(lambda x: x ,list_x) print(list(r)) #[1, 1, 1, 1, 1]
filter返回值的要是真和假才能完成过滤
七.命令式编程vs函数式编程
命令式编程涉及到 def if else for
函数式编程涉及到 map reduce filter lambda(算子)
八. 装饰器 一
import time
def f1():
print(time.time())
print('This is a function')
f1()
#1532404967.3804688 #Unix时间戳
This is a function
如果很多的函数都要获取时间的功能:
import time
def f1():
print('This is a function')
def f2():
print('This is a function')
def print_current_time(func):
print(time.time())
func()
print_current_time(f1)
print_current_time(f2)
这种需求变更方案的缺点:打印时间的需求是属于每个函数本身的,并不是新增加的,并没有体现函数本身的特性。
这就是装饰器所要解决的问题。
装饰器 二
编写装饰器:
import time
def decorator(func):
def wrapper():
print(time.time())
func()
return wrapper
def f1():
print('This is a function')
f = decorator(f1) #f得到了return的wrapper
f()
装饰器 三
语法塘:
import time def decorator(func):
def wrapper(): print(time.time()) func() return wrapper @decorator #@符号 def f1(): print('This is a function') f1()
没有改变调用的逻辑也没有改变函数编码。是装饰器的意义所在。
@decorator相当于对f1()装饰。
装饰器 四
1.带参函数的装饰器:
import time
def decorator(func):
def wrapper(func_name):
print(time.time())
func(func_name)
return wrapper
@decorator
def f1(func_name):
print('This is a function named' + func_name)
f1('test_func')
2.若多个函数接受不同数量的参数:
import time
def decorator(func):
def wrapper(*args):
print(time.time())
func(*args)
return wrapper
@decorator
def f1(func_name):
print('This is a function named' + func_name)
@decorator
def f2(func_name1,func_name2):
print('This is a function named'+func_name1 )
print('This is a function named'+ func_name2)
f1('test_func')
f2('test_func1','test_func2') #可以支持不同参数个数的函数
装饰器 五
1.*args不支持**关键字参数
支持关键字参数:
import time
def decorator(func):
def wrapper(*args,**kw): #加入**kw,较为完整
print(time.time())
func(*args,**kw)
return wrapper
@decorator
def f1(func_name):
print('This is a function named' + func_name)
@decorator
def f2(func_name1,func_name2):
print(func_name1 + func_name2)
@decorator
def f3(func_name1,func_name2,**kw):
print(func_name1 + func_name2)
print(kw)
f1('test_func')
f2('','')
f3('','',a = 1, b = 2,c = '')
#1532408656.565761
#This is a function namedtest_func
#1532408656.5667255
#
#1532408656.5677273
#
#{'a': 1, 'b': 2, 'c': '123'}
2.
def decorator(func): def wrapper(*args,**kw): #加入**kw,较为完整 print(time.time()) func(*args,**kw) return wrapper func(*args,**kw)这个形式,无论什么方式都可以调用。
装饰器 六
如果想对某个封装单元修改,可以加上装饰器。
不需要破坏代码实现,易于代码复用。
一个函数能够有多个装饰器。
需要验证身份的函数上加上专门的装饰器之类的用途。
Python3(十) 函数式编程: 匿名函数、高阶函数、装饰器的更多相关文章
- Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍
参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...
- day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- Python---12函数式编程------12.1高阶函数
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数
文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() ...
- python学习三十四天函数高阶函数定义及用法
python函数高阶函数是把函数当成一个变量,传递给函数作为参数,或者函数的返回值里面有函数,都称为高阶函数, 1,把函数作为参数传递 def dac(x,y): return x+y def tes ...
- [Python3] 034 函数式编程 匿名函数
目录 函数式编程 Functional Programming 1. 简介 2. 函数 3. 匿名函数 3.1 lambda 表达式也称"匿名函数" 3.2 lambda 表达式的 ...
- 函数式编程与React高阶组件
相信不少看过一些框架或者是类库的人都有印象,一个函数叫什么creator或者是什么什么createToFuntion,总是接收一个函数,来返回另一个函数.这是一个高阶函数,它可以接收函数可以当参数,也 ...
- Python 编程基础之高阶函数篇(一)
高阶函数:能接受函数作为参数的函数. 如: f=abs def add(x,y,f): return f(x)+f(y) 如果我们用:add(-5,9,f)来调用该高阶函数,则返回结果为:14 ...
- python递归,装饰器,函数, 高阶函数
在函数内部,可以调用其它函数,如果一个函数在内部调用自身本身,这个函数就是递归函数 递归特性:1.必须有一个明确的结束条件 2.每次进入更深一层递归时,问题规模比上次递归都有所减少(10-8-5等) ...
随机推荐
- JSP九大内置对象之session以及eclispe如何关联源码
一.session的特点及其实例 session:同一次会话共享 a.浏览网站:开始->关闭 b.购物:浏览.付款.退出 c.电子邮件:浏览.写邮件.退出 从一次开始到一次结束,是一次会话. ...
- 七牛云上传视频并截取第一帧为图片(js实现)
本文出自APICloud官方论坛, 感谢论坛版主 东冥羽的分享. 七牛云上传视频并截取第一帧作为视频的封面图. 使用js上传,模块videoPlayer截取第一帧(有专门的截图模块,但是我使用的有点问 ...
- 基于AOP和ThreadLocal实现的一个简单Http API日志记录模块
Log4a 基于AOP和ThreadLocal实现的一个简单Http API日志记录模块 github地址 : https://github.com/EalenXie/log4a 在API每次被请求时 ...
- Vmware Ubuntu18.04更换清华源
一.安装Ubuntu18.04 省略 二.安装VmwareTool 1.选择机器右击安装2.打开文件,copy压缩文件到其它目录(理由: 内存不够解压)3.解压文件,运行./忘记名字了.pl文件4.注 ...
- Java入门 - 导读
原文地址:http://www.work100.net/training/java 更多教程:光束云 - 免费课程 Java入门 Java 是由 Sun Microsystems 公司于1995年5月 ...
- Java入门 - 语言基础 - 13.Character类
原文地址:http://www.work100.net/training/java-character.html 更多教程:光束云 - 免费课程 Character类 序号 文内章节 视频 1 概述 ...
- [bzoj4443] [loj#2006] [洛谷P4251] [Scoi2015]小凸玩矩阵
Description 小凸和小方是好朋友,小方给小凸一个 \(N \times M\)( \(N \leq M\) )的矩阵 \(A\) ,要求小秃从其中选出 \(N\) 个数,其中任意两个数字不能 ...
- 第二阶段冲刺个人任务——three
今日任务: 优化统计个人博客结果页面的显示. 昨日成果: 优化作业查询结果,按学号排列.
- 常用API_1
API API(Application Programming Interface),应用程序编程接口.Java API是一本程序员的 字典 ,是JDK中提供给 我们使用的类的说明文档.这些类将底层的 ...
- 为什么在留言处插入<script>alert(1)</script>不弹框
对于新手来说,往往会在留言地方插入<script>alert(1)</script>来检测是否有存储xss,事实是基本上不会弹框的,为啥? 通过查看源码,可知道<> ...