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

2015-05-30 12:31:35 +08:00
 ca1n

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

12508 次点击
所在节点    Python
12 条回复
aisk
2015-05-30 12:52:15 +08:00
理论上不可能,迭代器里面的内容可能是从外部(网络、文件)读出来的,你不去用就不会知道是否为空。
sivacohan
2015-05-30 12:57:01 +08:00
迭代器就只能用while next了。
迭代器的每一个next都是在迭代过程中产生的。如果你需要判断长度,应该使用list。
list和generator的一个区别就是,list会一下吃掉很多内存,迭代器不会吃那么多。
aisk
2015-05-30 13:21:32 +08:00
其实一般你转换成 list 再用也没什么卵关系。
bcxx
2015-05-30 13:32:02 +08:00
为空不就抛 StopIteration 了么…… 可能你的意思是要把 iterator 的 cursor 弄回去对吧,这样不如转成 list ...
mV2GK
2015-05-30 13:53:21 +08:00
>>> 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-05-30 14:14:18 +08:00
@aisk
@sivacohan
@bcxx
@mV2GK

恩,看来是需要转list才能知道长度了,
这个问题的具体情况是使用了re.finditer,这样的话用findall好了
因为java里面对于iteration是有hasnext()函数的,所以想问一下python是否也有类似函数
hahastudio
2015-05-30 14:21:13 +08:00
我觉得这个思路可以 http://stackoverflow.com/a/1967037
先尝试去拿,如果有就把拿的值先存起来,留着之后输出
ca1n
2015-05-30 14:25:33 +08:00
@hahastudio 恩 这个不错
SakuraSa
2015-05-30 15:31:52 +08:00
我想,如果用一个类提前读出一位的话,可不可以处理这个问题呢?
写了一点渣渣的实现:
https://gist.github.com/SakuraSa/e394df11c11629d14b9d
似乎这样处理的话,对于会对环境产生影响的迭代器会有问题
因为无论如何都提前读出了一位
SakuraSa
2015-05-30 15:32:59 +08:00
啊,发出帖子才发现,似乎和hahastudio 的方案重复了
无视我吧 >///<
ca1n
2015-05-30 16:57:06 +08:00
@SakuraSa (●'◡'●)
kaneg
2015-05-31 18:55:22 +08:00
原生的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