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.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
随机推荐
- blfs(systemd版本)学习笔记-构建gnome桌面系统后的配置及安装的应用
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.构建安装ibus-libpinyin的笔记地址:https://www.cnblogs.com/renren-study-n ...
- js 常用正则表达式
1 用户名正则 //用户名正则,4到16位(字母,数字,下划线,减号) var uPattern = /^[a-zA-Z0-9_-]{4,16}$/; //输出 true console.log(uP ...
- 纯CSS+HTML实现checkbox的思路与实例
checkbox应该是一个比较常用的html功能了,不过浏览器自带的checkbox往往样式不怎么好看,而且不同浏览器效果也不一样.出于美化和统一视觉效果的需求,checkbox的自定义就被提出来了. ...
- 2018-06-21 中文代码示例视频演示Python入门教程第五章 数据结构
知乎原链 续前作: 中文代码示例视频演示Python入门教程第四章 控制流 对应在线文档: 5. Data Structures 这一章起初还是采取了尽量与原例程相近的汉化方式, 但有些语义较偏(如T ...
- Android为TV端助力 关于android的一些基础知识
怕自己以后忘了,所以在这里先写写! equal和==的区别是,一个用于判断字符串,一个用于判断int是否相等 equal比较的是对象,==比较的是值
- Azure SQL Virtual Machine报Login failed for user 'NT Service\SqlIaaSExtension'. Reason: Could not find a login matching the name provided
在一台位于HK的Azure SQL Virtual Machine上修改排序规则,重建系统数据库后,监控发现大量的登录失败告警生成,如下所示: DESCRIPTION: Login failed f ...
- SQL Server中sp_spaceused统计数据使用的空间总量不正确的原因
很多时候,我们经常使用sp_spaceused来查看表的空间使用情况,上个月群里有个网友说他使用DELETE删除了数据后,使用sp_spaceused查看,发现该表的分配的空间总量(reserved) ...
- C#实现CRC校验
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web; ...
- Windows Server 2016-Nano Server介绍
WindowsServer 2016 提供了新的安装选项:Nano Server.Nano Server 是针对私有云和数据中心进行优化的远程管理的服务器操作系统. 类似于 Windows Serve ...
- LeetCode算法题-Count Primes(Java实现)
这是悦乐书的第190次更新,第193篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第49题(顺位题号是204).计算小于非负数n的素数的数量.例如: 输入:10 输出:4 ...