一:函数的嵌套:在函数内部在定义一个函数,一层套一层

def father(name):
print("from father %s" %name)
def son():
print("我的爸爸是%s" %name)
son()
father("wangyue")

  

二:写一个装饰器的框架

写一个装饰器的框架,满足高阶函数,满足闭包嵌套
# def timer(func):
# def wrapper():
# print(func)
# func()#本层没有func,只能从上层找,所以此时是执行的test这个函数
# return wrapper

  

# def test():
# print("执行完毕")
# res = timer(test)#返回的是wrapper的地址
# res()#执行的额是wrapper()

  

三:函数闭包加上返回值:

import time
def timer(func):
def wrapper():
start_time = time.time()
res=func()#就是在运行test
stop_time = time.time()
print("运行时间是%s" %(stop_time-start_time))
return res
return wrapper @timer #test = timer(test)
def test():
print("执行完毕")
return "ddd"
res = test()
print(res)

四:函数闭包加上参数:

就上个例子来说,加上name和age两个参数

#函数闭包加上参数
import time
def timer(func):
def wrapper(name,age):
start_time = time.time()
res=func(name,age)#就是在运行test
stop_time = time.time()
print("运行时间是%s" %(stop_time-start_time))
return res
return wrapper @timer #test = timer(test)
def test(name,age):
print("执行完毕")
return "ddd"
res = test("wanggyue",25)
print(res)#执行test就相当于执行timer的返回值

  

#函数闭包加上参数
import time
def timer(func):
def wrapper(*args,**kwargs):#被修饰的函数参数是不固定的,所以不能写死参数,所以修该装饰器改为*args接受的元祖的格式,**kwargs接受的是字典的格式
start_time = time.time()
res=func(*args,**kwargs)#就是在运行test
stop_time = time.time()
print("运行时间是%s" %(stop_time-start_time))
return res
return wrapper @timer #test = timer(test)
def test1(name,age):
print("test函数执行完毕,名字是【%s】 年龄是【%s】" %(name,age))
return "这是test的返回值" @timer #相当于test = timer(test1)
def test1(name,age,gender):#被修饰的函数参数是不固定的,所以不能写死参数,所以修该装饰器
print("test1函数执行完毕,名字是【%s】 年龄是【%s】 性别是【%s】" %(name,age,gender))
return "这是test1的返回值"
test1("wangyue",25,"女")

 五:函数闭包之解压序列

#解压序列
l=[10,3,4,6,7,8,3,90,6,7,78]
#实现解压方式取开头和结尾的值
a,*_,c = l #a代表第一个,*_所有中间,c是末尾
a,*_,c,d=l #取第一个值和倒数第一和第二个值
print(a)

python实现值的互换

#实现a,b值互换,正常写法
c=a
a=b
b=c
print(a)
print(b)
#另一种写法
f1=1
f2=2
f1,f2 = f2,f1
print(f1)
print(f2)

六:函数闭包为函数加上认证功能,联系京东商城每个模块加上用户名和密码验证功能

#为一下函数加上验证功能,写装饰器
def auth_func(func):
def wrapper(*args,**kwargs):
#此处输入验证功能
username= input("用户名:".strip())
password = input("密码:".strip())
if username == "you"and password =="123":
res = func(*args, **kwargs)
print("返回值%s" %(res))
return res
else:
print("输入错误")
return wrapper
# 模拟京东商城后台
@auth_func
def index():
print("欢迎来到京东主页")
pass @auth_func
def home(name): # 京东的主页
print("欢迎回家%s" %(name)) @auth_func
def shopping_car(name): # 京东的购物车
print("购物车里有[%s,%s]" %("奶茶","妹妹")) # @auth_func
def order(): # 京东的订单
pass # 给每个模块加上一个验证功能
def yanzheng():
pass index()
home('产品经理')
shopping_car("产品经理")

七:函数闭包模拟session功能:

cirrentuserdic ={"username":None ,"login":False}
user_list = [{"username":"wangyue" ,"password":"123"},
{"username":"songyang","password":"123"},
{"username":"zhaozhen","password":"123"},
{"username":"wangebiebi","password":"123"}] #为一下函数加上验证功能,写装饰器
def auth_func(func):
def wrapper(*args,**kwargs):
#此处输入验证功能
if cirrentuserdic["username"] and cirrentuserdic["login"]:
res = func(*args, **kwargs)
return res
username1= input("用户名:".strip())
password1 = input("密码:".strip())
for userdic1 in user_list:
if username1==userdic1["username"] and password1==userdic1["password"]:
cirrentuserdic["username"] = username1
cirrentuserdic["login"] = True
res = func(*args, **kwargs)
return res
else:
print('用户名或者密码错误')
return wrapper
# 模拟京东商城后台
@auth_func
def index():
print("欢迎来到京东主页")
pass @auth_func
def home(name): # 京东的主页
print("欢迎回家%s" %(name)) @auth_func
def shopping_car(name): # 京东的购物车
print("购物车里有[%s,%s]" %("奶茶","妹妹")) print('before-->',cirrentuserdic)
index()
print('after--->',cirrentuserdic)
home('产品经理')

接下来思考如何给装饰器加上参数(用的比较少)

cirrentuserdic ={"username":None ,"login":False}
user_list = [{"username":"wangyue" ,"password":"123"},
{"username":"songyang","password":"123"},
{"username":"zhaozhen","password":"123"},
{"username":"wangebiebi","password":"123"}] #接下来增加验证功能,加一个装饰器实现这个功能
def auth(auth_type='filedb'):
def auth_func(func):
def wrapper(*argc,**kwargs):
print("类型--",auth_type)
if auth_type=='filedb':
#添加验证逻辑
if cirrentuserdic["username"] and cirrentuserdic["login"]:
res = func(*argc,**kwargs)
return res
username=input("用户名:".strip())
password = input("密码:".strip())
for user_dic in user_list:
if username==user_dic["username"] and password == user_dic["password"]:
cirrentuserdic["username"]=username
cirrentuserdic["login"] = True
res = func(*argc, **kwargs)
return res
else:
print("输入错误")
elif auth_type=='ldap':
print("真会玩") return wrapper
return auth_func @auth(auth_type='filedb')#auth_func=auth(auth_type='filedb',auth_func附加了auth_type
def index():
print("欢迎来到京东")
@auth(auth_type='ldap')
def home():
print("欢迎进入京东主页")
@auth
def order():
print("京东订单") print("before--",cirrentuserdic)
index()
print("after--",cirrentuserdic)
home()

  

python之函数嵌套与闭包的更多相关文章

  1. python基础—函数嵌套与闭包

    python基础-函数嵌套与闭包 1.名称空间与作用域 1 名称空间分为: 1 内置名称空间   内置在解释器中的名称 2 全局名称空间   顶头写的名称 3 局部名称空间 2 找一个名称的查找顺序: ...

  2. 《Python》 函数嵌套、闭包和迭代器

    一.函数的嵌套: 1.函数的嵌套调用 def max2(x,y): m = x if x>y else y return m def max4(a,b,c,d): res1 = max2(a,b ...

  3. python中函数嵌套、函数作为变量以及闭包的原理

    嵌套函数: python允许创建嵌套函数.也就是说我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变. 例子: #encoding=utf-8 def outer():    name ...

  4. Python开发——函数【装饰器、高阶函数、函数嵌套、闭包】

    装饰器 装饰器本质就是函数,为其他函数添加附加功能. 原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方法 装饰器知识储备:装饰器 = 高阶函数 + 函数嵌套 + 闭包 案例:求函数运行时间! ...

  5. python全栈开发_day11_作用域,函数嵌套和闭包

    一:作用域 1)什么是作用域 作用域是规定一个变量可以作用的范围,运行和销毁的范围 2)作用域的分类 1.内置作用域built_in:随着解释器的运行而产生,解释器运行的终止而销毁. 2.全局作用域g ...

  6. python之函数嵌套

    python很多特性与JavaScript是相似甚至相同的: 1. 无类型 2. 函数亦对象 .... 自然: python也允许函数嵌套, 这与JavaScript中函数闭包的作用一样....

  7. 10 - 函数嵌套-作用域-闭包-LEGB-函数销毁

    目录 1 函数嵌套 2 作用域 2.1 global关键字 3 闭包 3.1 nonlocal关键字 4 默认值的作用域 5 变量名解析原则LEGB 6 函数的销毁 1 函数嵌套         一个 ...

  8. Python虚拟机函数机制之闭包和装饰器(七)

    函数中局部变量的访问 在完成了对函数参数的剖析后,我们再来看看,在Python中,函数的局部变量时如何实现的.前面提到过,函数参数也是一种局部变量.所以,其实局部变量的实现机制与函数参数的实现机制是完 ...

  9. js中的函数嵌套和闭包

    小编已经有一段时间没有更新文章了,最近一直在考虑接下来要更新什么内容.接下来,小编会围绕以下三个方面更新文章.实际项目中遇到的问题和解决方案.Vue源码解析.代码重构.关于数据可视化.小编也会按照这个 ...

随机推荐

  1. 【转】每天一个linux命令(54):ping命令

    原文网址:http://www.cnblogs.com/peida/archive/2013/03/06/2945407.html Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主 ...

  2. zstack快速安装文档

    1.环境准备 1.1 准备软件工具 系统镜像 ZStack-x86_64-DVD-2.1.1.514.iso Zstack安装包 ZStack-installer-2.1.1.514.bin http ...

  3. 从工程文化和运维理念理解Netflix

    http://www.infoq.com/cn/news/2018/01/netflix-engineering-culture 在技术圈儿,Netflix 是一家非常有特色的互联网公司.他们信奉“自 ...

  4. QString和char字符串数组之间的转换 (转)

    做串口通信时,碰到这样的问题,在Qt的界面中,我用QLineEdit对象负责显示发送和接收的文本,对其中的数据进行读取和显示使用的数据类型都是QString:但是,在对串口设备进行读写时,数据使用的形 ...

  5. POJ3208魔鬼数

    题目:http://poj.org/problem?id=3208 与一般的数位dp有点不同的是,没有给出上界,而是要通过值来判断这一位该填什么. 当然是从高位向低位填. 为了知道这一位填下去对答案有 ...

  6. POJ3254Corn Fields——状态压缩dp

    题目:http://poj.org/problem?id=3254 1.枚举行: 2.把有影响的“放不放牛”加入参数中,用二进制数表示该位置放不放牛,再用十进制数表示二进制数: 3.优美的预处理lis ...

  7. 零基础学习hadoop开发所必须具体的三个基础知识

    大数据hadoop无疑是当前互联网领域受关注热度最高的词之一,大数据技术的应用正在潜移默化中对我们的生活和工作产生巨大的改变.这种改变给我们的感觉是“水到渠成”,更为让人惊叹的是大数据已经仅仅是互联网 ...

  8. springcould

     [Spring For All 社区周报] 「社区活动」(送书哦)Spring For All 第 1 期高手 QA 环节 — Spring Cloud 微服务实战http://spring4all ...

  9. linux 异步信号的同步处理方式

    关于代码的可重入性,设计开发人员一般只考虑到线程安全,异步信号处理函数的安全却往往被忽略.本文首先介绍如何编写安全的异步信号处理函数:然后举例说明在多线程应用中如何构建模型让异步信号在指定的线程中以同 ...

  10. java 管道流PipedInputStream,PipedInputStream和随机访问文件 RandomAccessFile

    http://blog.csdn.net/zlp1992/article/details/50298195   给个链接自己去看吧.网上资料不是很多,而且自己也不想写了 RandomAccessFil ...