* 待整理
高阶函数
y = g(f(x))
#容器可以比较内容
#返回是函数的时候内容比不了,比的是地址
for 循环正常执行后才执行else
break和return,for循环不能正常执行
'A'.lower()
str.lower ('A')=>str.lower(self)
sorted() #函数
filter(function,iterable)
#function,一个函数条件过滤
#过滤可迭代对象的元素,返回一个迭代器
list(filter(lambda x):False,[1,2,3,4])) #列表解析式
map(function,*iterables)-->map object #映射
#从一种形态到另一种形态,元素个数不会发生任何变化,一个都不能少
#返回的也是迭代器
{i for i in map(lambda x :x,range(5)}
set(map(lambda x :x,range(5))
dict(map(lambda x:(x%5,x),range(500))) #dict会覆盖key只有五项
zip() #也是一个惰性求值的
---------------------------------------------------------------------------------------------------------------------------
柯里化
f(x,y) => f(x)(y)
通过嵌套嵌套函数把函数转换成柯里化函数
---------------------------------------------------------------------------------------------------------------------------
python装饰器
硬编码:写死的要在函数里更改才能改功能
函数名.__name__
函数名.__doc__ #文档字符串要求写到文档函数的第一行
装饰器语法功能
它能将它下面的函数标识符提上来作为它的参数
@函数名
def 函数名
例:
@copy_properties #copy_properties(wrapper)
def wrapper
同时会为这个标识符赋值这个函数的返回值
wrapper = copy_properties(wrapper)
无参装饰器 #带缺省值的可以当无参装饰器
它是一个函数
函数作为它的形参
返回值也是一个函数
使用:@函数名方式调用
装饰器是高阶函数,装饰器对传入函数的功能增强
带参装饰器
它是一个函数
函数作为它的形参
返回值是一个不带参的装饰器函数
使用@functionname(参数列表)方式调用
可以看做在装饰器外层又加了一层函数
带参装饰器#最多三层
偏函数
---------------------------------------------------------------------------------------------------------------------------
#无参装饰器
def logger(fn):
def wrapper(*args,**kwargs):
print('{}.x={},y={}'.format(fn.__name__,*args))
ret = fn(*args,**kwargs)
return ret
return wrapper
@logger##等价于add = logger(add) =>add 就是wrapper
def add(x,y):
return x+y
#def sub(x,y):
# return x -y
ret = add(4,5)#wrapper(4,5) logger(add)
# ret = sub(5,4)
print(ret)
---------------------------------------------------------------------------------------------------------------------------
#带参装饰器
from datetime import datetime
def copy_properties(src):
def _copy(dest):
dest.__name__ = src.__name__
dest.__doc__ = src.__name__
return dest
return _copy
def logger(fn):
@copy_properties(fn) # 不加参数时等价于 @copy_properties => wrapper = copy_properties(wrapper)
#加参数后等价于wrapper = copy_properties(fn)(wrapper)
#wrapper = _copy(wrapper)#调用fn等价于返回_copy(跟下面的标识符)
#wrapper = wrapper #最后wrapper覆盖wrapper
def wrapper(*args,**kwargs):
'''this is wrapper function'''
print('前面增强')
start = datetime.now()
ret = fn(*args,**kwargs)
delta = (datetime.now()-start).total_seconds()
print('Function{} took{}s'.format(fn.__name__,delta))
print('name={}.x={},y={}'.format(fn.__name__,*args))
if delta >5:
print('so slow')
else:
print('so fast')
print('后面增强')
return ret
#copy_properties(fn)(wrapper)
return wrapper
@logger
def add(x,y):
'''this is add function'''
return x+y
ret = add(4,5)
print(ret)