博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python全栈开发 * 11知识点汇总 * 1806011
阅读量:7073 次
发布时间:2019-06-28

本文共 3525 字,大约阅读时间需要 11 分钟。

一.函数名的运⽤, 第⼀类对象 函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量 1. 函数名的内存地址 def func(fn):     print(fn) print(func)                   #结果:打印函数的内存地址  
2.函数名可以赋值给其他变量 def func1(): print("端午节") b=func1 #将函数名func1赋值给b , b() #执行结果和 func1的执行结果一样 "端午节" 3. 函数名可以当做容器类的元素 def func2(): print("贝贝") def func3(): print("京京") def func4(): print("欢欢") lst=[func2,func3,func4] #如果加括号打印 e ,结果是三个None. 因为没有返回值. for e in lst: e() #结果是 贝贝 京京 欢欢; 4.函数名可以当做函数的参数 def func5(): print("端午节要放假,哈哈哈") def func6(fn): # fn= func5 print("下周就是端午节") #第一步 fn() #第二步 相当于执行func5() 结果是:端午节要放假,哈哈哈 print("真的吗") #第三步 func6(func5) #func5 作为参数, 5.函数名可以作为函数的返回值 def func7(): print("函数一") def func8(): print("函数二") print("函数一") return func8 ret=func7() #func7()反悔的结果是func8,并赋值给ret ret() #ret() 就相当于func8() 结果是"函数二" ⼆.闭包就是内层函数, 对外层函数(非全局)的变量的引⽤. 闭包的作用 让⼀个变量能够常驻内存. 供后⾯的程序使⽤. def func(): name="mary" def func1(): print(name) #闭包 如果是 # name = "alex" 则返回None. func1() print(func1.__closure__) #_ _closure_ _来检测函数是否是闭包,返回 cell 就是闭包,(
,) # 返回 None就不是闭包. func() #多层嵌套: def func1(): def func2(): def func3(): print("嘿嘿") return func3 return func2 func1( )( )( ) 三.装饰器初识 开闭原则, ⼜被成为开放封闭原则,你的代码对功能的扩展是开放的, 你的程序对修改源代码是封闭的. 这样的软件设计思路可以 更好的维护和开发. 1.定义一个函数 def creat_people(): print("抟泥土,捏泥人") creat_people() 2.添加功能 def creat_people(): print("浇水") #增加功能 (但是改变代码了,不符合开放封闭原则) print("抟泥土,捏泥人") creat_people() """ 装饰器执行流程 1. ⾸先访问warter(create_people). 2. 把你的⽬标函数传递给warter的形参fn. 那么后⾯如果执⾏了fn意味着执⾏了你的⽬标函数create_people 3. warter()执⾏就⼀句话. 返回inner函数. 这个时候. 程序认为warter()函数执⾏完. 那么前⾯的create_people函数名 被重新覆盖成inner函数 4 执⾏create_people函数. 实际上执⾏的是inner函数. ⽽inner中访问的恰恰使我们最开 始传递进去的原始的create_people函数 """ 3.装饰器雏形 用语法糖简化代码 语法糖语法( @装饰器 ) def water(fn): def inner(): print("浇水") fn() print("吹仙气") return inner @water def creat_people(): print("抟泥土,捏泥人") creat_people() 4.装饰器的完整模型代码 def wrapper(func): def inner(*args,**kwargs): # * 聚合 print("快放假了") #目标函数之前的内容 ret=func(*args,**kwargs) # * 打散 print("好开心") #目标函数后面的内容 return ret return inner @wrapper #target_func=wrapper(func) def target_func(): print("我是目标函数,你们都让路") target_func() 作业讲解:

1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),要求登录成功一次,后续的函数都无需再输入用户名和密码(升级题)

flag=False def wrapper(fn):     def inner(*args, **kwargs):         global flag         if flag==True:             ret=fn(*args,**kwargs)             return ret         else:             n=0             while n<3:                 user=input("用户名:")                 password=input("密码:")                 if user=='alex'and password=="123":                     flag=True                     ret=fn(*args,**kwargs)                     return ret                 else:                     print("请重新输入")                 n=n+1             else:                  return     return inner @wrapper def target_func(*args,**kwargs):     print("我是函数体1") target_func() @wrapper def func1(*args,**kwargs):     print("我是函数体2") func1() @wrapper def func2(*args,**kwargs):     print("我是函数体3") func2()
 

转载于:https://www.cnblogs.com/J-7-H-2-F-7/p/9184459.html

你可能感兴趣的文章
关于IRF640PBF
查看>>
java框架学习日志-8(AOP简介)
查看>>
GitHub Sponsors计划可让赞助者直接赞助开源贡献者
查看>>
PHP 错误处理
查看>>
模板方法模式
查看>>
一步一步实现一个简单的表单校验框架一
查看>>
查看手机号是否注册百度开发者
查看>>
前端工作流(draft)
查看>>
spring cloud eureka 高可用搭建
查看>>
OSChina 周二乱弹 —— 做羞羞事情的正确方法
查看>>
OSChina 周四乱弹 —— 会编程的女神长这样
查看>>
Coherence报socket错误
查看>>
面对、接受、处理、放下
查看>>
Eclipse自动生成jni头文件
查看>>
设计模式--外观模式
查看>>
mongodb_shard
查看>>
java成为移动互联网时代必学语言的六大理由
查看>>
git使用实践
查看>>
ABBYY FineReader 12的强大用途
查看>>
java实现KMP字符串匹配算法
查看>>