Python13函数式编程: 匿名函数、高阶函数、装饰器

Q:匿名函数

A:

what

在C#叫lambda表达式

how
#定义匿名函数需要一个关键字lambda
lambda 变量名1,变量名2: 变量表达式(且只能是表达式)
#调用
f = lambda 变量名1,变量名2: 变量表达式
f(a,b)
how much

三元表达式
x,y比大小,输出较大的
#其它语言: x > y ? x : y
python表达式
x if x > y else y

Q:map函数

A:

what

把集合里的所有元素,映射到新的集合里

why

更加精简和优美

where

和lambda表达式一起使用

how

一般应用

#等同于运行了一次for循环
定义列表1
定义函数1
a = map(函数1, 列表1)
#输出新的列表
print(list(a))

见举例1

map和lambda表达式一起使用

定义列表1
a = map(lambda表达式, 列表1)
#输出新的列表
print(list(a))

见举例2

map传入多个参数

#map传入的列表数和lambda表达式的参数数量要一致
#两个列表如果个数如果不同,会以少的为主计算
定义列表1
定义列表2
a = map(lambda表达式, 列表1, 列表2)
#输出新的列表
print(list(a))

见举例3

how much

举例1:一般应用

list_x = [1, 2, 3, 4, 5, 6, 7, 8]

def square(x):
    return x * x
#常规方法
for x in list_x
    square(x)
#使用map函数
r = map(square, list_x)
print(list(r))

输出
[1, 4, 9, 16, 25, 36, 49, 64]

举例2:map和lambda表达式一起使用

list_x = [1, 2, 3, 4, 5, 6, 7, 8]
r = map(lambda x: x * x, list_x)
print(list(r))

输出
[1, 4, 9, 16, 25, 36, 49, 64]

举例3:map传入两个参数

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))

输出
[2, 6, 12, 20, 30, 42, 56, 72]

Q:reduce

A:

what

做连续运算连续调用lambda表达式

how
#首先导入functools
from functools import reduce
定义列表1
#reduce导入的lambda表达式一定要有两个参数,之传入一个列表
reduce(lambda x, y:变量表达式, 列表1, 可以设置一个初始值)

得到的结果不是一个列表,是一个连续运算

how much

举例1:一般应用

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

举例2:初始值与字符串

from functools import reduce

list_x = ['1', '2', '3', '4', '5', '6', '7', '8']
#实际上是一个求和公式
r = reduce(lambda x, y: x + y, list_x, 'aaa')
print(r)

输出
‘aaa12345678’

Q:filter函数

A:

what

过滤作用

how
定义列表1
#要求lambda表达式的结果一定是一个真和假的值
a = filter(lambda表达式, 列表1)
#输出新的列表
print(list(a))
how much

举例:一般应用

list_x = [1, 0, 1, 0, 0, 1]

r = filter(lambda x: True if x==1 else False, list_x)
print(list(r))

输出
[1, 1, 1]

命令式编程和函数式编程
命令式编程:def if else for
函数式编程:map reduce filter lambda(算子)

Q:装饰器

A:

how
#装饰器的定义
def decorator(func):
    def wrapper():
        func()
    return wrapper
#调用
f = decorator(需要导入的函数)

见举例1

#装饰器的使用方法@
def decorator(func):
    def wrapper():
        func()
    return wrapper
#调用
@decorator
定义需要导入的函数def。。。
实例化导入的函数

见举例2

'''
装饰器,函数带可变参数(完整形式)
装饰器的使用方法@
args/kw可以改别的名字
在函数里的**kw可以用字典形式,导入多个参数
'''
def decorator(func):
    def wrapper(*args, **kw):
        func(*args, **kw)
    return wrapper
#调用
@decorator
def f1(参数)
    print(参数运算)
实例化导入的函数

见举例3

how much

对修改是封闭的,对扩展是开放的
定义可以复杂,但调用不能复杂

举例1:装饰器的定义
不用装饰器的情况

import time

def f1():
    print(time.time())
    print('123')

f1()

或者

import time

def f1():
    print('123')

def f2(func):
    print(time.time())
    func()

f2(f1)

使用装饰器的方法

import time

def decorator(func):
    def wrapper():
        print(time.time())
        func()
    return wrapper

def f1():
    print('123')

f = decorator(f1)
f()

举例2:装饰器的使用方法

import time

def decorator(func):
    def wrapper():
        print(time.time())
        func()
    return wrapper

@decorator
def f1():
    print('123')

f1()

举例3:装饰器的可变参数

import time

def decorator(func):
    def wrapper(*args, **kw): 
        print(time.time())
        func(*args, **kw)
    return wrapper

@decorator
def f1(a):
    print(a)

f1('123')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值