zl程序教程

您现在的位置是:首页 >  Python

当前栏目

【测试开发】python系列教程:函数(二)

2023-02-18 16:48:45 时间

上一篇

【测试开发】python系列教程:函数

本次分享函数第二篇


正文

之前,我们去分享了函数的基本概念,基本定义,并且写了一些简单的函数。这次继续分享函数。

匿名函数

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,打印的结果

可以看到,我们传递的类型是错误的,这样,在定义函数的时候,就可以去定义函数的参数的类型,和返回的类型。