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. 同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

    POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...

  2. Unity应用架构设计(2)——使用中介者模式解耦ViewModel之间通信

    当你开发一个客户端应用程序的时候,往往一个单页会包含很多子模块,在不同的平台下,这些子模块又被叫成子View(视图),或者子Component(组件).越是复杂的页面,被切割出来的子模块就越多,子模块 ...

  3. SQL SERVER数据库删除LOG文件和清空日志的方案

    原文:SQL SERVER数据库删除LOG文件和清空日志的方案 数据库在使用过程中会使日志文件不断增加,使得数据库的性能下降,并且占用大量的磁盘空间.SQL Server数据库都有log文件,log文 ...

  4. iScroll的使用

    CDN: <script src="//ossweb-img.qq.com/images/js/iscroll_library/iscroll-5.2.0.js">&l ...

  5. s和t的特殊权限

    ls -l 通常会显示r w x权限,分别对应:读,写,执行权限. 但是有时我么会看到,s或t这类权限标识. eg: #include <unistd.h> #include <st ...

  6. /usr/bin/uwsgi --http :8888 --wsgi-file wsgi.py --master --processes 4 --threads 2

    /usr/bin/uwsgi --http :8888 --wsgi-file wsgi.py --master --processes 4 --threads 2 root 18756 0.0 0. ...

  7. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  8. Swagger UI 与SpringMVC的整合

    关于 Swagger Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API. S ...

  9. [转] tomcat 7/8 启动非常慢的解决方法

    在日志中发现启动慢的地方: -- ::] INFO o.s.c.s.DefaultLifecycleProcessor - Starting beans -- ::] INFO o.s.web.con ...

  10. FatFs文件系统的移植

    FatFs 的底层可以写一次命令,读写多个扇区.FatFs的设计的读写的思想就很好,小块的数据,我就经过Buffer来存储,大块的数据,我就直接进行存取,那样速度,效率高了很多,看图: FatFs文件 ...