Python学习--[进阶]函数
Posted 木九九
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习--[进阶]函数相关的知识,希望对你有一定的参考价值。
- 闭包
Python的函数时可以嵌套的,可以将一个函数放在另外一个里面。
def multiplier(factor): def multiplyByFactor(number): return number*factor return multiplyByFactor
调用multiplier()时,返回的是里层函数,也就是说函数本身被返回了,但并没有被调用。重要的是返回的函数还可以访问它的定义所在的作用域。
在一个外函数中定义了一个内函数,内函数运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包。如果外函数在结束的时候发现自己的临时变量将来会在内函数中用到,就会把这个临时变量绑定给了内部函数,然后自己再结束。
使用闭包的过程中,一旦外函数被调用了一次返回内函数的引用,虽然每次调用内函数是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量。
可以来看一个例子:
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count()
在这个例子里,每次循环,都会创建一个新的函数,然后把函数名放到列表fs里,并没有调用函数f,也就是说不会进行内部计算。最后把三个函数都返回。这里要注意的是,外函数变量fs,i都是只有一份的,所以循环了3次以后,i就变成了3。所以最后我们发现调用f1(),f2(),f3()返回的结果都是9。
>>> f1() 9 >>> f2() 9 >>> f3() 9
- 匿名函数
lambda作为表达式,定义了一个匿名函数。比如:lambda x: x+1。实际上是定义了一个函数,和下面的效果一样。
def fun(x) return(x+1)
- 装饰器
在Python里函数也是一个对象,函数对象有一个__name__属性,可以拿到函数的名字:
>>> def name(): ... print ‘Tom‘ ... >>> name.__name__ ‘name‘
如果想要增强name()函数的功能,但是又不希望修改name()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”。
装饰器就是一个返回函数的高阶函数,比如定义一个打印日志的装饰器:
def log(func): def wrapper(*args, **kw): print ‘call %s():‘ % func.__name__ return func(*args, **kw) return wrapper
log是一个装饰器,接受一个函数作为参数,并返回一个函数。所以我们使用装饰器时,就需要用@语法:
@log def name(): print ‘Tom‘
多以现在调用name(),相当于执行了name = log(name),然后再执行name()。
- 偏函数
Python的functools模块提供了片函数的功能。
比如int()函数可以把字符串转换为整数,也可以传入base参数,设置转换的进制。比如int(‘1234’,base = 8)。如果要转换大量的八进制字符串,每次都要传入进制参数,于是可以:
def int8(x,base = 8) return int(x,base)
我们也可以使用片函数实现相同的效果,也就是:
int8 = functools.partial(int, base=2)
以上是关于Python学习--[进阶]函数的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情
系统进阶学习python,爬虫,网页设计,正则表达式(附源代码)
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段