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 ...
随机推荐
- HDU 2914 Triangle (Fibnacci 数)
题意:给你一个长度为 n 的木棒,求至少拿掉几根使得剩余的木棒构成不了三角形. 析:为了保证不形成三角形,所以保证两边之和等于最大边是最优,这不就是Fibnacci 数么,由于 n 很小,if-els ...
- [App Store Connect帮助]七、在 App Store 上发行(5)手动发布版
如果在您提交您的 App 以供审核时选择手动发布某个版本,您可以在它被批准且状态更改为“等待开发者发布”后发布该版本.如果您的某个 App 处于“等待开发者发布”状态超过 30 天,您会收到来自 Ap ...
- Element-wise operations
Element-wise operations An element-wise operation operates on corresponding elements between tensors ...
- 手机端实现6位短信验证码input输入框效果(样式及代码方法)
微信移动端4位.6位.多位验证码密码输入框功能的实现代码,实现思路: 方案1: 写一个简单的input框. 评估:样式不好看,待定. 方案2: 就是用6个input框,每输入一个数字之后,切换到下一个 ...
- Manven下载
1.下载地址:http://maven.apache.org/download.cgi 2.点击下载链接 3.解压zip到安装路径 我的:C:\Progr ...
- 理解Javascript的闭包【转】
什么是闭包 闭包是什么?闭包是Closure,这是静态语言所不具有的一个新特性.但是闭包也不是什么复杂到不可理解的东西,简而言之,闭包就是: 闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会 ...
- ACMer需要的 java基本知识
1.基本定义 import java.util.*; import java.io.*; public class Main { public static void main(String[] ar ...
- 417 Pacific Atlantic Water Flow 太平洋大西洋水流
详见:https://leetcode.com/problems/pacific-atlantic-water-flow/description/ C++: class Solution { publ ...
- MVC C# 直接导出txt文件
用asp.net根据数据内容自动生成一个txt文本文件并提供用户下载,此方法文件不保存在服务器上,直接提供给用户下载,到网上搜了一下,都是用的Response.BinaryWrite(),用了几下,发 ...
- 构建一个.net的干货类库,以便于快速的开发 - 验证码
一个验证码对于一个网站的作用不言而喻,而随着技术的发展验证码的种类也开始多了起来,发展至今很多网站已经不再使用一种验证码,为满足需求程序猿就要写很多的方法来适应需求,今天我就来介绍我之前收集到的验证码 ...