廖雪峰Python笔记[4] - 函数式编程

目录

 

1. 高阶函数

2. 闭包

3. 匿名函数

4. 装饰器

5. 偏函数


1. 高阶函数

       在Python中函数本身是一个变量,它可以接受传入的参数,可以用另一个变量指向这个函数,这时候的变量同样也就可以接受传入的参数。高阶函数就是指一种特殊的函数,它接受函数本身作为参数传入。

print(abs)
print(abs(-2))

temp = abs
print(temp(-8))

def higherOrder(n,func):
    return func(n)

print(higherOrder(-83,abs))

       map和reduce是两种高阶函数,前者接受一个函数和一个Itearable对象,它的用处是将接收到的函数作用到Iterable对象的每一个元素上,然后返回一个Iterator对象,用list得到所有结果;后者也是传入一个函数和一个序列,但是它要求传入的函数必须接受两个参数,reduce的作用是将序列的前两个元素带入函数计算,然后将返回值继续与后面的序列元素计算。

def multi(x):
    return x * x

print(list(map(multi,[5,23,6,1,33,84])))

def add(a,b):
    return a + b

from functools import reduce
print(reduce(add,[14,2,5,1]))

      filter也是一种高阶函数,它同样接受一个函数和一个序列作为参数,返回Iterator对象。与上面的map和reduce不同的是它根据结果是True还是False决定是否将序列中的元素添加到结果中,也就是说filter实现的是对输入序列的筛选功能,接受的函数返回的是一个布尔值。

# 筛选序列中的奇数
def is_odd(x):
    return x % 2 == 1
print(list(filter(is_odd,[1,23,4,5,6])))

       下面要介绍的是排序函数sorted(),顾名思义它用于对序列进行排序,字符序列根据ASCII码大小来。sorted接受一个函数作为key,将这个函数作用到序列的每一个元素上产生一个新的序列,然后对这个新的序列排序,注意,返回的不是这个新的序列,而是新序列对应的原来的序列。

print(sorted(['a','B','w','x'])) #按ASCII排序
print(sorted(['a','B','w','x'],key=str.lower)) #忽略大小写
print(sorted(['a','B','w','x'],key=str.lower,reverse=True)) #倒序

2. 闭包

       一个函数还可以返回函数,这个返回的函数包括上下文,这样返回一个函数的函数机制叫做闭包。内部的函数可以使用外面传入的参数,可以用在现在还不需要计算结果,先传入要计算的参数,等之后再计算的情况。需要注意的是内部函数不能返回一个后面会变化的量;即使传入的参数相同,每次返回的函数也都是不同的。

def puff(*num):
    def sum():
        a = 0
        for i in num:
            a = a + i
        return a
    return sum
s = puff(2,5,1)
s()

3. 匿名函数

       匿名函数是一种只有一个表达式的函数,它不用定义函数名,直接返回表达式的结果,它也可以作为函数对象赋值给一个变量。使用匿名函数使代码更加简洁。

print(list(map(lambda x: x*x, [5,2,1,66])))

multi = lambda x: x*x
print(multi(4))

4. 装饰器

       装饰器也是一种函数,用在需要在运行函数的上下文执行一些操作的时候。它通过在需要进行的操作上下文再包裹一层函数实现,为了防止函数__name__改变,需要在wrapper外加functools.wraps(func)。装饰器通过@使用,如果需要传入参数,需要再在外包裹一层函数。

def time():
    print('2018/12/6')
    
f = time # 函数可赋值给变量
print(f.__name__) # 名称为函数名
print(f())

import functools

def deco(func):
    @functools.wraps(func) # 防止func的__name__变成wrapper
    def wrapper(*args,**kw): # 可以传入任意参数
        print("运行:",func.__name__)
        return func(*args,**kw)
    return wrapper

@deco #使用装饰器,相当于time=deco(time)
def time():
    print('这个函数')
    
print(time())

def pp(sb): # 装饰器本身需要传入参数时
    def deco(func):
        @functools.wraps(func) # 防止func的__name__变成wrapper
        def wrapper(*args,**kw):
            print(sb,'运行',func.__name__)
            return func(*args,**kw)
        return wrapper
    return deco

@pp('你') #相当于time=pp('你')(time)
def time():
    print('这个函数')
    
print(time())

# 练习:在函数运行前后打印log
def deco(func):
    @functools.wraps(func)
    def wrapper(*args,**kw):
        print('begin call')
        func(*args,**kw)
        print('end call')
    return wrapper

@deco
def time():
    print('ei')
    
time()

5. 偏函数

       偏函数用于需要将函数的某些参数固定的时候,比如int函数默认转换成十进制,可以修改成默认转换成二进制。

print(int('1000',base=8)) # base表示转换的进制,默认为10

import functools
int2 = functools.partial(int, base=2)
print(int2('1000'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值