python-装饰器&生成器&迭代器&推导式
一:普通装饰器
- 概念:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能,为已存在的对象添加某个功能
- 普通装饰器编写的格式
def 外层函数(参数)
def 内层函数(*args,**kwargs)
#函数执行之前
data= 参数(*args,**kwags)
#函数执行之后
return data
return 内层函数 - 用法示例:
def func(arg):
def inner(*args,**kwargs):
v = arg(*args,**kwargs)
return v
return inner @func #@装饰器的语法 : 等价于: index = func(index)
def index():
print(123)
return 666
ret = index()
print(ret) 执行原理:
1. 函数从上往下执行,遇到 @func 时,执行 index = func(index),参数 arg = index,同时将返回值 inner 函数赋值给 index ,
2. 遇到 index()时,此时就是 inner(),执行 inner 函数
3. 执行 inner 函数,里面的 arg(*args,**kwargs)执行,就是 index 函数执行,打印 123 ,同时将 index 的返回值 666 赋值给 v : v = 666
4. 继续执行 inner 函数, inner 函数的返回值是 v , 执行 inner 函数的是 ret = index() , 所以 ret = v = 666 - 应用示例
#示例:计算函数执行时间
import time
def base(func):
def inner(*args,**kwargs):
start_time = time.time() --->#函数执行之前
v= func(*args,**kwargs)
end_tme = time.time() ---->#函数执行之后
print(end_time-start_time)
return v
return inner @base
def func1():
time.sleep(2) # 函数执行延缓2秒
print(123) @base
def func2():
time.sleep(1)
print(456)
- 关于返回值
def base(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs)
return data
return inner @base
def index():
print(123)
return 666
v1 =index()
print(v1)
#func函数带括号,执行index函数,先打印'123',先将666返回给data,data再返回给v1 - 关于前后
def base(func):
def inner(*args,**kwargs)
print('函数调用之前')
data = func(*args,**kwargs) #执行原函数并获取返回值
print('调用原函数之后')
return data
return inner
@base
def index()
print(123)
index()
二:带参数的装饰器
- 基本格式
def base(counter):
def wrapper(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs) # 执行原函数并获取返回值
return data
return inner
return wrapper
@base(9)
def index():
pass # 先执行base函数,然后将返回值wrapper返回,变成不带参数的装饰器
# counter 参数在装饰器内部任意位置都能被调用 - 用法示例
#写一个带参数的函,实现:参数是多少,被装饰的函数就要执行多少次,返回最后一次执行的结果 def base(counter):
def wrapper(func):
def inner(*args,**kwargs):
for i in range(counter):
data = func(*args,**kwargs) # 执行原函数并获取返回值
return data
return inner
return wrapper @base(5)
def index():
return '好难啊'
v = index()
print(v)
三:生成器 (函数的变异)
- 概念:函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数,会返回一个生成器,生成器只有被for循环时,生成器内部代码才会执行,每次循环都会获取yield返回的值
- 获取生成器的三种方式
- 生成器函数
- 生成器表达式
- python内部提供的一些
- 生成器的本质就是迭代器
- 唯一区别: 生成器是我们自己用python代码构建的数据结构,迭代器都是提供的或者是转化得来的
- 生成器函数 : 内部是否包含yield
def func():
print('F1')
yield 1
print('F2')
yield 2
print('F3')
#函数内部代码不会执行,返回一个生成器对象
v1 = func()
#生成器可以被for 循环,一旦开始循环函数内部代码就开始执行
for item in v1:
print(item)
# F1 1 F2 2 F3 - 特殊的迭代对象
def func():
yield 1 v = func()
result = v.__iter__()
print(result)
四:迭代器
- 概念:对某种对象(str/lsit/tuple/dict/set类创建的对象)中的元素进行逐一获取,表象:具有
__nest__方法且每次调用都获取可迭代对象中的元素 - 优点 : 节省内存,惰性机制
- 缺点 : 不直观,速度相对慢,操作方法单一,不走回头路
- 列表转换成迭代器
v1 = iter([1,2,3,4])
v2 = [1,2,3,4].
__iter__()
- 迭代器想要获取每个元素 : 反复调用val = v1.
__next__()v1 = "alex"
v2 = iter(v1)
while True:
try:
val = v2.__next__()
print(val)
except StopIterationas e:
break - 直到报错:stoplteration错误,表示迭代已经完毕
- 如何判断一个对象是否是迭代器 : 内部是否有
__next__方法 - for 循环
v1 = [11,22,33,44] # 1.内部会将v1转换成迭代器
# 2.内部反复执行 迭代器.__next__()
# 3.取完不报错
for item in v1:
print(item) - 可迭代对象
内部具有
_iter__方法且返回一个迭代器可以被for 循环
python-装饰器&生成器&迭代器&推导式的更多相关文章
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- Python装饰器、迭代器&生成器、re正则表达式、字符串格式化
Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...
- python装饰器、迭代器、生成器
装饰器:为已存在的函数或者或者对象添加额外的功能 def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): '''在被装饰函数之前要做的事' ...
- 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化
文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...
- python三大器(装饰器/生成器/迭代器)
1装饰器 1.1基本结构 def 外层函数(参数): def 内层函数(*args,**kwargs); return 参数(*args,**kwargs) return 内层函数 @外层函数 def ...
- python note 12 生成器、推导式
1.生成器函数 # 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数# yield: 相当于return 可以返回数据. 但是yield不会彻底中 ...
- python day 13 生成器 以及 推导式
1.生成器的本质是迭代器 2.生成器函数 def fn() 函数体 yield fn() g = fn() 此时这个g就是生成器 所以g 是可迭代的 g._ _next_ _ 每执行一次_ _nex ...
- python — 装饰器、迭代器
目录 1 装饰器 2 迭代器 3 可迭代对象 1 装饰器 1.1目的.应用场景: 目的: 在不改变原函数内部代码的基础上,在函数执行前后自定义功能. 应用场景: 想要为函数扩展功能时,可以选择用装饰器 ...
- python第六章:三大利器(装饰器,迭代器,生成器)--小白博客
python装饰器 什么是装饰器?在不修改源代码和调用方式的基础上给其增加新的功能,多个装饰器可以装饰在同一个函数上 # 原理(个人理解):将原函数(bar)的内存地址重新赋值,进行覆盖.新值为装饰器 ...
随机推荐
- 【学习笔记】python
1. len( s ) 返回对象(字符.列表.元祖等)的长度或项目个数. >>>str = "runoob" >>> len(str) # ...
- C++ 黑白棋AI minimax+alphabeta剪枝
没事写着玩玩,通过debian上的黑白棋测试,搜了10层,打hard应该问题不大 #include <cstdio> #include <cstring> using name ...
- angular 官网英雄案例 报错整理
1.导入of 报错 import { of } from 'rxjs/observable/of'; 2. 服务注入报错 在app.module.ts引入 3.使用angular-in-memory- ...
- woe_iv原理和python代码建模
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
- 【SQL】ROW_NUMBER() OVER(partition by 分组列 order by 排序列)用法详解+经典实例
#用法说明 select row_number() over(partition by A order by B ) as rowIndex from table A :为分组字段 B:为分组后的排序 ...
- Tomcat系列(7)——Tomcat类加载机制
1. 核心部分 1. 类加载器: 通过一个类的全限定名来获取描述此类的二进制字节流. 对于任意一个类,都需要由加载他的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一 ...
- 实现Map接口(hash原理)
闲来无事,就实现一个简单的map来练练手吧! HashMap的底层实现主要是基于数组和链表来实现的,HashMap中通过key的hashCode来计算hash值的,由这个hash值计算在数组中的位置, ...
- Java调用第三方http接口的方式
1. 概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适.很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信.天气等). 在J ...
- 文件共享服务器share
文件共享服务器:(类似于FTP服务器) 1.创建共享:文件夹右键属性--共享--开启共享--设置共享名--设置共享权限(建议设置为everyone完全控制,然后具体的权限需求在ntfs权限中设置即可) ...
- C++与蓝图互调
Kismet库 蓝图方法cpp使用 例:打LOG:Print String 蓝图节点的鼠标tips:Target is Kismet System Library #include "Run ...