[关闭]
@SuHongjun 2021-10-09T05:07:31.000000Z 字数 1166 阅读 265

Python-Day 1X:函数--高级知识1(未完成)

Python

偏函数

  1. >>> int('12345')
  2. 12345
  3. >>> int('12345', base=8)
  4. 5349
  5. >>> int('12345', 16)
  6. 74565

假设要转换大量的二进制字符串,每次都传入int(x, base=2)非常麻烦,于是,我们可以定义一个int2()的函数,默认把base=2传进去:

  1. def int2(x, base=2):
  2. return int(x, base)

这样,我们转换二进制就非常方便了:

  1. >>> int2('1000000')
  2. 64
  3. >>> int2('1010101')
  4. 85

用functools.partial可以直接使用下面的代码创建一个新的函数int2:

  1. >>> import functools
  2. >>> int2 = functools.partial(int, base=2)
  3. >>> int2('1000000')
  4. 64
  5. >>> int2('1010101')
  6. 85

简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

装饰器

装饰器Decorator:本质上是一个返回函数的高阶函数,可以在不修改原函数定义的前提下,在代码运行期间动态修改原函数的功能。

假设有一个函数now():

  1. >>> def now():
  2. ... print('2020-3-25')
  3. ...
  4. >>> f = now
  5. >>> f()
  6. 2020-3-25

我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,可以定义如下:

  1. def log(func): #log()接受一个函数作为参数,并返回一个函数。
  2. def wrapper(*args, **kw):
  3. print('call %s():' % func.__name__) #函数对象有一个__name__属性,可以拿到函数的名字
  4. return func(*args, **kw)
  5. return wrapper
  6. @log #用log装饰now(),这是一个语法糖
  7. def now():
  8. print('2020-3-25')

经过装饰以后,再运行now():

  1. >>> now()
  2. call now():
  3. 2020-3-25

把@log放到now()函数的定义处,相当于执行了语句:now = log(now),是一个语法糖
由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。
wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注