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等) ...
随机推荐
- Project Settings之Quality翻译
(版本是2018.4......翻译是自己的渣翻译水平) Unity allows you to set the level of graphical quality it attempts to r ...
- 如何实施DevOps
对于长期在孤立的架构下工作的组织来说,转移到协作式DevOps系统似乎是难以成功的.为了进一步提高效率,必须改变观念,并进行团队文化改变.例如:许多人认为只有自动化工具才能解决DevOps,其实这是不 ...
- dfs - 卡一个无符号长整形
Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal repr ...
- 字典树 (HDU 2072)
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Input有多组数据,每组一行,每组就是 ...
- LeetCode 第七题--整数反转
1. 题目 2.思路 1. 题目 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321示例 ...
- 异数OS TCP协议栈测试(二)--短连接篇
异数OS TCP协议栈测试(二)--短连接篇 本文来自异数OS社区 github: 异数OS-织梦师(消息中间件)群: 476260389 测试目标 TCP 短链接IO性能测试,Client Se ...
- 生产者消费者代码学习,Producer_Consuner
使用BlockingQuery实现生产者者消费者:考虑并发,解耦. 生产者消费者模式是面向过程的设计模式. 生产者制造数据 ------> 生产者把数据放入缓冲区 -------> ...
- JAVA中值传递,引用传递
刚在写一个用例,需要在方法中改变传递的参数的值,可是java中只有传值调用,没有传址调用.所以在java方法中改变参数的值是行不通的.但是可以改变引用变量的属性值. 可以仔细理解一下下面几句话: 1. ...
- Go的切片:长度和容量
虽然说 Go 的语法在很大程度上和 PHP 很像,但 PHP 中却是没有"切片"这个概念的,在学习的过程中也遇到了一些困惑,遂做此笔记. 困惑1:使用 append 函数为切片追加 ...
- 我的ubuntu源18和16
16阿里云的 deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restric ...