函数 (四) 迭代器和生成器
时间:2022-05-08
本文章向大家介绍函数 (四) 迭代器和生成器,主要内容包括一 迭代器、二 为何要有迭代器?什么是可迭代对象?什么是迭代器对象?、三 迭代器对象的使用、四 for循环、五 迭代器的优缺点、二 生成器、二 生成器就是迭代器、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
一 迭代器
一 迭代的概念
#迭代器即迭代的工具,那什么是迭代呢?
#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
while True: #只是单纯地重复,因而不是迭代
print('===>')
l=[1,2,3]
count=0
while count < len(l): #迭代
print(l[count])
count+=1
二 为何要有迭代器?什么是可迭代对象?什么是迭代器对象?
1 #1、为何要有迭代器?
2 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器
3
4 #2、什么是可迭代对象?
5 可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下
6 'hello'.__iter__
7 (1,2,3).__iter__
8 [1,2,3].__iter__
9 {'a':1}.__iter__
10 {'a','b'}.__iter__
11 open('a.txt').__iter__
12
13 #3、什么是迭代器对象?
14 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
15 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
16
17 文件类型是迭代器对象
18 open('a.txt').__iter__()
19 open('a.txt').__next__()
20
21
22 #4、注意:
23 迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象
三 迭代器对象的使用
1 dic={'a':1,'b':2,'c':3}
2 iter_dic=dic.__iter__() #得到迭代器对象,迭代器对象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身
3 iter_dic.__iter__() is iter_dic #True
4
5 print(iter_dic.__next__()) #等同于next(iter_dic)
6 print(iter_dic.__next__()) #等同于next(iter_dic)
7 print(iter_dic.__next__()) #等同于next(iter_dic)
8 # print(iter_dic.__next__()) #抛出异常StopIteration,或者说结束标志
9
10 #有了迭代器,我们就可以不依赖索引迭代取值了
11 iter_dic=dic.__iter__()
12 while 1:
13 try:
14 k=next(iter_dic)
15 print(dic[k])
16 except StopIteration:
17 break
18
19 #这么写太丑陋了,需要我们自己捕捉异常,控制next,python这么牛逼,能不能帮我解决呢?能,请看for循环
四 for循环
#基于for循环,我们可以完全不再依赖索引去取值了
dic={'a':1,'b':2,'c':3}
for k in dic:
print(dic[k])
#for循环的工作原理
#1:执行in后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic
#2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码
#3: 重复过程2,直到捕捉到异常StopIteration,结束循环
五 迭代器的优缺点
#优点:
- 提供一种统一的、不依赖于索引的迭代方式
- 惰性计算,节省内存
#缺点:
- 无法获取长度(只有在next完毕才知道到底有几个值)
- 一次性的,只能往后走,不能往前退
二 生成器
一 什么是生成器
#只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码
def func():
print('====>first')
yield 1
print('====>second')
yield 2
print('====>third')
yield 3
print('====>end')
g=func()
print(g) #<generator object func at 0x0000000002184360>
二 生成器就是迭代器
g.__iter__
g.__next__
#2、所以生成器就是迭代器,因此可以这么取值
res=next(g)
print(res)
- 程序员偷偷深爱的 9 个不良编程习惯
- 低级程序员和高级程序员的区别
- Silverlight学习(二)
- Silverlight学习(三)
- ArcGIS for Android学习(一)
- Arcgis for Silverlight学习(一)
- ImageButton与Button
- RadioButton、CheckBox与ToggleButton
- Silverlight学习(五)图形标绘
- radio与checkbox
- JavaScript之cookie
- Silverlight学习(四) domainservice动态多条件查询
- Android学习Tabhost、gallery、listview、imageswitcher
- ProgressBar、RatingBar和Spinner控件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android设置控件阴影的三种方法
- Android Studio 引入 aidl 文件的方法汇总
- Android 点击生成二维码功能实现代码
- Android屏幕手势检测的实现代码
- Android开发实现简单的观察者与被观察者示例
- Android开发中4个常用的工具类【Toast、SharedPreferences、网络及屏幕操作】
- Android实现客户端语音动弹界面实例代码
- Android封装MVP实现登录注册功能
- Android5.1系统通过包名给应用开放系统权限的方法
- android 上传aar到私有maven服务器的示例
- Android Studio开发环境搭建教程详解
- android事件总线EventBus3.0使用方法详解
- Android仿淘口令复制弹出框功能(简答版)
- Android实现简单断点续传和下载到本地功能
- Android用MVP实现一个简单的类淘宝订单页面的示例