Python,而真正的循环嵌套if语句缩进

时间:2016-06-06 20:14:53

标签: python

我对python的缩进语法很糟糕,我试图在循环工作时得到这个。我正在寻找的是hourly()运行之后它将要求导出而不是y它将导出然后询问您是否想要获得另一个城市的天气。如果他们选择是继续并运行hourly()

截至目前,当您对第一个问题回答是或否时,它将转到循环的开头并重新启动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

2 个答案:

答案 0 :(得分: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 nothing else:

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

答案 1 :(得分: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'):