Python3基础-函数2

高阶函数

原则

  • 函数接收的参数是一个函数

  • 函数的返回值是一个函数

示例

示例1:接收值是一个函数

def A():
    print("I am A")
    return
def B(x):
    print("I am B")
    return
B(A())
I am A
I am B

示例2:返回值是一个函数

def A():
    print("I am A")
    return
def B():
    return A()
B()
I am A

示例3:给函数增加功能

import time
def time_con(a):
    start_time = time.time()
    a()
    stop_time = time.time()
    print("这个函数运行的时间是%s" % (stop_time - start_time))
def test():
    time.sleep(3)
    print("I am test!!!")
time_con(test)
I am test!!!
这个函数运行的时间是3.000800848007202

函数嵌套

将某函数作为另一函数的参数使用,这一函数就是嵌套函数

示例

def a():
    print("函数第一层")
    def b():
        print("函数第二层")
        def c():
            print("函数第三层")
        c()
    b()
a()
函数第一层
函数第二层
函数第三层

闭包

  • 闭包是由函数和与其相关的引用环境组合而成的实体

  • 闭包有助于提高代码可复用性的作用

闭包,即一个完整的闭合函数

def test(x):                            #自定义函数
    a = "您输出的是:"                   #函数中封装的变量
    print(a,x)                          #函数体
    return x                            #返回值
test("测试字符")                        #运行函数
您输出的是: 测试字符                     #运行结果

函数变量作用域

  • L (Local) 局部作用域
  • E (Enclosing) 闭包函数外的函数中
  • G (Global) 全局作用域
  • B (Built-in) 内建作用域

原则

以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

示例

实例1

name = '小明'                 #定义变量
def foo():                    #定义函数
    name = '小花'                 #定义函数中内容
    def bar():                    #定义函数中子变量
        name = '小黄'                 #定义函数自变量内容
        print(name)                   #打印函数变量内容
    return bar()                  #返回定义的函数内容
foo()                        #运行函数
小黄

实例2

name = '第一层'
def foo():
    name = '第二层'
    def bar():
        name = '第三层'
        def tt():
            print(name)
        return tt
    return bar
foo()()()
第三层

装饰器

装饰器本质就是函数,功能是为其它函数附加功能

装饰器 = 高阶函数 + 函数嵌套 + 闭包

原则

  • 不修改被修饰函数的源代码
  • 不修改被修饰函数的调用方式

###演示

def 装饰器(a):
    def 装饰器内容(*args,**kwargs):
        print("装饰器附加内容1")
        原函数执行 = a(*args,**kwargs)
        print("装饰器附加内容2")
        return 原函数执行
    return 装饰器内容
@装饰器
def test(参数):
    print('这是原有函数内容和%s!!!' %参数)
    return ("原函数返回值")
print(test("测试参数"))

示例

原函数

def test():
    time.sleep(3)
    print('This is test!!!')
This is test!!!

用time模块建立装饰器后

import time                                                     #调用time模块儿
def time_func(a):                                               #定义变量用于接收函数参数
    def time_con(*args,**kwargs):                                   #定义装饰器用于变更函数输出
        start_time = time.time()                                    #记录运行开始时间
        res = a(*args,**kwargs)                                     #被调用的函数赋值
        stop_time = time.time()                                     #记录函数运行结束时间
        print("这个函数运行的时间是%s" %(stop_time - start_time))   #计算并打印记录时间
        return res                                                  #运行函数返回值
    return time_con                                                 #返回装饰器运行后值
@time_func                                                      #语法糖,相当于 test = time_func(test)
def test(a,b):                                                  #用于测试的自定义函数
    time.sleep(3)                                                   #延迟执行3秒(用于测试)
    print("这是个测试函数,第一个参数是%s第二个参数是%s" %(a,b))    #打印测试语句
    return ('【函数运行完毕】')                                     #函数返回值
print(test("【参数1】","【参数二】"))                           #执行装饰后的函数

猜你喜欢

转载自my.oschina.net/zhaojunhui/blog/1650308