Python迭代器和生成器

一.迭代器
python 一切皆对象,只要能被for循坏的对象就是可迭代对象

内部含有_inter_方法的对象就叫做可迭代对象
#dir方法打印该对象的所有操作方法

A = ’pyhton’
print(dir(A))
执行输出:

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

如何判断是否是可迭代对象

方法一:
S = 'python'
print('_inter_' in dir(S))
执行输出:
True
方法二:
from collections import Iterable
l = [1, 2, 3, 4]
print(isinstance(l, Iterable))
执行输出:
<class 'list'>
True

可迭代对象转化为迭代器方法
可迭代对象.inter() ———>迭代器
迭代器还有除过__inter__方法,还有__next__方法

l1 = [2,3,1,2]
l2 = l1.__iter__()
print('__iter__' in dir(l1))
print('__next__' in dir(l1))
print('__next__' in dir(l2))
执行输出:
True
False
True
从结果看出l2 同时含有两种方法,所以它是迭代器

迭代器使用__next__获取一个值

l1 = [2,3,1]
l2 = l1.__iter__()
print(l2.__next__())
print(l2.__next__())
print(l2.__next__())
执行结果:
2
3
1
多取值的话就会报错,因为列表中只有3个元素

用for 循环方式对迭代器进行取值

l1 = [2,3,1]
l2 = l1.__iter__()
for i in l2:
    print(i)

#for循坏的内部机制实质上就是将可迭代对象转化为迭代器,然后用__next__方法取值,之所以没有报错是因为内部有异常处理机制,

迭代器的优势:
1.节省内存空间
2.不能反复取值,不可逆

二.生成器
在python中 一边循环,一边计算的机制,称为生成器。
生成器本质上是迭代器
如果函数包含至少一个yield语句(它可能包含其他yield或return语句),那么它将成为一个生成器函数。 yield和return都将从函数返回一些值。
不同的是,return语句完全终止函数,但yield语句会暂停函数保存其所有状态,并在以后的连续调用中继续执行(有点像线程挂起的意思)。
两种创建方式
第一种通过生成器表达式创建

s = (x*2 for x in range(5))

print(s.__next__())
print(s.__next__())
输出:
<generator object <genexpr> at 0x0000019F73E20970>
0
2

第二种使用yield关键字创建生成器函数
只要python函数定义体中有yield关键字,该函数就是生成器函数
yield是一个类似return的关键字,只是这个函数返回的是个生成器

def fun1():
    i = 1
    for c in range(6):
        yield i*c
c = fun1()  #c是一个生成器对象
print(c.__next__())
print(c.__next__())
print(c.__next__())

总结:
1.内部含有__iter__方法的对象就叫做可迭代对象
2.内部必须有__iter__方法和__next__方法的对象,叫做迭代器
3.用yield关键字好处:不会将所有数据取出来存入内存中,而是返回了一个对象,可以通过对象获取数据,用多少取多少,可以节省内存空间。
4.凡是生成器都是迭代器,但是迭代器不一定是生成器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值