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

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

装饰器

什么是装饰器?

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

装饰器的两个基本原则:

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

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

什么是可迭代对象?

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

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

方法一:isinstance+iterable

方法二:hasattr+__getitem__

from collections import Iterable

class Student:
    pass
print(isinstance([],Iterable)) #True
print(isinstance(Student(),Iterable)) #False

print(hasattr([],'__getitem__')) #True
print(hasattr(Student(),'__getitem__'))  #False

什么是迭代器?

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

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

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

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

from itertools import count

counter = 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 # return
    print('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 #return
    print('world')
    print(t)
def demo1():
    print('hello')
    return 5

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


http://www.kler.cn/a/321863.html

相关文章:

  • Java I/O(输入/输出)——针对实习面试
  • java基础入门学习09-迭代器
  • Android 13 实现屏幕熄屏一段时候后关闭 Wi-Fi 和清空多任务列表
  • Brave127编译指南 Windows篇:部署Node.js(五)
  • 必修 -- 常用笔试题
  • 硬件工程师之电子元器件—二极管(4)之热量对二极管温度特性的影响
  • 国产游戏出海火热另一面:AI和API快速成长引发网络安全挑战
  • 机器人顶刊IEEE T-RO发布无人机动态环境高效表征成果:基于粒子的动态环境连续占有地图
  • OpenHarmony(鸿蒙南向)——平台驱动指南【MIPI CSI】
  • django使用笔记6--docker部署
  • 【Python语言初识(五)】
  • 【计算机网络】传输层协议TCP
  • python功能测试
  • 跟随Facebook的足迹:社交媒体背后的探索之旅
  • vue打包exe之electron-quick-start的npm install 报错
  • 丢失照片/消息/文件,当发现没有备份 Android 手机数据时急救方法
  • Java面试篇基础部分-Semaphore及其用法详解
  • 数据结构-线性表的单链式存储结构图解及C语言实现
  • 都说网络安全缺口那么大,但为何招聘数量却不多?总算明白了!
  • Linux系统部署Mysql8.x修改密码并且设置远程连接
  • UniApp基于xe-upload实现文件上传组件
  • electron的常用弹窗简单案例
  • 15年408-数据结构
  • 老人跌倒扶不扶?涪城三职工给出响亮答案
  • 【docker】在IDEA工具内,远程操作服务器上的docker
  • Rust Web开发常用库