2016-06-06 81 views
0

我很可怕的python的縮進語法,我試圖讓這個while循環工作。我正在尋找的是hourly()運行後它會要求輸出,比如果它會輸出y,然後詢問您是否想獲得另一個城市的天氣。如果他們選擇是繼續並運行hourly()Python,而真正的循環嵌套,如果語句縮進

從現在開始,當您對第一個問題回答「是」或「否」時,將轉至循環開始並重新啓動hourly()

有人可以幫助我確定我的問題嗎?

while True: 
    hourly() 
    while True: 
     export = raw_input('Would you like to export to csv? (y/n): ') 
     if export in ('y', 'n'): 
      break 
      print 'Invalid input.' 
     if export == 'y': 
      csv_writer(data, path) 
      print("Forcast export sucessful")    
     else: 
      answer = raw_input('Would you like to get weather for another city? (y/n): ') 
      if answer in ('y', 'n'): 
       break 
       print 'Invalid input.' 
      if answer == 'y': 
       continue 
      else: 
       print 'Goodbye' 
       break 
+0

我不確定爲什麼'y'和'n'是無效輸入。 –

+2

「打印」之前的「break」也會導致打印不成功。 – poke

回答

3

開始寫你想,沒有任何的循環代碼:執行hourly一次,然後導出爲CSV文件(或沒有):

hourly() 
export = raw_input('Export to csv? (y/n): ') 
if export == 'y': 
    csv_writer(data, path) 
    print("Forecast export successful") 

在每以下,我們將逐步添加一些功能。前面的代碼塊的每個添加將標記爲# new

現在讓我們添加第一個循環。如果用戶在回答問題時沒有輸入「y」或「n」怎麼辦?然後,我們希望這一呼籲重複,以raw_input,並沒有別的

hourly() 
while True:               # new 
    export = raw_input('Export to csv? (y/n): ') 
    if export in ('y', 'n'):           # new 
     break              # new 
if export == 'y': 
    csv_writer(data, path) 
    print("Forecast export successful") 

接下來,讓我們添加一個循環,這樣就可以永遠運行hourly

while True:           # new 
    hourly() 
    while True: 
     export = raw_input('Export to csv? (y/n): ') 
     if export in ('y', 'n'): 
      break 
    if export == 'y': 
     csv_writer(data, path) 
     print("Forecast export successful") 

永遠是一段很長的時間;讓我們給用戶通過外環每次退出選項:

while True: 
    hourly() 
    while True: 
     export = raw_input('Export to csv? (y/n): ') 
     if export in ('y', 'n'): 
      break 
    if export == 'y': 
     csv_writer(data, path) 
     print("Forecast export successful") 
    answer = raw_input('Another city? (y/n): ')  # new 
    if answer == 'n':        # new 
     break          # new 

請注意,我們沒有明確繼續對y答案現在;我們可以假設除了n之外的任何答案都意味着重複,所以我們可以簡單地通過無所事事返回到循環的頂部。但是,讓我們假設你想強制一個y/n的答案。然後我們添加另一個循環,就像之前我們詢問輸出結果時那樣。

while True: 
    hourly() 
    while True: 
     export = raw_input('Export to csv? (y/n): ') 
     if export in ('y', 'n'): 
      break 
    if export == 'y': 
     csv_writer(data, path) 
     print("Forecast export successful") 
    while True:           # new 
     answer = raw_input('Another city? (y/n): ') 
     if answer in ('y', 'n'):      # new 
      break          # new 
    if answer == 'n': 
     break 

現在,任何回答以外yn會詢問再次獲得天氣。一旦我們跳出內部循環,我們檢查answer的值;如果它是n,我們打破外部循環,否則(意味着answer == 'y'),我們隱式地回到外部循環的頂部。


最後一個注意事項:您可能會注意到代碼中的某些相似之處以獲得答案。我們可以將它重構爲保證Y/N答案的函數。

def get_yes_no(prompt): 
    while True: 
     response = raw_input(prompt) 
     if response in ('y', 'n'): 
      return response 

這裏,return語句採用break聲明的地方;從函數返回隱式地跳出循環。我們的功能可以在我們的代碼中使用兩次:

while True: 
    hourly() 
    export = get_yes_no('Export to csv ? (y/n): ') 
    if export == 'y': 
     csv_writer(data, path) 
     print("Forecast export successful") 
    answer = get_yes_no('Another city? (y/n): ') 
    if answer == 'n': 
     break 
+0

哇這是一個很好的答案,真的幫助我瞭解如何在python循環中嵌套並解決了我的問題,謝謝。 – llerdal

1

當你回答是或否,它會循環的開始,重新啓動hourly()

那是因爲你break第二while True當你回答是或否的第一個問題。 ..

while True: 
    hourly() 
    while True: 
     export = raw_input('Would you like to export to csv? (y/n): ') 
     if export in ('y', 'n'): 
      break # <--- The problem 

也許你的意思是

if export not in ('y', 'n'): 

同爲

if answer not in ('y', 'n'):