在不进行取操作的情况下,看了一下迭代器自身的函数,公有函数只有一个next(),但是这个会进行取操作..
![]() | 1 aisk 2015-05-30 12:52:15 +08:00 理论上不可能,迭代器里面的内容可能是从外部(网络、文件)读出来的,你不去用就不会知道是否为空。 |
![]() | 2 sivacohan PRO 迭代器就只能用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 了么…… 可能你的意思是要把 iterato 的 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 ![]() 我想,如果用一个类提前读出一位的话,可不可以处理这个问题呢? 写了一点渣渣的实现: 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方法即可 |