在不进行取操作的情况下,看了一下迭代器自身的函数,公有函数只有一个next(),但是这个会进行取操作..
1
aisk 2015-05-30 12:52:15 +08:00
理论上不可能,迭代器里面的内容可能是从外部(网络、文件)读出来的,你不去用就不会知道是否为空。
|
2
sivacohan 2015-05-30 12:57:01 +08:00 via Android
迭代器就只能用while next了。
迭代器的每一个next都是在迭代过程中产生的。如果你需要判断长度,应该使用list。 list和generator的一个区别就是,list会一下吃掉很多内存,迭代器不会吃那么多。 |
3
aisk 2015-05-30 13:21:32 +08:00
其实一般你转换成 list 再用也没什么卵关系。
|
4
bcxx 2015-05-30 13:32:02 +08:00
为空不就抛 StopIteration 了么…… 可能你的意思是要把 iterator 的 cursor 弄回去对吧,这样不如转成 list ...
|
5
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) >>> |
6
ca1n OP |
7
hahastudio 2015-05-30 14:21:13 +08:00
我觉得这个思路可以 http://stackoverflow.com/a/1967037
先尝试去拿,如果有就把拿的值先存起来,留着之后输出 |
8
ca1n OP @hahastudio 恩 这个不错
|
9
SakuraSa 2015-05-30 15:31:52 +08:00 1
我想,如果用一个类提前读出一位的话,可不可以处理这个问题呢?
写了一点渣渣的实现: https://gist.github.com/SakuraSa/e394df11c11629d14b9d 似乎这样处理的话,对于会对环境产生影响的迭代器会有问题 因为无论如何都提前读出了一位 |
10
SakuraSa 2015-05-30 15:32:59 +08:00
啊,发出帖子才发现,似乎和hahastudio 的方案重复了
无视我吧 >///< |
12
kaneg 2015-05-31 18:55:22 +08:00 via iPhone
原生的iterator不支持这种行为的,不过楼主可以自己写一个iterator类,提供一个has_next方法即可
|