一.匿名函数

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. Java 成员变量与局部变量

    成员变量与局部变量的区别 什么是局部变量.什么是成员变量: 局部变量:在方法内部的变量 形参:在方法签名中定义的变量. 方法局部变量:在方法内部定义的变量. 代码块局部变量:在代码块内定义的变量. 成 ...

  2. 一个按键搞定日常git操作

    Git is a free and open source distributed version control system designed to handle everything from ...

  3. 异数OS TCP协议栈测试(三)--长连接篇

    异数OS TCP协议栈测试(三)--长连接篇 本文来自异数OS社区 github:   异数OS-织梦师(消息中间件)群: 476260389 异数OS TCP长连接技术简介 说起长连接,则首先要谈对 ...

  4. 基于javaSwing的贪食蛇游戏

    这个项目时,是我好几年前写的了.但对刚入门,或者想瞧瞧java的图形的界面swing的同学,还是有点用处的. 在这推荐给你. 涉及技术点 swing,多线程,文件读写,多媒体文件播放等 游戏简介 该游 ...

  5. 【Java并发基础】Java线程的生命周期

    前言 线程是操作系统中的一个概念,支持多线程的语言都是对OS中的线程进行了封装.要学好线程,就要搞清除它的生命周期,也就是生命周期各个节点的状态转换机制.不同的开发语言对操作系统中的线程进行了不同的封 ...

  6. atx测试框架实现手机应用UI自动化测试

    最近工作中遇到游戏APP需要实现UI自动化测试,这个app中真的是典型的混合App,有Android原生控件,有webview控件,以及游戏操作页面.研究了Appium,发现appium实现跨应用操作 ...

  7. Basic Thought / Data Structure: 差分 Difference

    Intro: 作为查询界的\(O(1)\)王者--前缀和的亲兄弟,差分,他可是修改界的\(O(1)\)王者 Prerequisite knowledge: 前缀和 Function: 仅单次询问的区间 ...

  8. 2020.2,《The day after tomorrow》

    “The day after tomorrow, where will you be?” 2020春节冠状病毒肆虐被迫禁足家里,无意间打开了2004年由德国罗兰·艾默里奇(Roland Emmeric ...

  9. FLASK 三剑客 request jinjia2

    Flask Web 框架Django 15 优势 : 组件全 - admin - Model ORM - Forms 教科书式 劣势 : 加载所有组件 - 占用资源较高 重型框架 Flask 3 优势 ...

  10. java单例五种实现模式梳理

    java单例五种实现模式 饿汉式(线程安全,调用效率高,但是不能延时加载) 一上来就把单例对象创建出来了,要用的时候直接返回即可,这种可以说是单例模式中最简单的一种实现方式.但是问题也比较明显.单例在 ...