python装饰器、迭代器、生成器
装饰器:为已存在的函数或者或者对象添加额外的功能
def wrapper(f): #装饰器函数,f是被装饰的函数
def inner(*args,**kwargs):
'''在被装饰函数之前要做的事'''
print("AAAA")
ret = f(*args,**kwargs) #被装饰的函数
'''在被装饰函数之后要做的事'''
print("BBBB")
return ret
return inner @wrapper #语法糖 @装饰器函数名
def func(a,b): #被装饰的函数
time.sleep(0.01)
print('大家好',a,b)
return '新年好' func(2,5)
打印结果如下

迭代器:在python中如果一个对象有_iter_()和_next_()方法,则称该对象是迭代器(Iterator),其中_iter_()方法可以让对象使用for...in循环遍历,_next_()方法糖对象可以通过next(实例名)访问下一个元素
可迭代:在python中一个一个对象有_iter_()方法或_getitem_()方法,称该对象为可迭代的(Iterable),_iter_()让对象使用for循环,_getitem_()方法是让对象可以通过“实例名[index]”的方式访问实例中的元素
# 迭代器
l = [1, 2, 3]
# for i in l:
# i: print(dir([])) # 列表拥有的方法
"""
['__add__', '__class__', '__contains__', '__delattr__',
'__delitem__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__getitem__', '__gt__',
'__hash__', '__iadd__', '__imul__', '__init__',
'__init_subclass__', '__iter__', '__le__', '__len__', '__lt__',
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__',
'__setitem__', '__sizeof__', '__str__', '__subclasshook__',
'append', 'clear', 'copy', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
"""
# 双下划线的是双下方法
print([1].__add__([2])) # -->[1, 2]
print([1] + [2]) # -->[1, 2] ret = set(dir([])) & set(dir({})) & set(dir('')) & set(dir(range(10)))
print(ret) # iterable __iter__ # 判断
print('__iter__' in dir([].__iter__())) # True
print('__next__' in dir([].__iter__())) # True from collections import Iterable # Iterable:可迭代对象
from collections import Iterator # Iterator迭代器 print(isinstance([], Iterator)) # False 列表不是一个迭代器
print(isinstance([], Iterable)) # True 列表是可迭代的 a = [1, 2, 3, 4]
for b in a.__iter__():
print(b) # 打印结果1,2,3,4
生成器:生成器函数generator与定义普通函数一样,唯一不同的是生成器函数有一个或者多个yield,yield与return类似都是用来返回数据,两者的区别是return返回数据后直接退出当前函数,yidel是将数据返回后继续运行函数
def generator():
print(1)
return 'a'
ret = generator()
print(ret) # 结果:1 a # 生成器函数(含有yield关键字)
def generator1():
print(1)
yield 'a' ret = generator1()
print(ret) # 结果: <generator object generator1 at 0x0000016AFEFDCF68>
ret.__next__() # 结果:1
ret.__iter__()
生成器进阶:
# 计算移动平均值(1)
def averager():
total = 0.0
count = 0
average = None
while True:
term = yield average
total += term
count += 1
average = total / count g_avg = averager()
next(g_avg)
print(g_avg.send(10))
print(g_avg.send(30))
print(g_avg.send(5))
# 结果:10.0,20.0,15.0 # 计算移动平均值(2)_预激协程的装饰器
def init(func): # 在调用被装饰生成器函数的时候首先用next激活生成器
def inner(*args, **kwargs):
g = func(*args, **kwargs)
next(g)
return g return inner @init
def averager():
total = 0.0
count = 0
average = None
while True:
term = yield average
total += term
count += 1
average = total / count g_avg = averager()
# next(g_avg) 在装饰器中执行了next方法
print(g_avg.send(10))
print(g_avg.send(30))
print(g_avg.send(5))
# 打印结果10.0,20.0,15.0
python装饰器、迭代器、生成器的更多相关文章
- python装饰器,迭代器,生成器,协程
python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出12 ...
- Python装饰器、生成器、内置函数、json
这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如 ...
- Python学习---装饰器/迭代器/生成器的学习【all】
Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210
- python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式
闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...
- python 装饰器,生成器,迭代器
装饰器 作用:当我们想要增强原来已有函数的功能,但不想(无法)修改原函数,可以使用装饰器解决 使用: 先写一个装饰器,就是一个函数,该函数接受一个函数作为参数,返回一个闭包,而且闭包中执行传递进来的函 ...
- Python中的装饰器,迭代器,生成器
1. 装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的 ...
- python 装饰器、生成器、迭代器
# 装饰器'''由高阶函数(把一个函数名当作实参传递给另一个函数,返回值中包含函数名)和嵌套函数(函数中嵌套函数)组成功能:在不更改原函数的代码和调用方式的前提下添加新的功能装饰器本身就是一个函数.使 ...
- python中的装饰器迭代器生成器
装饰器: 定义:本质是函数(装饰其它函数) 为其它函数添加附加功能 原则: 1 不能修改被装饰函数源代码 2 不修改被装饰函数调用方式 实现装饰器知识储备: 1 函数即‘’变量‘’ 2 高阶函数 ...
- Day4 装饰器——迭代器——生成器
一 装饰器 1.1 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多 ...
- day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数
回顾下上次的内容 转码过程: 先decode 为 Unicode(万国码 ) 然后encode 成需要的格式 3.0 默认是Unicode 不是UTF-8 所以不需要指定 如果非要转为U ...
随机推荐
- linux下系统调用劫持ioctl
实验环境:linux 2.6.32 64位系统 采用lkm(动态加载内核模块)方式劫持ioctl系统调用,系统调用过程如图所示(以open为例子) 实验代码:(头文件有不需要的,但是懒得改了,在系 ...
- HDU1072:Nightmare
传送门 题意 给出一张n*m的图 0.墙 1.可走之路 2.起始点 3.终点 4.时间重置点 问是否能到达终点 分析 我的训练专题第一题,一开始我设个vis数组记录,然后写炸,不能处理重置点根vis的 ...
- Android属性动画ObjectAnimator的使用1
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/106 属性动画ObjectAnimator的使用 属性动画 ...
- Robot Framework问题汇总...不断更新中
在实际使用Robot Framework工具过程中,难免会遇到一些问题, 我们将会一一记录下来,以便后来者碰到类似的问题能够快速解决! 安装类问题: ========================= ...
- SIFT特征点检测与匹配
SIFT的步骤如下: (1) 尺度空间极值检测(Scale-space Extrema Detection) 也就是在多尺度高斯差分(Difference of Gauss)空间中检测极值点(3x3x ...
- 题解报告:poj 1195 Mobile phones(二维BIT裸题)
Description Suppose that the fourth generation mobile phone base stations in the Tampere area operat ...
- 题解报告:hdu 1228 A+B(字符串)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1228 Problem Description 读入两个小于100的正整数A和B,计算A+B. 需要注意 ...
- 循环队列 分类: c/c++ 2014-10-10 23:28 605人阅读 评论(0) 收藏
利用线性表实现队列,为了有效利用空间,将其设计为循环结构,防止假溢出:牺牲一个存储单元以区分队空.队满. 设front队头,rear队尾,N为顺序表大小 队空:rear==front 队满:(rear ...
- 419 Battleships in a Board 甲板上的战舰
给定一个二维的甲板, 请计算其中有多少艘战舰. 战舰用 'X'表示,空位用 '.'表示. 你需要遵守以下规则: 给你一个有效的甲板,仅由战舰或者空位组成. 战舰只能水平或者垂直放置.换句话 ...
- python_one-day
python入门_(1) 作者:_晓冬 归档:学习笔记 2017/9/9 目 录 第1章 练习... 1 1.1 格式化输出... 1 1.2 流程控制if..else. 1 1.3 流程控制whi ...