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

  1. def father(name):
  2. print("from father %s" %name)
  3. def son():
  4. print("我的爸爸是%s" %name)
  5. son()
  6. father("wangyue")

  

二:写一个装饰器的框架

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

  

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

  

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

  1. import time
  2. def timer(func):
  3. def wrapper():
  4. start_time = time.time()
  5. res=func()#就是在运行test
  6. stop_time = time.time()
  7. print("运行时间是%s" %(stop_time-start_time))
  8. return res
  9. return wrapper
  10.  
  11. @timer #test = timer(test)
  12. def test():
  13. print("执行完毕")
  14. return "ddd"
  15. res = test()
  16. print(res)

四:函数闭包加上参数:

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

  1. #函数闭包加上参数
  2. import time
  3. def timer(func):
  4. def wrapper(name,age):
  5. start_time = time.time()
  6. res=func(name,age)#就是在运行test
  7. stop_time = time.time()
  8. print("运行时间是%s" %(stop_time-start_time))
  9. return res
  10. return wrapper
  11.  
  12. @timer #test = timer(test)
  13. def test(name,age):
  14. print("执行完毕")
  15. return "ddd"
  16. res = test("wanggyue",25)
  17. print(res)#执行test就相当于执行timer的返回值

  

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

 五:函数闭包之解压序列

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

python实现值的互换

  1. #实现a,b值互换,正常写法
  2. c=a
  3. a=b
  4. b=c
  5. print(a)
  6. print(b)
  7. #另一种写法
  8. f1=1
  9. f2=2
  10. f1,f2 = f2,f1
  11. print(f1)
  12. print(f2)

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

  1. #为一下函数加上验证功能,写装饰器
  2. def auth_func(func):
  3. def wrapper(*args,**kwargs):
  4. #此处输入验证功能
  5. username= input("用户名:".strip())
  6. password = input("密码:".strip())
  7. if username == "you"and password =="123":
  8. res = func(*args, **kwargs)
  9. print("返回值%s" %(res))
  10. return res
  11. else:
  12. print("输入错误")
  13. return wrapper
  14. # 模拟京东商城后台
  15. @auth_func
  16. def index():
  17. print("欢迎来到京东主页")
  18. pass
  19.  
  20. @auth_func
  21. def home(name): # 京东的主页
  22. print("欢迎回家%s" %(name))
  23.  
  24. @auth_func
  25. def shopping_car(name): # 京东的购物车
  26. print("购物车里有[%s,%s]" %("奶茶","妹妹"))
  27.  
  28. # @auth_func
  29. def order(): # 京东的订单
  30. pass
  31.  
  32. # 给每个模块加上一个验证功能
  33. def yanzheng():
  34. pass
  35.  
  36. index()
  37. home('产品经理')
  38. shopping_car("产品经理")

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

  1. cirrentuserdic ={"username":None ,"login":False}
  2. user_list = [{"username":"wangyue" ,"password":"123"},
  3. {"username":"songyang","password":"123"},
  4. {"username":"zhaozhen","password":"123"},
  5. {"username":"wangebiebi","password":"123"}]
  6.  
  7. #为一下函数加上验证功能,写装饰器
  8. def auth_func(func):
  9. def wrapper(*args,**kwargs):
  10. #此处输入验证功能
  11. if cirrentuserdic["username"] and cirrentuserdic["login"]:
  12. res = func(*args, **kwargs)
  13. return res
  14. username1= input("用户名:".strip())
  15. password1 = input("密码:".strip())
  16. for userdic1 in user_list:
  17. if username1==userdic1["username"] and password1==userdic1["password"]:
  18. cirrentuserdic["username"] = username1
  19. cirrentuserdic["login"] = True
  20. res = func(*args, **kwargs)
  21. return res
  22. else:
  23. print('用户名或者密码错误')
  24. return wrapper
  25. # 模拟京东商城后台
  26. @auth_func
  27. def index():
  28. print("欢迎来到京东主页")
  29. pass
  30.  
  31. @auth_func
  32. def home(name): # 京东的主页
  33. print("欢迎回家%s" %(name))
  34.  
  35. @auth_func
  36. def shopping_car(name): # 京东的购物车
  37. print("购物车里有[%s,%s]" %("奶茶","妹妹"))
  38.  
  39. print('before-->',cirrentuserdic)
  40. index()
  41. print('after--->',cirrentuserdic)
  42. home('产品经理')

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

  1. cirrentuserdic ={"username":None ,"login":False}
  2. user_list = [{"username":"wangyue" ,"password":"123"},
  3. {"username":"songyang","password":"123"},
  4. {"username":"zhaozhen","password":"123"},
  5. {"username":"wangebiebi","password":"123"}]
  6.  
  7. #接下来增加验证功能,加一个装饰器实现这个功能
  8. def auth(auth_type='filedb'):
  9. def auth_func(func):
  10. def wrapper(*argc,**kwargs):
  11. print("类型--",auth_type)
  12. if auth_type=='filedb':
  13. #添加验证逻辑
  14. if cirrentuserdic["username"] and cirrentuserdic["login"]:
  15. res = func(*argc,**kwargs)
  16. return res
  17. username=input("用户名:".strip())
  18. password = input("密码:".strip())
  19. for user_dic in user_list:
  20. if username==user_dic["username"] and password == user_dic["password"]:
  21. cirrentuserdic["username"]=username
  22. cirrentuserdic["login"] = True
  23. res = func(*argc, **kwargs)
  24. return res
  25. else:
  26. print("输入错误")
  27. elif auth_type=='ldap':
  28. print("真会玩")
  29.  
  30. return wrapper
  31. return auth_func
  32.  
  33. @auth(auth_type='filedb')#auth_func=auth(auth_type='filedb',auth_func附加了auth_type
  34. def index():
  35. print("欢迎来到京东")
  36. @auth(auth_type='ldap')
  37. def home():
  38. print("欢迎进入京东主页")
  39. @auth
  40. def order():
  41. print("京东订单")
  42.  
  43. print("before--",cirrentuserdic)
  44. index()
  45. print("after--",cirrentuserdic)
  46. 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. seleniumWebdriver浏览器驱动信息汇总

    selenium是thoughtworks公司开发的一款开源的测试工具,主要用来做web端的自动化测试. Python安装selenium,直接使用执行pip install selenium(pyt ...

  2. 【转】Ubuntu添加PATH环境变量

    原文网址:http://www.cnblogs.com/pang123hui/archive/2011/05/28/2309889.html 添加分两种: 一.临时性添加 ~$ echo $PATH  ...

  3. js 数组方法比较

    js 数组方法比较 table th:first-of-type { width: 80px; } table th:nth-of-type(2) { width: 120px; } table th ...

  4. package.json 文件中的版本号

    版本号,格式:"主要版本,次要版本,补丁版本" 指定版本:比如1.2.2,遵循"主版本,次要版本,补丁版本"的格式规定,安装时只安装指定版本. 波浪号(tild ...

  5. opencv中的更通用的形态学

    为了处理更为复杂的情况,opencv中还支持更多的形态学变换. 形态学名称 操作过程 操作名称 是否需要temp参数 开操作 open open(src)=先腐蚀,后膨胀  CV_MOP_OPEN 否 ...

  6. Angularjs+ThinkPHP3.2.3集成微信分享JS-SDK实践

    先来看看微信分享效果: 在没有集成微信分享js-sdk前是这样的:没有摘要,缩略图任意抓取正文图片   在集成微信分享js-sdk后是这样的:标题,摘要,缩略图自定义   一.下载微信SDK开发包 下 ...

  7. Linux下Oracle中SqlPlus时上下左右键乱码问题的解决办法

    window下的sqlplus可以通过箭头键,来回看历史命令,用起来非常的方便. 但是在Linux下,会出现各种乱码,非常不方便,如下图所示,每次打错一个字符就需要重新打一遍. 解决办法:rlwrap ...

  8. java 使用POI读写Excel文件(兼容2003、2007)

    package com.jadyer.demo; import java.io.File; import java.io.FileOutputStream; import java.io.IOExce ...

  9. xml dom minidom

    一. xml相关术语: 1.Document(文档): 对应一个xml文件 2.Declaration(声明): <?xml version="1.0" encoding=& ...

  10. request-2高级用法

    会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个session示例发出的所有请求之间保持cookie cookie与session的区别 1.cookie数据存放在客户的浏览器上,sess ...