python之函数嵌套与闭包
一:函数的嵌套:在函数内部在定义一个函数,一层套一层
- 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之函数嵌套与闭包的更多相关文章
- python基础—函数嵌套与闭包
python基础-函数嵌套与闭包 1.名称空间与作用域 1 名称空间分为: 1 内置名称空间 内置在解释器中的名称 2 全局名称空间 顶头写的名称 3 局部名称空间 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 ...
- python中函数嵌套、函数作为变量以及闭包的原理
嵌套函数: python允许创建嵌套函数.也就是说我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变. 例子: #encoding=utf-8 def outer(): name ...
- Python开发——函数【装饰器、高阶函数、函数嵌套、闭包】
装饰器 装饰器本质就是函数,为其他函数添加附加功能. 原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方法 装饰器知识储备:装饰器 = 高阶函数 + 函数嵌套 + 闭包 案例:求函数运行时间! ...
- python全栈开发_day11_作用域,函数嵌套和闭包
一:作用域 1)什么是作用域 作用域是规定一个变量可以作用的范围,运行和销毁的范围 2)作用域的分类 1.内置作用域built_in:随着解释器的运行而产生,解释器运行的终止而销毁. 2.全局作用域g ...
- python之函数嵌套
python很多特性与JavaScript是相似甚至相同的: 1. 无类型 2. 函数亦对象 .... 自然: python也允许函数嵌套, 这与JavaScript中函数闭包的作用一样....
- 10 - 函数嵌套-作用域-闭包-LEGB-函数销毁
目录 1 函数嵌套 2 作用域 2.1 global关键字 3 闭包 3.1 nonlocal关键字 4 默认值的作用域 5 变量名解析原则LEGB 6 函数的销毁 1 函数嵌套 一个 ...
- Python虚拟机函数机制之闭包和装饰器(七)
函数中局部变量的访问 在完成了对函数参数的剖析后,我们再来看看,在Python中,函数的局部变量时如何实现的.前面提到过,函数参数也是一种局部变量.所以,其实局部变量的实现机制与函数参数的实现机制是完 ...
- js中的函数嵌套和闭包
小编已经有一段时间没有更新文章了,最近一直在考虑接下来要更新什么内容.接下来,小编会围绕以下三个方面更新文章.实际项目中遇到的问题和解决方案.Vue源码解析.代码重构.关于数据可视化.小编也会按照这个 ...
随机推荐
- seleniumWebdriver浏览器驱动信息汇总
selenium是thoughtworks公司开发的一款开源的测试工具,主要用来做web端的自动化测试. Python安装selenium,直接使用执行pip install selenium(pyt ...
- 【转】Ubuntu添加PATH环境变量
原文网址:http://www.cnblogs.com/pang123hui/archive/2011/05/28/2309889.html 添加分两种: 一.临时性添加 ~$ echo $PATH ...
- js 数组方法比较
js 数组方法比较 table th:first-of-type { width: 80px; } table th:nth-of-type(2) { width: 120px; } table th ...
- package.json 文件中的版本号
版本号,格式:"主要版本,次要版本,补丁版本" 指定版本:比如1.2.2,遵循"主版本,次要版本,补丁版本"的格式规定,安装时只安装指定版本. 波浪号(tild ...
- opencv中的更通用的形态学
为了处理更为复杂的情况,opencv中还支持更多的形态学变换. 形态学名称 操作过程 操作名称 是否需要temp参数 开操作 open open(src)=先腐蚀,后膨胀 CV_MOP_OPEN 否 ...
- Angularjs+ThinkPHP3.2.3集成微信分享JS-SDK实践
先来看看微信分享效果: 在没有集成微信分享js-sdk前是这样的:没有摘要,缩略图任意抓取正文图片 在集成微信分享js-sdk后是这样的:标题,摘要,缩略图自定义 一.下载微信SDK开发包 下 ...
- Linux下Oracle中SqlPlus时上下左右键乱码问题的解决办法
window下的sqlplus可以通过箭头键,来回看历史命令,用起来非常的方便. 但是在Linux下,会出现各种乱码,非常不方便,如下图所示,每次打错一个字符就需要重新打一遍. 解决办法:rlwrap ...
- java 使用POI读写Excel文件(兼容2003、2007)
package com.jadyer.demo; import java.io.File; import java.io.FileOutputStream; import java.io.IOExce ...
- xml dom minidom
一. xml相关术语: 1.Document(文档): 对应一个xml文件 2.Declaration(声明): <?xml version="1.0" encoding=& ...
- request-2高级用法
会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个session示例发出的所有请求之间保持cookie cookie与session的区别 1.cookie数据存放在客户的浏览器上,sess ...