functools 函数
partial 函数
partial函数(偏函数)
可以将一个函数的参数设为默认值,返回一个新函数,使调用更加简单、方便
import functools as f
def print_function(*args,**kwargs):#*args可以传递元组,**kwargs可以传递字典
print(*args)
print(**kwargs)
p1=f.partial(print_function,1,2,3)
p1()
p1(4,5,6)
c={'a':1,
'b':2}
p1(c)
p2=f.partial(print_function,c)
p2()
p2(1,2,3)
#输出
1 2 3
1 2 3 4 5 6
1 2 3 {'a': 1, 'b': 2}
{'a': 1, 'b': 2}
{'a': 1, 'b': 2} 1 2 3
wraps 函数
理解wraps函数,先理解装饰器和闭包的概念
闭包:
在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
def print_abc():
abc="hello world"
def printer():#嵌套函数
print(abc)
return printer
closure=print_abc()
closure()
#输出
hello world
当局部变量(abc)被函数引用时,这个局部变量将跟随函数而存在(正常情况下,局部变量只在局部存在)
装饰器:
python函数修饰符@的作用是为现有函数增加额外的功能,常用于插入日志、性能测试、事务处理等等。
创建函数修饰符的规则:
(1)修饰符是一个函数
(2)修饰符取被修饰函数为参数
(3)修饰符返回一个新函数
(4)修饰符维护被维护函数的签名
Python函数修饰符,“@”,与其说是修饰函数倒不如说是引用、调用它修饰的函数。
def test(func):
func()
print ("call test")
def test1(f):
f()
print ("call test1")
def main():
@test
def fun():
print ("call fun")
@test1
def fun1():
print ("call fun1")
main()
#输出
call fun
call fun1
call test1
call test
使用functools模块提供的修改函数属性的方法wraps,相当于属性的传递
def log(func):
@f.wraps(func)
def wrapper():
print('log开始 ...')
func()
print('log结束 ...')
return wrapper
@log
def test1():
print('test1 ..')
def test2():
print('test2 ..')
print(test1.__name__)
print(test2.__name__)
#输出
test1 #当把@f.wraps(func)注释掉后,结果为wrapper,test2
test2
前面是网上许多人对@f.wraps(func)的解释,但感觉总跟在另一个@func之后,没有单独应用,因此,我单独试验了@f.wraps(func)的作用
def abc():
"""这个函数是abc函数"""
print("abc")
@f.wraps(abc)
def log():
"""这个函数是log函数"""
print("log.........")
abc()
log()
print(abc.__name__)
print(log.__name__)
print(abc.__doc__)
print(log.__doc__)
#输出
abc
log.........
abc
abc
这个函数是abc函数
这个函数是abc函数
这个代码块说明了@f.wraps(func)将func函数的名字和doc属性都传递给了下面的函数
reduce()函数
reduce的用法
reduce(function, sequence[, initial]) -> value
:意思就是对sequence连续使用function, 如果不给出initial, 则第一次调用传递sequence的两个元素, 以后把前一次调用的结果和sequence的下一个元素传递给function. 如果给出initial, 则第一次传递initial和sequence的第一个元素给function.
返回值是一个复合函数
def add(x):
x = x + 1
return x
def mut(x):
x = 2 ** x
return x
a=f.reduce(lambda f,g:lambda *ar,**kw:g(f(*ar,**kw)),[mut,add,mut,add])
#输出
print(a(3))
513
lambda argument_list: expression:
lambda x, y: xy;函数输入是x和y,输出是它们的积xy
lambda:None;函数没有输入参数,输出是None
lambda *args: sum(args); 输入是任意个数的参数,输出是它们的和(隐性要求是输入参数必须能够进行加法运算)
lambda **kwargs: 1;输入是任意键值对参数,输出是1
update()函数
Python 字典(Dictionary) update() 函数把字典dict2的键/值对更新到dict里。
dict = {'Name': 'Zara', 'Age': 7}
dict2 = {'Sex': 'female' }
dict.update(dict2)
print (dict)
#输出
{'Name': 'Zara', 'Age': 7, 'Sex': 'female'}
假设有相同的键会直接替换成 update中字典的值: