首页 > 其他 > 详细

迭代器、生成器、面向过程编程

时间:2019-07-15 19:39:36      阅读:77      评论:0      收藏:0      [点我收藏+]

一、迭代器

1.首先,器”,大家都已经了解,就是工具的意识,那么什么是迭代?

迭代:“迭代是一个重复的过程,并且每次的重复都是基于上一次的结果而来的

 

2.想要了解迭代器到底是什么?还必须先了解什么是“可迭代对象”?

可迭代对象:在python中,但凡内置有_iter_方法的对象,都是可迭代对象

 

例如以下都是可迭代对象

 str1=hello
 list1=[1,2,3]
 tup1=(1,2,3)
 dic={x:1}
 s1={a,b,c}
 f=open(a.txt,w,encoding=utf-8)

 

3.迭代器

定义:迭代取值工具,可迭代的对象执行__iter__方法得到的返回值就是迭代器对象

dic={x:1,y:2,z:3}  # dic为可迭代对象
iter_dic= dic.__iter__()  # iter_dic为迭代器对象
print(iter_dic.__next__())
print(iter_dic.__next__())
print(iter_dic.__next__())

打印结果:x y z 会将键值打印出来


异常处理
如果循环取值,但是本身的值并没有那么多会出现什么情况呢? 当然会报错了,那么又有什么方法来控制呢 x
=[1,2,3] iter_x=x.__iter__() while True: try: # try 就相当于与一个监督作用,如果取出的值超出了x的范围,那么就会停止取值 print(iter_x.__next__()) except StopIteration: break

 

4.可迭代对象与迭代器的比较

可迭代对象:

str,list,dict,tuple,set,file

获取可迭代对象方式:

无需获取,python内置str,list,dict,tuple,set,file都是可迭代对象

特点:

内置有__iter__方法的都叫可迭代的对象,执行该方法会拿到一个迭代器对象

 

迭代器对象:

文件对象本身就是迭代器对象

获取迭代器对象的方式:

执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象

特点:
内置有__next__方法,执行该方法会拿到迭代器对象中的一个值
内置有__iter__方法,执行该方法会拿到迭代器本身

 

5.迭代器优缺点

优点:

1.>可以不按照索引取值

因为它可以利用可迭代的对象执行__iter__方法直接得到的返回值

2.>节省内存

它可以将所有的值全部储存在一个空间,就是一个存储地址

 

缺点:

1.>取值麻烦

因为它取值只能一个一个取,取完前面才能取后面

2.>取值是一次性的,无法用len获取长度

 

6.for 循环原理分析

1.>for循环称之为迭代器循环,in后面跟的必须是可迭代对象

2.>for循环会执行in后面对象的__iter__方法,转成迭代器对象

3.>然后调用迭代器__next__方法,进行取值

4.>依次循环,直到取值完毕,检测到异常StopIteration,自动结束循环

 

二、生成器

生成器的本质就是迭代器

函数内包含yield关键字,在调用函数,

就不会执行函数体代码,拿到的返回值就是一个生成器

技术分享图片

技术分享图片

 

如果取值范围超过本身的数值范围会怎样呢?

技术分享图片

 

既然会出现这种报错的情况,那么自然就有解决的方法

技术分享图片

 

yield即可以返回一个值,也可以返回多个值,

并且多个值是以元组的形式返回,

如果yield后面没有数值,那么就会返回None

def func():
    print(=====>first)
    yield 1
    print(=====>second)
    yield 2
    print(=====>third)
    yield 3,4
    print(=====>forth)
    yield

s = func()
print(s)
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())

#  打印结果:
=====>first
1
=====>second
2
=====>third
(3, 4)
=====>forth
None

 

练习:

自定义range功能

技术分享图片
 需要取出range里的值
 平常是使用for循环来取值
for i in range(1,10):
    print(i)  # 打印结果:1~9的值
 这样就可以将其中的值全部取出,那么自定义生成器怎么取呢?
def my_range(start,end,step=1):
    while start < end:
        yield start
        start += step
for i in my_range(1,10):
    print(i)  # 打印结果:1~9的值
View Code

 

迭代器、生成器、面向过程编程

原文:https://www.cnblogs.com/xiongying4/p/11185608.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!