为什么 要把匿名函数和functools模块写在一起?
因为 lamda函数和functools模块都是对函数一种增强或者是简化。
匿名函数:
为了解决那些功能很简单的需求而设计一次性的需求函数
#"有名函数" def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n:n**n print(calc(10))
函数名 = lambda 参数 :返回值 #参数可以有多个,用逗号隔开 #匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值 #返回值和正常的函数一样可以是任意数据类型
functools模块
偏函数partial
partial函数可以重新绑定函数的可选参数,生成一个callable的partial对象,这也认为是一个新函数(部分参数被固定的新函数)。
functools.
partial
(func[,*args][, **keywords])
Return a new partial
object which when called will behave like funccalled with the positional arguments args and keyword arguments keywords.
If more arguments are supplied to the call, they are appended to args. If additional keyword arguments are supplied, they extend and override keywords.
# /usr/bin/env Python3 # -*- encoding:UTF-8 -*- from functools import partial
def sum(*args): s = 0 for n in args: s = s + n return s sum_add_10 = partial(sum, 10) # 10 作用在sum第一个参数的位置 sum_add_10_20 = partial(sum, 10, 20) # 10 20 分别作用在sum第一个和第二个参数的位置 print('A____________我们看下原函数sum的函数地址入口:') print(sum)#<function sum at 0x000001C9761E2400> print('B______我们看下partial函数返回函数的地址入口:') print(partial(sum, 10))#functools.partial(<function sum at 0x000001C9761E2400>, 10) print(sum_add_10(1, 2, 3, 4, 5)) # --> 10 + 1 + 2 + 3 + 4 + 5 = 25
有几点要注意的:
绑定参数按顺序不能跳跃。所以也不怎么好用。
reduce函数
和内置函数reduce一样,据说是为了兼容性。
reduce的工作过程是 :在迭代sequence(tuple ,list ,dictionary, string等可迭代物)的过程中,首先把 前两个元素传给 函数参数,函数加工后,然后把得到的结果和第三个元素作为两个参数传给函数参数, 函数加工后得到的结果又和第四个元素作为两个参数传给函数参数,依次类推。 如果传入了 initial 值, 那么首先传的就不是 sequence 的第一个和第二个元素,而是 initial值和 第一个元素。经过这样的累计计算之后合并序列到一个单一返回值
from functools import reduce result = reduce(lambda x, y: str(x) + "" + str(y), [1, 2, 3, 4, 5]) print(result)
((((1+2)+3)+4)+5)
要想尝试其他玩法参考博客:https://www.cnblogs.com/lonkiss/p/understanding-python-reduce-function.html