压力最大的时候,效率可能最高;最忙碌的时候,学的东西可能最多;最惬意的时候,往往是失败的开始;寒冷到了极致,太阳就要光临。成长不是靠时间,而是靠勤奋;时间不是靠虚度,而是靠利用;感情不是靠缘分,而是靠珍惜;金钱不是靠积攒,而是靠投资;事业不是靠满足,而是靠踏实。
1.函数神器:functools模块全解析
functools 模块提供用于调整或扩展函数和其他可调用对象的工具,而无需完全重写它们。
reduce函数
reduce函数会对参数序列中元素进行累积。reduce函数将一个可迭代对象中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
Python2里reduce是内置函数,python3里需要通过functools库导入。
语法:
reduce(function, iterable)
案例:
from functools import reduce
reduce(lambda x, y: x+y, [1,2,3,4,5])
Result:15
reduce(lambda x, y: x * y, range(1, 6))
Result:120
我们也可以写一个自己的reduce函数,如下:
#构建自己的reduce函数:
def myreduce(fn,seq):
start = seq[0]
for i in seq[1:]:
start = fn(start,i)
return start
# reduce源码
from functools import reduce
def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
value = next(it)
else:
value = initializer
for element in it:
value = function(value, element)
return value
reduce(lambda value,x: value + x,range(5), 10)
-----------------------------------------------------
20
偏函数
functools模块partial方法:
偏函数:把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成一个新的函数并返回; 从partial生成新的函数,是对原函数的封装;在标准库里大量使用;
偏函数 把多参数函数变成单参的,单参函数就可以当无参装饰器使用了:
from functools import partial
square = partial(power, exponent=2)
print(square(2))
--------------------------
4
范例1:
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*args, *fargs, **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
def add(x,y):
pass
add(4,5) #y=5
newadd = partial(add,5)
newadd(4)
范例2:
from functools import partial
import inspect
def add(x,y):
return x+y
add(4,5)
newadd = partial(add,4)
print(inspect.signature(newadd))
print(newadd(5))
newadd = partial(add,5)
print(inspect.signature(newadd)) # 函数签名
print(newadd(4))
newadd = partial(add,x=4,y=5)
print(inspect.signature(newadd))
print(newadd())
newadd = partial(add,x=4,y=5)
print(inspect.signature(newadd))
print(newadd(x=10,y=11))
newadd = partial(add,x=4)
print(newadd(5,6))
------------------------------------
(y)
9
(y)
9
(*, x=4, y=5)
9
(*, x=4, y=5)
21
TypeError Traceback (most recent call last)
<ipython-input-20-a5ea786a8bd0> in <module>
22
23 newadd = partial(add,x=4)
---> 24 print(newadd(5,6))
TypeError: add() got multiple values for argument 'x'
网友评论