2013-03-06 41 views
1

我有以下代碼怎麼知道iterables的發電機在python

>>> x = ['a','b','c','d','e'] 
>>> def test_yield(lst): 
...  for el in lst: 
...  yield el 
... 
>>> var = test_yield(x) 
>>> var.next() 
'a' 
>>> var.next() 
'b' 
>>> var.next() 
'c' 
>>> var.next() 
'd' 
>>> var.next() 
'e' 

我怎麼能知道iterables從發生器的長度(在這種情況下,列表的長度)的數量。 在我的真實情況下,我沒有確切的列表。我從發電機那裏得到了。簡單地說,我想知道在我的第二個var.next()左右後var中的迭代次數。

+1

當你將它們添加到你的設置中時,你不能保持運行狀態嗎? – 2013-03-06 23:38:06

+0

我想知道剩下多少錢可以加入集合,爲此我應該知道我開始的時間長度,然後在添加計數器時添加它們會很有幫助。 – 2013-03-07 19:07:52

回答

3

你不能。迭代器可以是無限的。

def test_yield(): 
    count = 1 
    while True: 
     count += 1 
     yield count 
+0

它們也可能是這樣的,弄清楚它們有多長的唯一方法是完全列舉它們,即使它們是有限的。 – 2013-03-07 00:17:06

2

如果你知道你的迭代器不是無限的(見@ unutbu的答案),你可以把放在一個列表中的結果,然後再拿到長度:

stuff = list(test_yield(x)) 
print(len(stuff)) 
+1

如果我把它變成一個列表,那麼在第一個例子中就沒有使用生成器的目的了嗎?當列表很大時,最好讓它們通過發生器,因爲它們不佔用太多內存 – 2013-03-06 23:01:23

+0

@ user1988876這基本上是正確的,但函數編寫者可能不知道如何使用它們的數據,所以通常返回迭代器從函數,並讓他們的來電者在必要時轉換爲列表。 – 2013-03-06 23:15:56

0

發生器可以無限的,所以你不能打電話給他們len。當你知道發電機是有限的,你可以計算出這樣的長度:

sum(1 for element in iterable)

這不會消耗你的發電機,但是,你不能「倒帶」它回到起點,所以你必須如果您需要再次使用它,請創建一個新的。