這個C構造的最佳Python成語是什麼?大多數Pythonic方式相當於:while((x = next())!= END)
while ((x = next()) != END) {
....
}
我沒有能力重新編碼next()。
更新:從答案似乎是:
for x in iter(next, END):
....
這個C構造的最佳Python成語是什麼?大多數Pythonic方式相當於:while((x = next())!= END)
while ((x = next()) != END) {
....
}
我沒有能力重新編碼next()。
更新:從答案似乎是:
for x in iter(next, END):
....
簡短的回答:沒有辦法做到內嵌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
這裏使用`__slots__`是完全沒有必要的。 – PaulMcG 2009-10-26 20:52:06
也許並不十分地道,但我傾向於去與
x = next()
while x != END:
do_something_with_x
x = next()
......但那是因爲我找到那種容易閱讀的東西
你想在這裏做什麼? 如果您正在迭代列表,您可以使用for e in L
其中e是元素,L是列表。如果您正在過濾列表,您可以使用列表解析(即[ e for e in L if e % 2 == 0 ]
獲取列表中的所有偶數)。
這取決於你想要做什麼。爲了儘可能滿足你的榜樣,我會做下一個發電機和遍歷它:
def next():
for num in range(10):
yield num
for x in next():
print x
如果你需要做一次這樣多,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()
你能提供更多關於你想要完成的信息嗎?目前尚不清楚對我,爲什麼你不能只是說
for x in everything():
...
,並具備一切功能的恢復,而不是寫一個函數在一個時間只回一件事的一切。發電機甚至可以非常有效地做到這一點。
@馬克哈里森的回答是:
for x in iter(next_, END):
....
下面是Python's documentation的摘錄:
iter(o[, sentinel])
返回一個迭代對象。 ...(snip)...如果給出第二個參數
sentinel
,則o
必須是可調用對象的 。在這種情況下創建的迭代器 將調用o
,對於其每個調用 的next()
方法都沒有參數;如果返回的值爲 等於sentinel
,StopIteration
將會被提出,否則將返回該值 。
我已經發布了您的答案,作爲對此問題的答案以允許對其進行投票。 – jfs 2009-01-08 23:08:13