day13----迭代器、生成器、枚举对象
一、迭代器:
- 定义: (从装有多个值的容器中一次取出一个值给外界)
- 器:迭代器是个容器,包含多个值
- 迭代:循环反馈,从容器中一次取出一个值
- 迭代器不同于索引取值,但是也可以从容器对象中从前往后逐个返回内部的值
- 优缺点:
- 优点:可以不依赖索引完成取值
- 缺点:不能计算长度,不能从指定位置取值
- 可迭代对象:
- 内置有__iter__()方法的对象就是可迭代对象
- 对象:是装有地址的变量
- 可迭代:该对象装有__iter__()方法
- str、list、tuple、dict、set、range()、enumerate()、file、生成器对象等都是可迭代对象
- 迭代器对象
- 内置有__next__()方法的对象都是迭代器对象,可以通过调用__next__()方法来完成取值,获取规则是从前往后一次只能取一个值
- 迭代器对象:enumerate()、file、生成器对象等
- 注意:迭代器对象调用iter()方法后返回的额还是迭代器对象本身
- 定义: (从装有多个值的容器中一次取出一个值给外界)
# 遍历对象必须是有序容器:
ls1 = 'abdasdj'
ls = [1, 2, 3, 4, 5]
i = 0
while i < len(ls):
print(ls[i])
i += 1 st = {1, 2, 3, 4, 5}
dic = {'a': 1, "b": 2, 'c': 3} # 可迭代对象概念:
# 对象:装有地址的变量
# 可迭代对象: 该对象有 __iter__()方法 [].__iter__()
{}.__iter__()
().__iter__()
{1, }.__iter__() # 可迭代对象通过调用__iter__()方法得到迭代器对象
# 迭代器对象就可以做到不依赖索引取值(一次从容器中取出一个值)
# 迭代器对象都有__next__()方法,且通过该方法获取容器中的值,获取规则从前往后取一个值 # 可迭代对象
st1 = {1, 2, 7, 4, 5}
iter_obj = st1.__iter__() # <set_iterator object at 0x0000000001E98C18>
print(iter_obj)
print([1, 2, 3].__iter__()) # <list_iterator object at 0x0000000001E8EB00> # 迭代器对象:取一个值少一个值,超出数量就报异常
print(iter_obj.__next__()) #
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 对异常进行捕获并处理 print("____________________________________________")
# 迭代器对象不能求长度(内部的值的个数) iter_obj = st1.__iter__()
while True: try:
ele = iter_obj.__next__()
print(ele)
except StopIteration:
print('取完了')
break print("=========================================================")
# for 循环迭代器,自带异常处理的while循环,自动获取被迭代的对象的迭代器对象 iter_obj = st1.__iter__()
for ele in iter_obj:
print(ele) print("++++++++++++++++++++++++++++++++")
for ele in st1: # 自动完成 for ele in st1.__iter__(): 2.自动完成异常处理
print(ele) print('|||||||||||||||||||||||||||||||||||||||||||||||||||||||')
# 总结:
# 可迭代对象:有__iter__方法的对象,调用该方法返回迭代器对象
# 迭代器对象:有__next__方法的对象,也就是该方法一次从迭代器对象中获取一个值,取一个少一个
# for 循环迭代器:
# 1.自动获取被迭代对象的迭代器对象:
# 2.在内部一次一次调用—__next__()方法取值:
# 3.自动完成异常处理 # 可迭代对象.__iter__()得到的是该对象的迭代器对象
# 迭代器对象.__iter__()得到的就是迭代器对象本身
二、生成器
- 定义:一次返回一个值的容器,生成器内部包含yield关键字的函数。在python中使用了yield 关键字的函数被称为生成器(generator)
- 注意:生成器在被调用的过程中不会执行函数,而是返回一个生成器对象。与普通函数不同的是,生成器是一个返回迭代器对象的函数,只能用于迭代操作,更简单点理解生成器就是个迭代器,调用一次生成器返回一个迭代器对象。
def g_fn():
print(11111111111)
yield '结果1'
print(22222222222222)
yield '结果2'
print(2222444444444444422)
yield '结果3'
print(2233333333333332)
yield '结果4' g_obj = g_fn()
r1 = g_obj.__next__() # 在函数内部执行一次,在遇到下一个yield的时候停止,且可以拿到 yield 的返回值
print(r1) # 从上一次停止的位置接着往下走,在遇到下一个yield的时候停止,且拿到yield的返回值
r2 = g_obj.__next__()
print(r2)
print('____________________________________________') for i in g_obj:
print(i) print('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++') # 生成器的应用案例
# 当访问的数据资源过大,可以将数据用生成器处理,一次值获取所有文件内容的一条资源 def my_range(min, max=0, step=1):
if max == 0:
min, max = max, min
tag = min
count = step
while True:
yield tag
tag += count
if tag >= max:
break range_obj = my_range(5, 10)
for i in range_obj:
print(i) # 文件读取就是典型的生成器的应用
三、枚举对象(enumerate)
enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同事列出数据和数据下标,一般用在for 循环当中。
语法: enumerate(sequence,[start = 0])
参数:sequence--一个序列,迭代器或其他支持迭代对象
start--下标起始位置
返回值:返回enumerate(枚举)对象
# -*- coding: utf-8 -*-
# for 循环普通形式的遍历
i = 0
seq = ['q', 'z', 'k']
for ele in seq:
print(i, seq[i])
i += 1 # 0 q
# 1 z
# 2 k # for 循环加入enumerate()
for i, ele in enumerate(seq, start=0):
print(i, ele) # 0 q
# 1 z
# 2 k
for i, v in enumerate('abc'): # 生成迭代器对象:[(0, 'a'),(1, 'b'), (2, 'c')]
print(i, v)
day13----迭代器、生成器、枚举对象的更多相关文章
- day14带参装饰器,迭代器,可迭代对象 , 迭代器对象 ,for迭代器 , 枚举对象
复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰 ...
- python 全栈开发,Day13(迭代器,生成器)
一.迭代器 python 一切皆对象 能被for循环的对象就是可迭代对象 可迭代对象: str,list,tuple,dict,set,range 迭代器: f1文件句柄 dir打印该对象的所有操作方 ...
- python之迭代器 生成器 枚举 常用内置函数 递归
迭代器 迭代器对象:有__next__()方法的对象是迭代器对象,迭代器对象依赖__next__()方法进行依次取值 with open('text.txt','rb',) as f: res = f ...
- python 迭代器/生成器/迭代对象
生成器: 带有yield的函数 迭代器:带有next 方法的对象,可以作为内建函数next的参数 迭代对象:带有__iter__方法的对象,__iter__方法返回迭代器 -------------- ...
- 周末学习笔记——day02(带参装饰器,wraps修改文档注释,三元表达式,列表字典推导式,迭代器,生成器,枚举对象,递归)
一,复习 ''' 1.函数的参数:实参与形参 形参:定义函数()中出现的参数 实参:调用函数()中出现的参数 形参拿到实参的值,如果整体赋值(自己改变存放值的地址),实参不会改变,(可变类型)如果修改 ...
- Python—day13 迭代器、迭代器对象、for循环对象、生成器、枚举对象
一.迭代器 1.迭代器概念: 器:包含了多个值的容器 迭代:循环反馈(一次从容器在取出一个值) 迭代器:从装有多个值的容器在一次取出一个值 ls=[3,5,7,1,9] 遍历:被遍历的对象必须是有序容 ...
- day13 十三、迭代器、生成器、枚举对象
def my_generator(): print(1111) yield '结果1' print(2222) yield '结果2' print(3333) yield '结果3' print(44 ...
- python学习 day13 迭代器,生成器,枚举对象
一.复习 1.闭包:定义在函数内部的函数(被函数嵌套的函数) 2.装饰器:闭包的一个应用场景 -- 为一个函数添加新功能的工具 3.开放封闭原则:不能修改源代码,不能修改调用方式,但可以对外提供增加新 ...
- day 13 迭代器、可迭代对象、迭代器对象、生成器、生成器对象、枚举对象
迭代器大概念 # 迭代器:循环反馈的容器(集合类型)# -- 不同于索引取值,但也可以循环的从容器对象中从前往后逐个返回内部的值# 优点:不依赖索引,完成取值# 缺点:不能计算长度,不能指定位取值( ...
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
随机推荐
- Django下自定义标签和过滤器
---恢复内容开始--- 第一步:确保setting中的INSTALL_APPS配置当前的app,要不然Django无法找到自定义的simple_tag. 第二步:在app中创建templatetag ...
- 人工智能改进传统云ERP的10种方法
http://blog.itpub.net/31542119/viewspace-2168809/ 随着数字化转型的进程加快,企业开始重新评估ERP的作用.传统ERP经过多年僵硬化定制过于追求生产的一 ...
- SAP MM GR-based IV, 无GR不能IV?
SAP MM GR-based IV, 无GR不能IV? 如下的采购订单, 没有做过收货, ITEM的details里却勾选了’GR-Bsd IV’ 选项. 此时试图直接针对该PO#450260713 ...
- DAY3(PYTHON)字符串切片
字符串调整: capitalize() #首字母大写 upper() #全大写 lower() #全小写 swapcase() #大小写翻转 字符串切片: 顾头不顾尾!!! ...
- springboot 学习之路 3( 集成mybatis )
目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...
- MySQL Innodb数据库误删ibdata1后MySQL数据库的恢复案例
上周,以前公司的同事朋友找我帮忙,看看能否帮忙恢复一个MySQL 数据库,具体情况为:数据库版本为MySQL 5.6(具体版本不清楚),也不清楚具体的数据库引擎; 没有数据库备份,只剩下数据库下面 ...
- django 下载文件
方法一. from django.http import StreamingHttpResponse def big_file_download(request): # do something... ...
- Add correct host key in /root/.ssh/known_hosts to get rid of this message
bug: Add correct host key in /root/.ssh/known_hosts to get rid of this message 解决办法: rm ~/.ssh/known ...
- Django之--POST方法处理表单请求
上一篇:Django之--MVC的Model 演示了如何使用GET方法处理表单请求,本文讲述直接在当前页面返回结果,并使用更常用的POST方法处理. 一.首先我们修改下page.html <!D ...
- SQL Server最大内存设为0后的处置办法
故障说明: 远程调整实例内存时疏忽,将实例最大内存调整为了0,因此最大内存变成了128MB的最小值. 解决方式: 1.正常关闭SQL Server服务,如果是集群,需要先关停止集群角色防止故障转移,然 ...