Python 怎么判断一个迭代器是否为空

2015 年 5 月 30 日
 ca1n

在不进行取操作的情况下,看了一下迭代器自身的函数,公有函数只有一个next(),但是这个会进行取操作..

13402 次点击
所在节点    Python
12 条回复
aisk
2015 年 5 月 30 日
理论上不可能,迭代器里面的内容可能是从外部(网络、文件)读出来的,你不去用就不会知道是否为空。
sivacohan
2015 年 5 月 30 日
迭代器就只能用while next了。
迭代器的每一个next都是在迭代过程中产生的。如果你需要判断长度,应该使用list。
list和generator的一个区别就是,list会一下吃掉很多内存,迭代器不会吃那么多。
aisk
2015 年 5 月 30 日
其实一般你转换成 list 再用也没什么卵关系。
bcxx
2015 年 5 月 30 日
为空不就抛 StopIteration 了么…… 可能你的意思是要把 iterator 的 cursor 弄回去对吧,这样不如转成 list ...
mV2GK
2015 年 5 月 30 日
>>> def getIterLength(iterator):
temp = list(iterator)
result = len(temp)
iterator = iter(temp)
return result

>>>
>>> f = xrange(20)
>>> f
xrange(20)
>>>
>>> x = getIterLength(f)
>>> x
20
>>> f
xrange(20)
>>>
ca1n
2015 年 5 月 30 日
@aisk
@sivacohan
@bcxx
@mV2GK

恩,看来是需要转list才能知道长度了,
这个问题的具体情况是使用了re.finditer,这样的话用findall好了
因为java里面对于iteration是有hasnext()函数的,所以想问一下python是否也有类似函数
hahastudio
2015 年 5 月 30 日
我觉得这个思路可以 http://stackoverflow.com/a/1967037
先尝试去拿,如果有就把拿的值先存起来,留着之后输出
ca1n
2015 年 5 月 30 日
@hahastudio 恩 这个不错
SakuraSa
2015 年 5 月 30 日
我想,如果用一个类提前读出一位的话,可不可以处理这个问题呢?
写了一点渣渣的实现:
https://gist.github.com/SakuraSa/e394df11c11629d14b9d
似乎这样处理的话,对于会对环境产生影响的迭代器会有问题
因为无论如何都提前读出了一位
SakuraSa
2015 年 5 月 30 日
啊,发出帖子才发现,似乎和hahastudio 的方案重复了
无视我吧 >///<
ca1n
2015 年 5 月 30 日
@SakuraSa (●'◡'●)
kaneg
2015 年 5 月 31 日
原生的iterator不支持这种行为的,不过楼主可以自己写一个iterator类,提供一个has_next方法即可

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/194887

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX