def my_generator():
print(1111)
yield '结果1'
print(2222)
yield '结果2'
print(3333)
yield '结果3'
print(4444)
yield '结果4'
g_obj = my_generator() # my_generator()并不会执行函数体,得到的返回值就是生成器对象,生成器对象就是迭代器对象 r1 = g_obj.__next__()
print(r1) # 在函数内部执行一次,在遇到下一个yield时停止,且可以拿到yield的返回值
r2 = g_obj.__next__()
print(r2) # 从上一次停止的位置紧着往下走,在再遇到下一个yield时停止,且可以拿到yield的返回值 # 生成器可以被for循环迭代 for v in g_obj:
print(v)

一、迭代器概念

1、迭代器:从装有多个值的容器中一次取出一个值给外界

ls = [100, 200, 300, 400, 500]    # 被遍历的对象必须是有序容器
i = 0
while i < len(ls):
print(ls[i])
i += 1 通过迭代器取值优缺点:
优点:不依赖索引完成取值
缺点:不能计算长度,不能指定位置取值(只能从前往后逐一取值)

2、可迭代对象:该对象有__iter__方法

有哪些:str、list、tuple、dict、set、range()、file、迭代器对象、enmerate()、生成器

[].__iter__()().__iter__(){}.__iter__(){}1,}.__iter__()

可迭代对象通过__iter__方法得到迭代器对象

3、迭代器对象:有__next__方法

通过该方法获得容器中的值,获取规则,从前往后,一次一个。

迭代器对象可以做到不依赖索引取值(一次从容器中取出一个值)

有哪些:file、ensumerate()、生成器

从迭代器对象中取元素,取一个少一个,如果要从头开始取,需要重新获得拥有所有元素的迭代器对象

迭代器对象也有__iter__()方法,调用后得到的是自己本身(当前含有几个元素,得到的就只有几个元素的迭代器对象)

# 可迭代对象
ls = [1,2,3,4,5]
# 迭代器对象
iter_obj = ls.__iter__()
print(iter_obj) # <list_iterator object at 0x00000000021E75C0>
print([1,2,3,4,5].__iter__()) # 结果为 <list_iterator object at 0x0000000002207780> # 迭代器对象取一个值就少一个值
ls = [100, 200, 300, 400, 500]
iter_obj = ls.__iter__()
print(iter_obj.__next__()) #
print(iter_obj.__next__()) #
print(iter_obj.__next__()) #
print(iter_obj.__next__()) #
print(iter_obj.__next__()) #
# print(iter_obj.__next__()) # 值取完了就抛异常StopIteration,可以通过try对异常捕获并处理 # 上一个迭代器对象迭代取值完毕后,就取空了,如果要再次取值,要重新生成迭代器对象
# iter_obj =ls.__iter__()
# 迭代器对象不能求长度(内部值的个数)
ls = [100,200,300,400,500]
iter_obj = ls.__iter__()
while True:
try:
ele = iter_obj.__next__()
print(ele)
except StopIteration:
print('取完了')
break

4、for循环迭代器

自带异常处理的while循环,自动获取被迭代对象的迭代器对象

ls = [100,200,300,400,500]
iter_obj = ls.__iter__()
for ele in iter_obj:
print(ele) for ele in ls: # 1.自动完成 for ele in st1.__iter__(): 2.自动完成异常处理
print(ele)

5、总结

①可迭代对象:有__iter__()方法的对象,采用该方法可以得到迭代器对象

②迭代器对象:有__next__()方法的对象,用该方法可以从可迭代对象中一次获取一个值,取出一个少一个

③for循环迭代器:

自动获取被迭代对象的迭代器对象

在内部一次次调用__next__()方法取值

自动完成异常处理

obj = [100, 200, 300].__iter__()
for v in obj:
print(v)
if v == 200:
break
# 结果为 obj = [100, 200, 300].__iter__()
print(obj.__iter__().__iter__().__iter__() is obj) # True可迭代对象.__iter__()得到的是该对象的迭代器对象迭代器对象.__iter__().__iter__()得到的就是迭代器对象本身

二、生成器

1、生成器:就是一个迭代器对象

包含yield关键字的函数就是生成器

该函数名()得到的是生成器对象,不会执行函数体

def fn():
print('我是生成器')
yield 'god'
generator_obj = fn()
print(generator_obj) # 结果为 <generator object fn at 0x0000000001DF0EB8>
print(type(generator_obj)) # 结果为 <class 'generator'> generator_obj.__iter__() # 可迭代对象
generator_obj.__next__() # 迭代器对象

2、生成器的应用案例:

当访问的数据资源过大,可以将数据用生成器处理,一次只获取所有内容的一条资源

def my_range(min,max=0,step=1):
tag = min
while True:
if tag >= max:
break
yield tag
tag += step range_obj = my_range(5, 10,1 )
for i in range_obj:
print(i)

三、枚举对象

通过for迭代器,循环遍历可迭代对象,需要知道迭代的索引

ls = [100, 200, 300, 400, 500]
count = 0
for v in ls:
print(count,v)
count +=1
# 结果为0 1001 2002 3003 4004 500 ls = [100,200,300,400,500]
for count, v in enumerate(ls):
print(count, v)
# 结果为0 1001 2002 3003 4004 500

day13 十三、迭代器、生成器、枚举对象的更多相关文章

  1. day14带参装饰器,迭代器,可迭代对象 , 迭代器对象 ,for迭代器 , 枚举对象

    复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰 ...

  2. python之迭代器 生成器 枚举 常用内置函数 递归

    迭代器 迭代器对象:有__next__()方法的对象是迭代器对象,迭代器对象依赖__next__()方法进行依次取值 with open('text.txt','rb',) as f: res = f ...

  3. python 迭代器/生成器/迭代对象

    生成器: 带有yield的函数 迭代器:带有next 方法的对象,可以作为内建函数next的参数 迭代对象:带有__iter__方法的对象,__iter__方法返回迭代器 -------------- ...

  4. 周末学习笔记——day02(带参装饰器,wraps修改文档注释,三元表达式,列表字典推导式,迭代器,生成器,枚举对象,递归)

    一,复习 ''' 1.函数的参数:实参与形参 形参:定义函数()中出现的参数 实参:调用函数()中出现的参数 形参拿到实参的值,如果整体赋值(自己改变存放值的地址),实参不会改变,(可变类型)如果修改 ...

  5. Python—day13 迭代器、迭代器对象、for循环对象、生成器、枚举对象

    一.迭代器 1.迭代器概念: 器:包含了多个值的容器 迭代:循环反馈(一次从容器在取出一个值) 迭代器:从装有多个值的容器在一次取出一个值 ls=[3,5,7,1,9] 遍历:被遍历的对象必须是有序容 ...

  6. python学习 day13 迭代器,生成器,枚举对象

    一.复习 1.闭包:定义在函数内部的函数(被函数嵌套的函数) 2.装饰器:闭包的一个应用场景 -- 为一个函数添加新功能的工具 3.开放封闭原则:不能修改源代码,不能修改调用方式,但可以对外提供增加新 ...

  7. day 13 迭代器、可迭代对象、迭代器对象、生成器、生成器对象、枚举对象

    迭代器大概念 # 迭代器:循环反馈的容器(集合类型)# -- 不同于索引取值,但也可以循环的从容器对象中从前往后逐个返回内部的值​# 优点:不依赖索引,完成取值# 缺点:不能计算长度,不能指定位取值( ...

  8. DAY13、迭代器,生成器,枚举

    一.迭代器 1.通过迭代器取值的优缺点 优点:不依赖索引取值,完成取值 缺点:不能计算长度,不能指定位取值(只能从前往后逐一取值) 2.可迭代对象 可迭代对象是有—iter—()方法的对象,调用该方法 ...

  9. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

随机推荐

  1. DLLImport的用法C#

    它来调用WIN32的API或者调用一下C或C++编写的DLL.使用实例:将编译好的C++ DLL拷贝到BIN目录(DLLImport会从程序启动目录BIN开始查找相应名称的DLL,未找到则转至syst ...

  2. 海康威视(iOS集成)

    一.注意事项 1.在开发海康威视的SimpleDemo时,最好使用真机,因为海康提供的5个库不支持模拟的i386架构. 2.在XCode9.3版本上运行SimpleDemo时,对.mm文件进行编辑时, ...

  3. 阿里云oss缩略图如何产生读取 超简单 不看后悔(转)

    OSS是使用通过URL尾部的参数指定图片的缩放大小 图片路径后面拼接如下路径: ?x-oss-process=image/[处理类型],x_100,y_50[宽高等参数] ?x-oss-process ...

  4. springboot 项目中读取资源文件内容 如图片、文档文件

    1 问题描述:在 springboot 项目中有时候会需要读取一些资源文件,例如 office的 docx 文档或者 png.jpg的图片.在多模块项目中资源文件需要放到启动项目的 Resources ...

  5. Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc dtS312 s2018 s3f doc compc\Atitit PathUtil 工具新特性新版本 v8 s312.docx s2018 s3f doc compc\Atitit 操作日

    Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc ...

  6. mybatis查询结果和接收的不一样

    记一次大坑:mybatis查询结果和接收的不一样,折腾我好几个小时. 先上代码:代码是要查询排名,sql执行的结果 SELECT b.operator_id, b.class_count, b.cla ...

  7. JS保留两位小数的几种方法

    四舍五入 以下处理结果会四舍五入: var num =2.446242342; num = num.toFixed(2); // 输出结果为 2.45 不四舍五入 以下处理结果不会四舍五入: 第一种, ...

  8. Java反射+简单工厂模式总结

    除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...

  9. [Z] C#程序中设置全局代理(Global Proxy)

    https://www.cnblogs.com/Javi/p/7274268.html 1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1        ...

  10. Altium Designer学习---如何进行SI仿真

    Altium designer 如何进行SI仿真. 1.仿真电路中需要至少一块集成电路: 2.器件的IBIS模型: 3.在规则中必须设定电源网络和地网络: 4.建立SI规则约束: 5.层堆栈必须设置正 ...