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