一.匿名函数

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. qiniuLive 连麦流程介绍

    本文出自APICloud官方论坛 qiniuLive 封装了七牛直播云服务平台的移动端开放 SDK.该模块包括视频流采集和视频流播放两部分 iOS连麦流程图: Android连麦流程图: 以下部分代码 ...

  2. 一文搞定Spring Boot + Vue 项目在Linux Mysql环境的部署(强烈建议收藏)

    本文介绍Spring Boot.Vue .Vue Element编写的项目,在Linux下的部署,系统采用Mysql数据库.按照本文进行项目部署,不迷路. 1. 前言 典型的软件开发,经过" ...

  3. wannafly camp day1

    题目描述: 恬恬的生日临近了.宇扬给她准备了一个大 蛋糕. 正如往常一样,宇扬在蛋糕上插了nnn支蜡烛,并把蛋糕分为mmm个区域.因为某种原因,他必须把第iii根蜡烛插在第aia\_iai​个区域或第 ...

  4. Lambda表达式(lambda expression)⭐⭐⭐⭐⭐

    原作者 lambda表达式(lambda expression)实际上是匿名函数一种表示形式, 即没有函数名的函数:参数列表=>表达式或语句块,在我看来主要目是为了简化代码编写,提高代码可读性而 ...

  5. MySQL——DOS命令

    翻开之前的笔记发现有这么一篇,于是整理了一下发出来加深记忆并分享交流,欢迎纠错,谢谢!!! 1.启动MySQL服务: net start mysql; 2.停止MySQL服务: net stop my ...

  6. Java入门 - 语言基础 - 05.基本数据类型

    原文地址:http://www.work100.net/training/java-basic-datatype.html 更多教程:光束云 - 免费课程 基本数据类型 序号 文内章节 视频 1 概述 ...

  7. Java入门 - 语言基础 - 22.异常处理

    原文地址:http://www.work100.net/training/java-exception.html 更多教程:光束云 - 免费课程 异常处理 序号 文内章节 视频 1 概述 2 Exce ...

  8. [bzoj4825] [loj#2018] [Hnoi2017] 单旋

    Description \(H\) 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(\(splay\))是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构 ...

  9. 【VBA】EXCEL通过VBA生成SQL,自动生成创建表结构SQL

    原文:https://blog.csdn.net/zutsoft/article/details/45441343 编程往往与数据库密不可分,一个项目往往有很多的表,很多时候通过excel来维护表结构 ...

  10. vuex 基本语法

    VUEX 的核心概念 1 .State (常用):2.Getters :3.Mutations(常用):4.Actions :5.Modules: 1.State是唯一的数据源,单一的状态树 cons ...