2012-10-24 55 views
1

我是python的新手。我試圖創建一個腳本,當同一個數據輸入多次時,會給我一個不同的響應。代碼如下所示:如果數據輸入不止一次,會導致不同的響應

def loop() : 
    Repeat = 0 
    response = raw_input("enter something : ") 
    if response == "hi" 
     Repeat += 1 
     print "hello" 
     loop() 
     if Repeat > 2 : 
      print "you have already said hi" 
      loop() 


def main() : 
    loop() 
    raw_input() 

main() 

上述代碼不起作用。最好是我想要一個能夠檢查這兩種情況的聲明,但我不太確定如何做到這一點。

+0

對於這樣的事情你應該使用while循環。 –

回答

1

我會用dict來存儲單詞/計數。然後,您可以詢問一下字在字典和更新計數......

words = {} 
while True: 
    word = raw_input("Say something:") 
    if word in words: 
     words[word] += 1 
     print "you already said ",words[word] 
     continue 
    else: 
     words[word] = 0 
     #... 

你也可以用try/except做到這一點,但我想我會保持它的簡單,開始了...

1

嘗試這樣:

def loop(rep=None): 
    rep=rep if rep else set() #use a set or list to store the responses 
    response=raw_input("enter something : ") 
    if response not in rep:     #if the response is not found in rep 
     rep.add(response)      #store response in rep 
     print "hello" 
     loop(rep)        #pass rep while calling loop() 
    else: 
     print "You've already said {0}".format(response) #if response is found 
     loop(rep) 
loop()   

輸出:

enter something : hi 
hello 
enter something : hi 
You've already said hi 
enter something : foo 
hello 
enter something : bar 
hello 
enter something : bar 
You've already said bar 
enter something : 

PS:還添加了一個破條件loop(),否則這將是一個無限循環

+0

這可以正常工作,並且完全符合原始內容,但請注意它是遞歸的。這本身並不糟糕,但是python沒有tail call優化功能(絕對在我的個人願望清單中)。因此,它最終會達到遞歸深度限制,並且比非遞歸選項佔用更多的內存。 – TimothyAWiseman

+0

@TimothyAWiseman遞歸限制可以通過'sys.setrecursionlimit'改變,我完全同意速度(遞歸總是很慢)。 –

+1

非常真實。這是一個很好的答案,(upvoted),值得指出的是它是遞歸的,沒有tail call優化。 – TimothyAWiseman

0

上述語句就遞歸調用本身。循環的新實例無法訪問「重複」的調用值,而是具有其自己的「重複」本地副本。此外,你有,如果Repeat > 2。正如所寫,這意味着它將不會得到您的其他打印聲明,直到他們三次輸入「hello」以使計數器達到3爲止。您可能想要製作Repeat >= 2

你想要的是一個while循環,用於跟蹤輸入是否重複。在現實生活中,你可能需要一些條件來告訴while while循環何時結束,但是你在這裏沒有抱怨,所以你可以使用while True:永遠循環。

最後,您的代碼只會檢查他們是否多次輸入「hello」。你可以通過跟蹤他們已經說過的話來使它更加通用,並且擺脫在這個過程中需要一個計數器的需要。對於我沒有測試過的快速草圖版本,它可能會像下面這樣循環:

alreadySaid = set() #sets are effecient and only store a specific element once 
while True: #probably want an actual break condition here, but to do it forever this works 
    response = raw_input("enter something : ") 
    if response in alreadySaid: 
     print 'You already said {}'.format(response) 
    else: 
     print response 
     alreadySaid.add(response) 
相關問題