关键字lambda表示匿名函数,冒号前面,面的x表示函数参数。
匿名函数有个限制,就是只能由一个表达式,不用写return,返回值就是该表达式的结果。
匿名函数有个好处,因为函数没有名字,不必担心函数名称冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
f=lambda x:x*x
print(f)
print(f(5))
输出结果:
<function at 0x0000029D0F37C8C8>
25
同样,也可以把匿名函数作为返回值返回,比如:
def build(x,y):
return lambda:x*x+y*y
print(build(2,3))
print(build(2,3)())
输出结果为:
<function build.. at 0x00000220EE669A60>
13
Python对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数。
由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。
def now():
print('2019/3/11')
d=now
print(d())
运行结果:
2019/3/11
None
函数对象有一个__name__属性,可以拿到函数的名字:(双下划线)
print(now.name)
print(d.name)
运行结果:
now
now
现在假设我们要增强now()函数的功能,比如,在函数嗲用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
本质上,decorator就是一个返回函数的高阶函数。所以,我们要定义一个能打印日志的decorator,可以定义如下:
#在函数调用前后自动打印日期,但又不修改now()函数的定义,即‘装饰器’
def log(func):
def wrapper(*args,**kw):
print('call%s():'% func.__name__)
return func(*args,**kw)
return wrapper
@log #把@log放到now()函数的定义处,相当于执行了语句now=log(now)
def now():
print('2019/3/11')
print(now())
运行结果:
callnow():
2019/3/11
None
为了编写可维护的代码,我们把很多函数分组,分别放在不同的文件里,这样每个文件包含的代码就相对较少,很多编码语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,成为包)Package)。
请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录等成普通目录,而不是一个包。init.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,它的名字就是包的名字。