2008-08-26 100 views

回答

4

簡短的回答:沒有辦法做到內嵌variabl在Python中的while循環中進行賦值。這意味着我不能說:

while x=next(): 
    // do something here! 

因爲這是不可能的,也有一些這樣的「慣用正確」的方式:

while 1: 
    x = next() 
    if x != END: 
     // Blah 
    else: 
     break 

顯然,這是一種醜陋。您也可以使用上面列出的「迭代器」方法之一,但是,這可能並不理想。最後,你可以使用我其實只是發現而google搜索「皮塔口袋」的方法:

class Pita(object): 
    __slots__ = ('pocket',) 
    marker = object() 
    def __init__(self, v=marker): 
     if v is not self.marker: 
      self.pocket = v 
    def __call__(self, v=marker): 
     if v is not self.marker: 
      self.pocket = v 
     return self.pocket 

現在你可以這樣做:

p = Pita() 
while p(next()) != END: 
    // do stuff with p.pocket! 

感謝這個問題;學習關於__call__成語非常酷! :)

編輯:我想給信貸信貸的到期。找到'皮塔口袋'的成語here

+0

這裏使用`__slots__`是完全沒有必要的。 – PaulMcG 2009-10-26 20:52:06

2

也許並不十分地道,但我傾向於去與

x = next() 
while x != END: 
    do_something_with_x 
    x = next() 

......但那是因爲我找到那種容易閱讀的東西

1

你想在這裏做什麼? 如果您正在迭代列表,您可以使用for e in L其中e是元素,L是列表。如果您正在過濾列表,您可以使用列表解析(即[ e for e in L if e % 2 == 0 ]獲取列表中的所有偶數)。

5

這取決於你想要做什麼。爲了儘可能滿足你的榜樣,我會做下一個發電機和遍歷它:

def next(): 
    for num in range(10): 
     yield num 

for x in next(): 
    print x 
1

如果你需要做一次這樣多,Python的方式,就可以使用迭代器

for x in iternext(): 
    do_something_with_x 

其中iternext會使用類似 (explicit is better than implicit!)來定義:

def iternext(): 
    x = next() 
    while x != END: 
     yield x 
     x = next()   
1

你能提供更多關於你想要完成的信息嗎?目前尚不清楚對我,爲什麼你不能只是說

for x in everything(): 
    ... 

,並具備一切功能的恢復,而不是寫一個函數在一個時間只回一件事的一切。發電機甚至可以非常有效地做到這一點。

14

@馬克哈里森的回答是:

for x in iter(next_, END): 
    .... 

下面是Python's documentation的摘錄:

iter(o[, sentinel]) 

返回一個迭代對象。 ...(snip)...如果給出第二個參數sentinel,則o必須是可調用對象的 。在這種情況下創建的迭代器 將調用o ,對於其每個調用 的next()方法都沒有參數;如果返回的值爲 等於sentinel, StopIteration將會被提出,否則將返回該值 。

相關問題