當我在for循環中使用生成器時,它似乎「知道」,當沒有更多的元素產生時。現在,我必須使用一個沒有for循環的發生器,然後使用下一個()來獲得下一個元素。我的問題是,我怎麼知道,如果沒有更多的元素?Python 3.x:測試發生器是否有元素剩餘
我只知道:下一個()會引發一個異常(StopIteration),如果沒有剩下任何東西,但對於這樣一個簡單的問題,BUT不是一個例外太「重」嗎?是不是有像has_next()左右的方法?
以下行應該清楚,我的意思:
#!/usr/bin/python3
# define a list of some objects
bar = ['abc', 123, None, True, 456.789]
# our primitive generator
def foo(bar):
for b in bar:
yield b
# iterate, using the generator above
print('--- TEST A (for loop) ---')
for baz in foo(bar):
print(baz)
print()
# assign a new iterator to a variable
foobar = foo(bar)
print('--- TEST B (try-except) ---')
while True:
try:
print(foobar.__next__())
except StopIteration:
break
print()
# assign a new iterator to a variable
foobar = foo(bar)
# display generator members
print('--- GENERATOR MEMBERS ---')
print(', '.join(dir(foobar)))
輸出如下:
--- TEST A (for loop) ---
abc
123
None
True
456.789
--- TEST B (try-except) ---
abc
123
None
True
456.789
--- GENERATOR MEMBERS ---
__class__, __delattr__, __doc__, __eq__, __format__, __ge__, __getattribute__, __gt__, __hash__, __init__, __iter__, __le__, __lt__, __name__, __ne__, __new__, __next__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__, close, gi_code, gi_frame, gi_running, send, throw
感謝大家,並有一個愉快的一天! :)
我剛剛意識到我想爲學習'numpy'做'dis'。 ;) – n611x007 2013-11-05 11:32:13