@SuHongjun
2021-10-09T05:07:31.000000Z
字数 1166
阅读 265
Python
>>> int('12345')
12345
>>> int('12345', base=8)
5349
>>> int('12345', 16)
74565
假设要转换大量的二进制字符串,每次都传入int(x, base=2)非常麻烦,于是,我们可以定义一个int2()的函数,默认把base=2传进去:
def int2(x, base=2):
return int(x, base)
这样,我们转换二进制就非常方便了:
>>> int2('1000000')
64
>>> int2('1010101')
85
用functools.partial可以直接使用下面的代码创建一个新的函数int2:
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85
简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
装饰器Decorator:本质上是一个返回函数的高阶函数,可以在不修改原函数定义的前提下,在代码运行期间动态修改原函数的功能。
假设有一个函数now():
>>> def now():
... print('2020-3-25')
...
>>> f = now
>>> f()
2020-3-25
我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,可以定义如下:
def log(func): #log()接受一个函数作为参数,并返回一个函数。
def wrapper(*args, **kw):
print('call %s():' % func.__name__) #函数对象有一个__name__属性,可以拿到函数的名字
return func(*args, **kw)
return wrapper
@log #用log装饰now(),这是一个语法糖
def now():
print('2020-3-25')
经过装饰以后,再运行now():
>>> now()
call now():
2020-3-25
把@log放到now()函数的定义处,相当于执行了语句:now = log(now)
,是一个语法糖
由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。
wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。