python全栈开发 * 11知识点汇总 * 1806011

一.函数名的运⽤, 第⼀类对象
函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量
1. 函数名的内存地址
def func(fn):
print(fn)
print(func) #结果:打印函数的内存地址 <function func at 0x0000028AA22F2EA0>
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 就是闭包,(<cell at 0x000002AF8F9475B8: str object at 0x000002AF8F9D89D0>,)
# 返回 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