上一篇
本次分享函数第二篇
正文
之前,我们去分享了函数的基本概念,基本定义,并且写了一些简单的函数。这次继续分享函数。
Python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 只是一个表达式,函数体比 def 简单很多。
lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
那么如何来实现呢,代码的语法
lambda 函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
实现
x= lambda a:a*100
print(x(100))
结果:
我们去实现,传递两个参数,最后返回两个参数的和
b=lambda a,b :a+b
print(b(100,200))
结果:
我们可以吧匿名函数封装到一个方法中,这样可以创建多的匿名 得函数
def myfun(n):
return lambda a:a*n
mydoubler = myfun(2)
mytripler = myfun(3)
print(mydoubler(112))
print(mytripler(113))
结果:
匿名函数也可以使用关键字参数进行传递
f= lambda b,c:b+c
print(f(1,2))
print(f(b=1,c=2))
结果:
上面呢,是匿名函数,接下来,去看下变量的作用域
变量的访问以 L(Local) –> E(Enclosing) –> G(Global) –>B(Built-in) 的规则查找,
即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
演示下:
1. 局部作用域
x = int(3.3)
x = 0
def outer():
x = 1
def inner():
x = 2
print(x)
inner()
outer()
结果:
为什么打印2呢,是因为直接在inner中找到了变量x
2.闭包函数外的函数中
x = int(3.3)
x = 0
def outer():
x = 10
def inner():
I=100
print(x)
inner()
outer()
执行结果
因为在内部函数 inner 中找不到变量 x,继续去局部外的局部——函数 outer 中找,这时找到了,输出 10。
3.全局作用域
x = int(3.4)
x = 0
def outer():
def inner():
I=100
print(x)
inner()
outer()
结果
在局部(inner函数)、局部的局部(outer函数)都没找到变量 x,于是访问全局变量,此时找到了并输出。
4. 内建作用域
x = int(300)
g = 101
def outer():
o = 1
def inner():
i = 2
print(x)
inner()
outer()
执行结果
在局部(inner函数)、局部的局部(outer函数)以及全局变量中都没有找到变量x,于是访问内建变量,此时找到了并输出。
上面是作用域,下面来分享下如何获取参数的说明文档
def fun():
'''
这是一个函数
:return:
'''
pass
print(fun.__doc__)
结果:
装饰器:
装饰器的作用是不改变当前函数的情况下 ,增加一些功能,那么如何去实现呢
实现一个
def log(pr):#将被装饰函数传入
def wrapper():
print("**********")
return pr()#执行被装饰的函数
return wrapper#返回函数的名称
@log
def prt():
print("这里是北京")
prt()
结果:
装饰器呢,其实是一个特殊的函数。在自动化或开发中,有比较好的作用。
形参和实参
对于函数来说,形式参数简称形参,是指在定义函数时,定义的一个变量名。
def name(age):
print(age)
其实这里的age就是形参。
那么什么是实参呢
name(1)
其中1就是实参。实参就是调用函数的时候,实际传递的参数。
在Python的新版本中,我们可以定义函数的传递的类型和函数返回的类型,我们看下如何去定义
实现:
def name(age:int)->bool:
print(age)
return False
print(name(1))
含义:age是一个int方法,返回的是一个bool类型。
打印
如果我们在编写中传递的类型不对,或者返回的不对,可以看到,编辑器会给我们提示的
而正确输入没有提示:
看下上面的传递A,打印的结果
可以看到,我们传递的类型是错误的,这样,在定义函数的时候,就可以去定义函数的参数的类型,和返回的类型。