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.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
随机推荐
- loadrunner 脚本优化-参数化之Parameter List参数同行取值
脚本优化-参数化之Parameter List参数同行取值 by:授客 QQ:1033553122 select next row 记录选择方式 Same line as,这个选项只有当参数多余一个时 ...
- Android TextView自动换行、排列错乱问题及解决
解决之前层次不齐的排版截图,如下图: 解决之后的整齐排版截图,如下图: 今天忽然发现android项目中的文字排版参差不齐的情况非常严重,不得不想办法解决一下 ...
- leetcode-26.删除重复数组中的重复项
leetcode-26.删除重复数组中的重复项 题意 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数 ...
- Wu反走样算法绘制直线段
Wu反走样算法 原理:在我看来,Wu反走样算法是在Bresenham算法基础上改进了一番,它给最靠近理想直线/曲线的两个点以不同的亮度值,以达到模糊锯齿的效果.因为人眼看到的是线附近亮度的平均值. M ...
- python语言学习--2
第三天1. python代码缩进规则:具有相同缩进的代码被视为代码块,4个空格, 不要使用Tab,更不要混合Tab和空格,否则很容易造成因为缩进引起的语法错误. 2.list:[...] 用(名称任意 ...
- Pycharm启动后加载anaconda一直updating indices造成Pycharm闪退甚至电脑崩溃
可能跟anaconda文件夹有一定关系 网上找找解决方案,似乎很多人有同样的困扰! 知乎-pycharm启动后总是不停的updating indices...indexing? stackoverfl ...
- c++预声明类引发的无法解析外部符号问题
在VisualStudio下开发C++程序常遇到链接问题就是:LNK2019 无法解析外部符号. 这个问题一般我们认为是没有将引用的代码链接到当前项目造成,也有例外,就是下面我要说的预声明类导致的. ...
- 关于正餐智能POS6.0.1.1改版后,点击反结账进入点菜界面后无法进行加菜的FAQ
适用版本:智能POS正餐V6.0.1.1+适用情况:点击反结账进入点菜界面后无法进行加菜.原因:为让报表统计的数据更准确解决方案:1.点击反结账,输入用户密码,进入点菜界面. 2.点击结算,进入收银台 ...
- SQL server 导出平面文件时出错: The code page on Destination - 3_txt.Inputs[Flat File Destination Input].Columns[UserId] is 936 and is required to be 1252.
我在导出平面文件时:Error 0xc00470d4: Data Flow Task 1: The code page on Destination - 3_txt.Inputs[Flat File ...
- SQL Server中sys.syslogin中updatedate字段的浅析
在系统视图sys.syslogins中,有createdate与updatedate两个字段,分别表示创建登录名与更新登录名的日期,如果你用updatedate的值来判断一个登录名的权限是否被修改过, ...