迭代器的再理解:由一道错误写法想到的

有以下需求:
titles = ['淘宝', '百强榜', '天猫', 'app推荐', '京东', 'app推荐', '拼多多', '优秀榜', '当当', '亚马逊', '闲鱼', '天虹']
removes = ['app推荐', '优秀榜', '百强榜']
要求将title中包含有remove项的内容的title从列表中去掉. 

错误的写法:

titles  = ['淘宝', '天猫', '百强榜', 'app推荐', '京东', '拼多多', '优秀榜', '当当', '亚马逊', '闲鱼', '天虹']
removes = ['app推荐', '优秀榜', '百强榜']
for title in titles:
    if title in removes:
        titles.remove(title)
print(titles)
>>>
['淘宝', '天猫', 'app推荐', '京东', '拼多多', '当当', '亚马逊', '闲鱼', '天虹']

可以看得出来,跟我们预期的结果不太一样. 到底错在哪里了呢?
错就错在对迭代器的理解出现了问题. 
什么是迭代器?它是一个带状态的对象,在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__方法的对象都是迭代器,
__iter__返回迭代器自身,__next__返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常。
在上例中,titles是一个可迭代(Iterable)的list, 即titles是一个可迭代对象.
那迭代器取值的方法为,通过调用__next()__来返回容器的下一个值

标题


实例:

Out[81]: titles = ['淘宝', '天猫', 'app推荐', '京东', '拼多多', '当当', '亚马逊', '闲鱼', '天虹']
In [82]: T = titles.__iter__()
In [83]: T.__next__()
Out[83]: '淘宝'
In [84]: T.__next__()
Out[84]: '天猫'
In [85]: T.__next__()
Out[85]: 'app推荐
In [86]: T.__next__()
Out[86]: '京东'
In [87]: T.__next__()
Out[87]: '拼多多'
In [88]: T.__next__()
Out[88]: '当当'
In [89]: T.__next__()
Out[89]: '亚马逊'
In [90]: T.__next__()
Out[90]: '闲鱼'
In [91]: T.__next__()
Out[91]: '天虹'
In [92]: T.__next__()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-92-1e84e74410c2> in <module>
----> 1 T.__next__()

StopIteration:

有了上面的基础,就可以看出,当for在第三轮时,因为title = '百强榜', 这时会将'百强榜'给remove掉,然后第4轮时,执行__next__返回的是列表中的下一个值是'京东',而将'app推荐'给忽略掉了,故出现了跟预期不一样的结果.

正确的写法:

titles  = ['淘宝', '天猫', '百强榜', 'app推荐', '京东', '拼多多', '优秀榜', '当当', '亚马逊', '闲鱼', '天虹']
removes = ['app推荐', '优秀榜', '百强榜']
for title in removes:
    if title in titles:
        count = titles.count(title)
        for i in range(count):
            titles.remove(title)
print(titles)
>>>
['淘宝', '天猫', '京东', '拼多多', '当当', '亚马逊', '闲鱼', '天虹']

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值