Python之函数式编程: 匿名函数、高阶函数、装饰器(九)

一.匿名函数

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)

#2

三元表达式在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)

#36

运算过程:初始取前两位,之后将计算结果作为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('123','234')

f3('123','234',a = 1, b = 2,c = '123')



#1532408656.565761

#This is a function namedtest_func

#1532408656.5667255

#123234

#1532408656.5677273

#123234

#{'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)这个形式,无论什么方式都可以调用。

装饰器 六

  • 如果想对某个封装单元修改,可以加上装饰器。
  • 不需要破坏代码实现,易于代码复用。
  • 一个函数能够有多个装饰器。
  • 需要验证身份的函数上加上专门的装饰器之类的用途。



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值