Python3学习笔记09——匿名函数lamdba

关键字lambda表示匿名函数,冒号前面,面的x表示函数参数。

匿名函数有个限制,就是只能由一个表达式,不用写return,返回值就是该表达式的结果。

匿名函数有个好处,因为函数没有名字,不必担心函数名称冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:

f=lambda x:x*x
print(f)
print(f(5))

输出结果:

25

同样,也可以把匿名函数作为返回值返回,比如:

def build(x,y):
    return lambda:x*x+y*y
print(build(2,3))
print(build(2,3)())

输出结果为:

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本身就是一个模块,它的名字就是包的名字。

你可能感兴趣的:(python基础)