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.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
随机推荐
- 微信小程序 JS 获取View 和 屏幕相关属性(高度、宽度等等)
wx.getSystemInfo({success: function (res) {thisWidth = res.windowWidth;}}); that.setData({view_Width ...
- JavaScript 比较 和 逻辑运算符
比较运算符 比较运算符在逻辑语句中使用,以测定变量或值是否相等. === 绝对等于(值和类型均相等) != 不等于 !== 不绝对等于(值和类型有一个不相等,或两个都不相等) > 大于 & ...
- Nginx 动静分离
Tomcat 能处理静态资源和动态资源,但是处理静态资源效率并不高,处于优化性能,提高访问效率,可以让 Tomcat 处理动态资源,让 Nginx 处理静态资源 1,配置虚拟主机 该配置的意思是:js ...
- Android 实现锚点定位
相信做前端的都做过页面锚点定位的功能,通过<a href="#head"> 去设置页面内锚点定位跳转. 本篇文章就使用tablayout.scrollview来实现an ...
- Python基于Python实现批量上传文件或目录到不同的Linux服务器
基于Python实现批量上传文件或目录到不同的Linux服务器 by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/rootpath_fo ...
- Android项目实战(五十):微信支付 坑总结
大部分APP必备需求,使用总结 Android接入文章在此:官方文档 文档很简单,Android分为四步: 1.后台配置 2.Android 内 注册appId 3.Android 内 调起支付 4. ...
- Javascript数组系列二之迭代方法1
我们在<Javascript数组系列一之栈与队列 >中介绍了一些数组的用法.比如:数组如何表现的和「栈」一样,用什么方法表现的和「队列」一样等等一些方法,因为 Javascript 中的数 ...
- JMeter—常见问题(十四)
参考<全栈性能测试修炼宝典JMeter实战>第十五章 JMeter常见问题 1.无法产生负载 注意检查各元件是否时禁用状态.JMeter在运行时是以数形式加载各种元件的,如果父节点被禁用, ...
- Python学习手记
1.Python大小敏感.print写作PRINT或Print是不对.2.注释符是“#”,而非“//”.3.语句结尾不必须分号.4.转义符为“/”+转义字母.这点与刀莱特一致.5.单引号输入使用“/' ...
- Powershell测试端口状态
function Test-Port { Param([string]$ComputerName,$port = 5985,$timeout = 1000) try { $tcpclient = Ne ...