当前位置: 首页 > news >正文

python之装饰器、迭代器、生成器

装饰器

什么是装饰器?

用来装饰其他函数,即为其他函数添加特定功能的函数。

装饰器的两个基本原则:

装饰器不能修改被装饰函数的源码

装饰器不能修改被装饰函数的调用方式

什么是可迭代对象?

在python的任意对象中,只要它定义了可以返回一个迭代器的__iter__方法,或者定义了可以支持下标索引的__getitem__方法,那么它就是一个可迭代对象,通俗低讲就是可以通过for循环进行遍历。

如何判断一个对象是否是可迭代对象?

方法一:isinstance+iterable

方法二:hasattr+__getitem__

from collections import Iterableclass Student:pass
print(isinstance([],Iterable)) #True
print(isinstance(Student(),Iterable)) #Falseprint(hasattr([],'__getitem__')) #True
print(hasattr(Student(),'__getitem__'))  #False

什么是迭代器?

迭代器就是实现了__next____iter__方法(缺一不可)的对象,就叫迭代器。

其实__iter__方法返回迭代器自身,__next__方法不断返回迭代器中的下一个值,直到容器中没有更多的元素时则抛出Stoplteration异常,以终止迭代。

为什么有了可迭代对象,还要有迭代器呢?

工厂模式(需要什么数据就生成什么数据),节约内存空间

from itertools import countcounter = count(start=10)
print(type(counter))
print(dir(counter))
print(next(counter))
print(next(counter))
for i in range(100):print(next(counter))
print(len(counter))    #报错,迭代器没有len属性print(isinstance(counter,Iterator))  #True
print(isinstance([],Iterator))   # False
a= [1,2,3,45,6]
#将a这个可选代对象转变为选代器对象
a_iter = iter(a)
print(type(a_iter))print(len(a_iter))  #报错,没有len属性
print(next(a_iter))
print(next(a_iter))
for item in a iter:print(item)
for item in a_iter:print(item)
for item in a:print(item)
# print(next(a iter)) #报错

生成器中yield关键字的作用?

1.程序每次在代码中遇到yield关键字后,会返回结果

2.保留当前函数的运行状态,等待下一次调用,下次调用时从上一次返回yield的语句处开始执行后面的语句

生成器是一种特殊的迭代器

def demo():print('hello')t=yield 5 # returnprint('world')print(t)def demo1():print('hello')return 5
print(type(demo()))
print(dir(demo()))c = demo() #没有执行生成器函数 这行代码没有输出代表没有执行生成器函数a = demol() #普通函数,在调用时直接执行 这行代码执行输出的结果是'hello'
print(next(c)) #预激活生成器  这行代码执行输出的是'hello''5'print(c.send(None))
c.spend('test') #send方法调用生成器并且把test字符串传入到生成器内部

def demo():print('hello')t=yield5 #returnprint('world')print(t)
def demo1():print('hello')return 5print(type(demo()))
print(dir(demo()))c=demo() #没有执行生成器函数 这个步骤的时候没有执行生成器!!!
a=demo1() #普通函数,在调用时直接执行
print(next(c))# 预激活生成器
# 这个步骤执行生成器了!!!yield是执行一次先返回结果,下一次保留之前的状态,然后执行yield后的代码
print(c.send(None))
c.send('test') # send方法调用生成器并且把test字符串传入到生成器内部 

相关文章:

  • linux ip命令使用
  • npm run build报Cannot find module错误的解决方法
  • 容器技术介绍
  • 卷积神经网络(CNN)图像处理与识别原理
  • CE认证大电流计量装置
  • 如何把PDF样本册转换为网址链接
  • 护眼台灯哪个品牌更好?五款由专业眼科医生推荐的护眼台灯
  • 什么是ISO9001认证
  • STM32嵌入式编程学习到提高:【4】UART串口打印
  • DNS与host文件
  • GloVe(全局词向量嵌入)
  • 【Linux】环境变量(初步认识环境变量)
  • openpnp - 散料飞达不要想着做万能版本,能够贴合现有的物料就好
  • 如何在Mac上查看剪贴板历史记录
  • C/C++—有关日期类的OJ题
  • 0基础学习移动端适配
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • gitlab-ci配置详解(一)
  • HTTP中GET与POST的区别 99%的错误认识
  • Java 最常见的 200+ 面试题:面试必备
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript设计模式之工厂模式
  • Python中eval与exec的使用及区别
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Vue官网教程学习过程中值得记录的一些事情
  • 大快搜索数据爬虫技术实例安装教学篇
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 关于List、List?、ListObject的区别
  • 基于web的全景—— Pannellum小试
  • 前嗅ForeSpider教程:创建模板
  • 转载:[译] 内容加速黑科技趣谈
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • Java总结 - String - 这篇请使劲喷我
  • 国内开源镜像站点
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #QT(串口助手-界面)
  • #Ubuntu(修改root信息)
  • #知识分享#笔记#学习方法
  • (12)Linux 常见的三种进程状态
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (多级缓存)多级缓存
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (十八)SpringBoot之发送QQ邮件
  • (十五)、把自己的镜像推送到 DockerHub
  • (未解决)macOS matplotlib 中文是方框
  • (源码分析)springsecurity认证授权
  • (转)【Hibernate总结系列】使用举例
  • .net 7和core版 SignalR
  • .netcore如何运行环境安装到Linux服务器
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验