一.匿名函数

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(十) 函数式编程: 匿名函数、高阶函数、装饰器的更多相关文章

  1. Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍

    参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...

  2. day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  3. Python---12函数式编程------12.1高阶函数

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

  4. Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

    文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() ...

  5. python学习三十四天函数高阶函数定义及用法

    python函数高阶函数是把函数当成一个变量,传递给函数作为参数,或者函数的返回值里面有函数,都称为高阶函数, 1,把函数作为参数传递 def dac(x,y): return x+y def tes ...

  6. [Python3] 034 函数式编程 匿名函数

    目录 函数式编程 Functional Programming 1. 简介 2. 函数 3. 匿名函数 3.1 lambda 表达式也称"匿名函数" 3.2 lambda 表达式的 ...

  7. 函数式编程与React高阶组件

    相信不少看过一些框架或者是类库的人都有印象,一个函数叫什么creator或者是什么什么createToFuntion,总是接收一个函数,来返回另一个函数.这是一个高阶函数,它可以接收函数可以当参数,也 ...

  8. Python 编程基础之高阶函数篇(一)

      高阶函数:能接受函数作为参数的函数. 如: f=abs def   add(x,y,f): return f(x)+f(y) 如果我们用:add(-5,9,f)来调用该高阶函数,则返回结果为:14 ...

  9. python递归,装饰器,函数, 高阶函数

    在函数内部,可以调用其它函数,如果一个函数在内部调用自身本身,这个函数就是递归函数 递归特性:1.必须有一个明确的结束条件 2.每次进入更深一层递归时,问题规模比上次递归都有所减少(10-8-5等) ...

随机推荐

  1. Spring Cloud(一):服务注册中心Eureka

    Spring Cloud 基于 Netflix 的几个开源项目进行了封装,提供包括服务注册与发现(Eureka),智能路由(Zuul),熔断器(Hystrix),客户端负载均衡(Ribbon)等在内的 ...

  2. cogs 728. [网络流24题] 最小路径覆盖问题 匈牙利算法

    728. [网络流24题] 最小路径覆盖问题 ★★★☆   输入文件:path3.in   输出文件:path3.out   评测插件时间限制:1 s   内存限制:128 MB 算法实现题8-3 最 ...

  3. 通过ArcGIS将数据存储到SQL Server2012中

    一.软件安装: ARCGIS 10.3安装 SQLserver2012安装 ARCGIS 10.3 安装(注意ARCGIS10.3并不用安装配置ARCSDE). https://wenku.baidu ...

  4. dp-划分数 (递推)

    问题描述 : 有 n 个无区别的物品 , 将他们分成 不超过 m 堆, 问有多少种分法 ? 例如 : n = 4 , m = 3 , 则总共有的分法是 1 + 2 +1 , 0 + 1 + 3 , 0 ...

  5. Python判断一个字符串是否包含某个指定的字符串

    成员操作符 in str = "string test string test" find1 = "str" find2 = "test" ...

  6. nrm npm nvm

    1.nvm: node version manager node版本管理器 可以来回切换node.js版本号,而直接使用node的.msi安装则版本比较固定,无法实现node版本的自行切换nvm安装方 ...

  7. Docker学习(三)认识Docker和常用命令

    Docker学习(三)认识Docker和常用命令 Docker体系结构 docker服务端,作为服务的提供方,核心进程 docker daemon,所有docker命令都是通过这个进程完成的 REST ...

  8. robotframework,移动端(小程序)自动化,滚动屏幕的方法

    场景描述: 小程序端定位元素有无法定位弹出层内容的问题(自动化工具只能识别到背景主层,无法识别到弹出层) 解决思路: 1.弹出层元素与背景主层元素位置一致,当点击出弹出层时,在定位背景主层即可定位到弹 ...

  9. SpringBoot整合三大组建(Servlet、Listener、Filter)

    >[更多资源和教程请关注公众号:**非科班的科班**.如果觉得我写的还可以请给个赞,谢谢大家,你的鼓励是我创作的动力](https://blog.csdn.net/qq_43255017)## ...

  10. CORS解决跨域问题的几种方法

    一 后端服务器使用过滤器 新建过滤器: /** * 解决跨域 */ public class AccessControlAllowOriginFilter implements Filter { @O ...