2009-02-12 116 views
12

我有變量賦值,以便返回指定的值,並將其與直接在while循環中的空字符串進行比較。如何在Python中的while(expression)循環中做變量賦值?

這裏是我如何在PHP這樣做:

while((name = raw_input("Name: ")) != ''): 
    names.append(name) 

我試圖做的是相同的這功能:

names = [] 
while(True): 
    name = raw_input("Name: ") 
    if (name == ''): 
     break 
    names.append(name) 

有沒有辦法做到這一點在Python中?

回答

14
from functools import partial 

for name in iter(partial(raw_input, 'Name:'), ''): 
    do_something_with(name) 

,或者如果你想有一個清單:

>>> names = list(iter(partial(raw_input, 'Name: '), '')) 
Name: nosklo 
Name: Andreas 
Name: Aaron 
Name: Phil 
Name: 
>>> names 
['nosklo', 'Andreas', 'Aaron', 'Phil'] 
9

不,對不起。這是一個常見問題,在這裏解釋:

PydocsFredrik Lundh's blog

不允許在Python表達式中賦值的原因是在其他語言中常見的,難以發現的錯誤。

已經提出了許多替代方案。大多數黑客可以節省一些打字量,但使用任意或隱含的語法或關鍵詞,並且不符合語言改變建議的簡單標準:它應直觀地向尚未被引入構造的人類讀者建議適當的含義。

一個有趣的現象是,大多數有經驗的Python程序員認識到while True習語,似乎並沒有錯過表達式構造中的賦值;只有新人表達強烈的願望,才能將其添加到語言中。

有似乎有吸引力的拼寫此的另一種方式:

line = f.readline() while line: 
    ... # do something with line... 
    line = f.readline() 
+0

這個鏈接似乎被打破 – 2010-11-08 16:37:41

+0

新增更新鏈接。謝謝! – 2010-11-09 14:34:26

+0

鏈接已死亡。 – Makkes 2012-09-27 07:56:59

12

你可以用raw_input()把它變成一臺發電機:

def wrapper(s): 
    while True: 
     result = raw_input(s) 
     if result = '': break 
     yield result 

names = wrapper('Name:') 

這意味着我們又回到了起點一個但代碼更復雜。所以如果你需要包裝現有的方法,你需要使用nosklo的方法。

1

我只有7旬,但還有另一種解決方案。這不是我能想到的最佳解決方案,但它強調了StopIteration異常的一個有趣用法。你可以做一個類似的循環來讀取文件/套接字和處理超時以及什麼都不好。

names=[] 
try: 
    while True: 
     f = raw_input() 
     if not f: 
      raise StopIteration 
     else: 
      names.append(f) 
except StopIteration: 
    pass 

print names 
1
names = [] 
for name in iter(lambda: raw_input("Name: "), ''): 
    names.append(name)