python(三)高级函数,装饰器,偏函数

# -*- coding: utf-8 -*-
#高阶函数英文叫Higher-order function
from functools import reduce

print(abs)
f=abs
print(f(-10))
print(abs(-10))
#传入函数
def add(x,y,f):
    return f(x)+f(y)
print(add(-5,6,abs))

#map()和reduce()函数
#map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,
# 并把结果作为新的Iterator返回
def f(x):
    return x*x
r=map(f,[1,2,3,4,5])
print(list(r))
print(iter('abcdef'))

def fn(x, y):
    return x * 10 + y
print(reduce(fn, [1, 3, 5, 7, 9]))

#filter()函数用于过滤序列。
#和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,
# 然后根据返回值是True还是False决定保留还是丢弃该元素
#过滤空字符串
def not_empty(s):
    return s and s.strip()
print(list(filter(not_empty, ['A', '', 'B', None, 'C', '  '])))
#filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list

#sort函数
print(sorted(['bob', 'about', 'Zoo', 'Credit'],key=str.lower, reverse=True))

#返回函数
def calc_sum(*args):
    ax = 0
    for n in args:
        ax = ax + n
    return ax
print(calc_sum(1,2,3))

def lazy_sum(*args):
    def sum():
        ax=0
        for n in args:
            ax=ax+n
        return ax
    return sum

f=lazy_sum(1,2,3,4)
print(f)
print(f())

print(list(range(10)))

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())

def count():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
    return fs

f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())

#匿名函数
list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

f=lambda x:x*x
print(f(2))

装饰器

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

@log
def now():
    print('2015-3-25')
# f = now
# f()
now()

# 装饰器Decorator: now()函数的定义,这种在代码运行期间动态增加功能的方式
# decorator就是一个返回函数的高阶函数
# 把@log放到now()函数的定义处 相当于执行语句 now = log(now)

def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator
@log('execute')
def now():
    print('2019-01-03')
#now = log('execute')(now)
now()

#functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2()
int2 = functools.partial(int, base=2)
发布了296 篇原创文章 · 获赞 70 · 访问量 55万+

猜你喜欢

转载自blog.csdn.net/feicongcong/article/details/85717745