会员可以在此提问,百战未来老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 135014个问题

'''
闭包的特殊功能:
    1.可以在不修改现有源码的前提下,增加新的功能
    日志功能(统计访问时间,访问功能写道日志文件中),权限验证(下载之前,验证当前用户是否为会员)

开闭原则:
    开放:开放功能
    关闭:修改源码
'''
import time
#定义一个记录日志的函数:将访问时间以及访问的函数名写入到文件中(log.txt)
def writelog(func):
    try:
        file = open('log.txt','a',encoding='utf-8')
        #写入相关数据信息(访问的函数名,访问的时间)
        file.write(func.__name__)
        file.write("\t")#制表符
        #写入访问时间
        file.write(time.asctime())
        file.write("\n")#换行符
    except Exception as e:
        print(e.args)
    finally:
        #关闭文件
        file.close()

#闭包
def funcout(func):
    def funcin():
        #新增功能
        writelog(func)
        func()
    return funcin

def func1():
    print("我是功能1")
def func2():
   print("我是功能2")

#闭包的调用
func1 = funcout(func1)
func2 = funcout(func2)

func1()
func2()

GIF 2021-3-7 15-43-06.gif

老师,我想请问一下原来的def func1()这个函数它怎么就是下面的func1 = funcout(func1)这两个func1为啥是同一个呢?下面这个不是上面闭包函数里面的参数嘛?

Python全系列/第四阶段:函数式编程和核心特性/生成器和装饰器 406楼
Python全系列/第四阶段:函数式编程和核心特性/正则表达式 411楼

老师,代码运行报错显示是类型错误,但我愣是不知道怎么修改,老师这种情况下代码应该怎么修改呢

代码如下:

import math
# 求两个点之间的距离
def getDis(x1,y1,x2,y2):
    return math.sqrt((x1-x2)**2 + (y1-y2)**2) # 开平方跟
# 使用闭包求距离
def getDisOut(x1,y1):
    def getDisIn(x2,y2):
        return math.sqrt((x1 - x2) ** 2(y1 - y2) ** 2)  # 开平方跟
    return getDisOut

# 求点(10,10),(20,20)距离原点(0,0)的距离
# 使用传统函数实现该功能
dis = getDis(0,0,10,10)
print('(10,10)距离原点的距离为:%g'%dis)
dis = getDis(0,0,20,20)
print('(20,20)距离原点的距离为:%g'%dis)
print('——'*2)
# 闭包的外部函数不会随着函数的消失而消失
# 调用闭包
# 使用闭包时候不用每次都写初始化数值,直接绑定以供多次使用
getDisIn = getDisOut(0,0)    # 注意外部函数的变量值不会随内部函数的停止而释放,会一直保持
dis1 = getDisIn(10, 10)
print('(10,10)距离原点的距离为:%g'%dis1)
dis1 = getDisIn(20, 20)
print('(20,20)距离原点的距离为:%g'%dis1)



报错代码如下
Traceback (most recent call last):
  File "C:/pycharm_project/four_period_project/生成器/05使用闭包完成求两点之间的距离.py", line 36, in <module>
    print('(10,10)距离原点的距离为:%g'% dis1)
TypeError: must be real number, not function
(10,10)距离原点的距离为:14.1421
(20,20)距离原点的距离为:28.2843
————

Process finished with exit code 1

Python全系列/第四阶段:函数式编程和核心特性/生成器和装饰器 412楼
Python全系列/第四阶段:函数式编程和核心特性/内存管理(旧) 413楼
Python全系列/第四阶段:函数式编程和核心特性/生成器和装饰器 420楼

课程分类

百战未来微信公众号

百战未来微信小程序

©2014-2026百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637