Python闭包函数和装饰器
2018年7月2日笔记
7.Python函数对象和闭包
1.函数对象
函数是对象,可以给函数增加属性
def funcF(x,y,z): print(x,y,z) funcF(1,2,3) funcF.abc = "hello python" print(funcF.abc
上面一段代码的运行结果如下:
1 2 3
hello python
2.函数闭包
1.概念:在一个外函数中定义了一个内函数,内函数运用了外函数的临时变量,并且外函数的返回值是内函数的引用
示例代码:演示函数嵌套和闭包。
def outer(a): b = 10 def inner(): print(a+b) return inner demo = outer(5) demo()
上面一段代码的运行结果如下:
15
8.Python装饰器
1.定义
装饰器实质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。他经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
2.场景
2.1 通过变量也能调用该函数
def hello(): print("我是最初的hello函数") #函数也是一个对象,而且函数对象可以赋值给变量 f = hello f()
上面一段代码的运行结果如下:
我是最初的hello函数
2.2 场景
函数对象有一个name属性,可以获取函数的名字
def hello(): print("我是最初的hello函数") #获取函数的名字 print(hello.__name__)
上面一段代码的运行结果如下:
hello
2.3 假设增加hello()函数的功能,而完全不改变原来的代码
def outer(func): def inner(*args,**kwargs): print("我是%s()函数" %func.__name__) return func(*args,**kwargs) return inner @outer def hello(): print("我是最初的hello函数") hello()
上面一段代码的运行结果如下:
我是hello()函数
我是最初的hello函数
2.4 支持多个装饰器
import time def deco1(func): print("deco1 decorated") def wrapper(*args, **kwargs): print("this is deco1") startTime = time.time() func(*args, **kwargs) endTime = time.time() ms = (endTime - startTime) * 1000 print("time is %s ms" % ms) print("deco1 end here") return wrapper def deco2(func): print("deco2 decorated") def wrapper(*args, **kwargs): print("this is deco2") func(*args, **kwargs) print("deco2 end here") return wrapper @deco1 @deco2 def func(a, b): print("hello, here is func for add:") time.sleep(1) print("result is %d" % (a + b)) func(3, 4)
上面一段代码的运行结果如下:
deco2 decorated
deco1 decorated
this is deco1
this is deco2
hello, here is func for add:
result is 7
deco2 end here
time is 1000.9815692901611 ms
deco1 end here
多个装饰器使用的调用顺序:
def one(func): print('----1----') def two(): print('----2----') func() print('----3----') return two def a(func): print('----a----') def b(): print('----b----') func() print('----c----') return b @one @a def demo(): print('----demo----') demo()
上面一段代码的运行顺序如下:
----a----
----1----
----2----
----b----
----demo----
----c----
----3----
如上图所示,红色箭头标记“1”和“3”处越靠近函数的装饰器先被执行,红色箭头标记“2”处越远离函数的装饰器先被执行。
练习
1.定义一个函数,需求:去除列表中重复的元素.
def dropDuplicates(lt): new_list = [] for i in lt: if i not in new_list: new_list.append(i) return new_list ##第二种方法一行代码解决 def dropDuplicates2(lt): return list(set(lt))
2.定义一个函数,需求:合并两个列表
def concatList(lt1,lt2): return lt1 + lt2 def concatList2(lt1,lt2): lt1.extend(lt2) return lt1 def concatList3(lt1,lt2): for i in lt2: lt1.append(i) return lt1
3.定义函数,需求:判断三个数中的最大值
def my_max(*args): return max(*args) def my_max1(*args): max_number = args[0] for i in args: if i > max_number: max_number = i return max_number
4.定义一个函数,需求:实现斐波那契数列
def fibonacci(length): if length < 1: print("参数应该为正整数") if length == 1: return [1] elif length == 2: return [1,1] lt = [1,1] for i in range(2,length): lt.append(lt[i-1] + lt[i-2]) return lt
5.将下列字符串变成字典
t = "k:1|k1:2|k2:3|k3:4" result = {x:y for x,y in [k.split(':') for k in t.split('|')]} print(result)
字符串函数
s = 'i love You so much' print(s.ljust(22, '*')) print(s.rjust(22, '2')) print(s.center(22, '*')) print(s.zfill(22)) print(s.replace('u', '1', 1)) print(s.split(' ')) print(s.upper()) print(s.lower()) print(s.capitalize()) print(s.title()) print(s.swapcase()) print(s.count('o')) print(s.startswith('i')) print(s.endswith('!')) print(s.isalnum()) print(s.isalpha()) print(s.islower()) print(s.isupper()) print(s.istitle())
上面一段代码的运行结果如下:
i love You so much**** 2222i love You so much **i love You so much** 0000i love You so much i love Yo1 so much ['i', 'love', 'You', 'so', 'much'] I LOVE YOU SO MUCH i love you so much I love you so much I Love You So Much I LOVE yOU SO MUCH 3 True False False False False False False

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Go——小白学习之map
map的使用,key值唯一,打印出是无序的,注意坐标(key)与数组坐标不一样 定义: m3 := map[int]string{1: "mile", 2: "go"} m3[1] = "litter" m3[3] = "gogogo" //超出范围,错误 fmt.Println("m3=", m3) 遍历: 第一个运行结果的前提是 value OK:=m[1] range的使用,有两个返回值,在数组中也可以用到,一个是id,一个是value,id为下标,value为其对应的值,如果只想要其中一个值,可以使用 “_”
- 下一篇
利用Python发送email
引入smtplib和email.mime.text.MIMEText两个库可以完成发送邮件的功能 代码逻辑顺序:初始化邮箱服务——>使用用户名和密码登录邮箱——>定义发送的信息的内容、主题、来源——>邮箱发送邮件——>邮箱退出 import smtplib # 将你写的字符串转化为邮件的文本形式 from email.mime.text import MIMEText # smtp服务器地址 smtp_server = 'smtp.163.com' # 发送者是谁 sender = 'stevenlei2013@163.com' # 客户端授权码 password = '你自己设置的授权码' # 发给谁 多个用户中间使用 逗号 隔开 to = '474933858@qq.com' # 发送的消息 message = "好好学习,天天向上" # 转化为邮件文本 message = MIMEText(message) # 定制邮件标题 message['Subject'] = '顺利毕业!' # 定制发送者 message['From'] = sender # 绑定...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2全家桶,快速入门学习开发网站教程