博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
迭代器
阅读量:5301 次
发布时间:2019-06-14

本文共 3225 字,大约阅读时间需要 10 分钟。

一、迭代器

什么是迭代器?

迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果

迭代器:迭代取值的工具

为什么要用

迭代器给你提供了一种不依赖于索引取值的方式

1 l = [1,2,3,4,5]2 n = 03 while n < len(s):4         print(s[n])5         n += 1

需要迭代取值的类型:

字符串、列表、元组、字典、集合

二、可迭代对象

只有内置有__iter__方法的都叫做可迭代对象

基本数据类型中是可迭代对象的有:str、list、tuple、dict、set

文件对象(执行内置的__iter__之后还是本身,没有任何变化):文件对象本身就是迭代器对象。

三、迭代器对象

1.内置有__iter__方法

2.内只有__next__方法

ps:迭代器一定是可迭代对象

而可迭代对象不一定是迭代对象

1 l = [1,2,3,4] 2  3 iter_l = l.__iter__() 4  5 #迭代器取值 调用__next__ 6  7 print(iter_l,__next__()) 8  9 print(iter_l,__next__())10 11 #如果值取完了再想获取,就直接报错了

与前面不同的是,文件打开本身就有迭代。

文件打开过程:f1 = open('xxx.txt','r',encoding = 'utf-8')

调用f1内置的__iter__方法

iter_f = f1.__iter__()

PS:迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身

为了防止报错,我们针对这个报错功能有一个异常处理:

1 d = {
'name':'jason','password':'123','hobby':'泡m'}2 iter_d = d.__iter__()3 while True:4 try:5 print(iter_d.__next__())6 except StopIteration:7 print('无法再获取更多')8 break

迭代器取值特点:只能一次往后取值,不能后退

四、for循环内部的本质

1.将in后面的对象调用__iter__转换成迭代器对象

2.调用__next__迭代取值

3.内部有异常捕获StopIteration,当无法再取值时,自动结束循环。

可迭代对象:内置有__iter__方法

迭代器对象:既内置有__iter__方法也内置有__next__方法

迭代取值优缺点:

优点:1.不依赖于索引值

           2.内存中永远只占一份空间,不会导致内存溢出

缺点:1.不能够获取指定的元素

           2.取完之后会报StopIteration错

五、生成器

生成器:用户自定义的迭代器,本质就是迭代器

1 def func(): 2     print('first') 3     yield 666 #函数内部如果有yield关键字,那么加括号执行时,并不会触发函数代码题的运行 4     print('second') 5     yield 777 6     print('third') 7     yield 888 8     print('forth') 9     yield 99910     yield11     yield12 #yield后面跟的值就是调用迭代器__next__方法你能得到的值13 #yield既可以返回一个值也可以返回多个值,并且多个值也是按照元组的形式返回14 g = func() #生成器初始化,将函数变成迭代器15 print(g)16 print(g.__next__())17 print(g.__next__())18 print(g.__next__())19 print(g.__next__())20 print(g.__next__())21 print(g.__next__())

自制range方法:

def my_range(start,end,step=1):    while start < end:        yield start        start += stepfor i in my_range(1,20,2):    print(i)

yield 支持外接为其传值:

def dinner(name):    print('%s开始吃'%name)    while True:        food = yield        print('%s吃了%s'%(name,food))g = dinner('jason')g.__next__() #必须先将代码运行至yield,才能够为其传值g.send('海底捞') #给yield左边的变量传参,触发了__next__方法g.send('黄焖鸡米饭')

yield

1.帮你提供了一种自定义生成器方式

2.会帮你将函数的运行状态暂停住

3.可以返回值

比较return与yield之间的异同点:

相同点:都可以返回值,而且都可以返回多个值

不同点:1.yield可以多次的返回值,而return只能返回一次后终止函数

              2.yield还可以接受外部传入的值

生成器表达式:

res = (i for i in range(1,10) if i !=4)print(res)

生成器不会主动执行任何一行代码,必须通过__next__触发代码的运行。

六、常用内置方法

1.abs()绝对值

print(abs(-11))

2.all()  any()

1 l = [0,1,2]2 print(all(l)) #只要有一个为Falese就返回False3 print(any(l)) #只要有一个位是True就返回True

3.globals() local()

globals():返回全局变量

local():返回局部变量,要在局部中使用

4.callable()

判断是否可调用

1 l = [1,2,3]2 def index():3     pass4 print(callable(l))5 print(callable(index))

5.chr() ord()

chr():将数字转换成ascii码表对应的字符

ord():将字符按照ascii码表转换成字符对应的数字

6.dir()

获取当前对象空间里面的名字

7.divmod()分页器

1 total_num,more = divmod(1000,12)2 if more:3     total_num+=14 print('总页数:',total_num)

8.enumerate枚举

1 l = ['a','b']2 for i,j in enumerate(l,1):3     print(i,j)

9.eval() exec()

识别字符串中的代码,并执行。但是eval不支持逻辑代码,只支持一些简单的python代码

10.isintance()

isintance后面统一该方法判断对象是否属于某个数据类型

1 n = [1,2,3,4]2 print(isinstance(n,list))

11.pow()

print(pow(2,3))

即计算2的3次方的结果

12.round对数字进行四舍五入

print(round(3.35))

七、面向过程编程

面向过程编程:就类似于设计一条流水线

好处:将复杂的问题流程化,从而变得简单

坏处:可扩展性差,一旦需要修改,整体会受到影响

 

 

 

 

 

转载于:https://www.cnblogs.com/spencerzhu/p/11191843.html

你可能感兴趣的文章
在cmd窗口中运行php命令
查看>>
浅议约瑟夫问题
查看>>
mysql数据库之存储引擎
查看>>
【刷题】BZOJ 2734 [HNOI2012]集合选数
查看>>
【刷题】BZOJ 2287 【POJ Challenge】消失之物
查看>>
通过 UI 管理 docker
查看>>
Linux ip netns 命令
查看>>
position三种属性的区别
查看>>
python进阶学习笔记(四)--多线程thread
查看>>
WCF http接口配置
查看>>
vue使用md5加密
查看>>
MyEclipse 2016 CI 4新增BootStrap模板
查看>>
Reverse complement DNA
查看>>
MySQL客户端执行外部sql文件命令
查看>>
codevs1690 开关灯(线段树)
查看>>
bzoj2730矿场搭建(Tarjan割点)
查看>>
bzoj1483: [HNOI2009]梦幻布丁(vector+启发式合并)
查看>>
《20171030-构建之法:现代软件工程-阅读笔记》
查看>>
sublime3设置快捷键在浏览器打开预览
查看>>
我的git常用命令
查看>>