while循环和if语句如何工作?

时间:2016-03-12 22:17:30

标签: python

i=0
while(i<=20):  # it will print:0,2,4,6,8
    if(i%2==0):
        print(i)
    elif(i==9):
       break
    else:
       i += 1
       continue
    i+=1

第一个问题:如果我删除第二个1+=1,它会无休止地打印0,为什么? break / continue到底做了什么?

第二个问题:我了解到当if满足其要求时,它将无法继续运行到以下elifelse,因此当i = 0符合i % 2 = even number时{1}},因此会打印数字0,其余的后续内容不应该运行,那么这个数字是如何增加的呢?

4 个答案:

答案 0 :(得分:1)

  • 如果您删除i += 1,则在第一次迭代时,i为0.它将转到if(i%2==0)。它会找到True,以便执行if块并跳过elifelse。如果删除i+=1i在第二次迭代时仍然为0,同样的事情会一次又一次地发生......

  • if符合其要求时,它会跳过elifelse,但i+=1块中不包含elifelse if阻止。 elifelsebreak组合在一起,但除非continuereturni+=1或异常发生。你的第二个i%2==0真的不是很有帮助,因为上面提到的事情都没有发生在else时。您可以删除整个i += 1块,因为 switch (indexPath.section) { case 0: if (self.myInvoicesUnPaid.isEmpty){ self.displayAlertMessage("Ödenmemiş faturanız bulunmamaktadır.") } else if (!self.myInvoicesUnPaid.isEmpty){ // Get Cell Label let indexPath = tableView.indexPathForSelectedRow; //let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as UITableViewCell!; let storyboard = UIStoryboard(name: "Main", bundle: nil) let viewController = storyboard.instantiateViewControllerWithIdentifier("viewControllerIdentifer") as! invoiceDetailsViewController viewController.passedValue = self.myUnpaidInvoicesDetails[(indexPath?.row)!] viewController.isPaid = false self.presentViewController(viewController, animated: true , completion: nil) } break case 1: // Get Cell Label let indexPath = tableView.indexPathForSelectedRow; let storyboard = UIStoryboard(name: "Main", bundle: nil) let viewController = storyboard.instantiateViewControllerWithIdentifier("viewControllerIdentifer") as! invoiceDetailsViewController viewController.passedValue = self.myPaidInvoicesDetails[(indexPath?.row)!] viewController.isPaid = true self.presentViewController(viewController, animated: true , completion: nil) break default: break } 会在没有它的情况下发生。

答案 1 :(得分:0)

首先注意 i 从0开始,只要 i 小于或等于 i ,我们就会输入循环继续运行到20岁。

i 等于9时,条件i%2==0为false,因此它会下降到下一个 elif ,其值为true。在这种情况下,break关键字表示结束当前循环结构(),因此循环结束。

现在假设 i 是偶数(以这种方式开始),第一个如果条件评估为真,导致 i 打印。它现在跳过下一个 elif else ,在的同时跳到的底部; i 增加1(导致它现在变为奇数)。请注意,底部的增量不是最终 else 的一部分,因为它缩进较少。因为它与 if / elif / else 缩进相同,所以它位于同一级别而不是它的一部分(它是的一部分,而)。

i 为奇数时,第一个 if 评估为false,如果不是9, elif 也是如此我们进入 else 。这里 i 加1(使其均匀),continue表示跳过循环的其余部分( while )并返回开始(跳过底部的i+=1)。

因此我们看到的是

  • = 0,打印0,将<1>添加1 (从结束时开始),返回到开头(到达结束时间)
  • = 1,将其增加到2,回到开始(跳过休息)
  • = 2,打印2,将<1>添加1 (从结束时开始),返回到开头(到达时间结束)
  • = 3,将其增加到4,回到开始(跳过休息)
  • = 4,打印4,将1加到 i (从结束时开始),回到开头(到达时间结束)
  • = 5,将其增加到6,回到开始(跳过休息)
  • = 6,打印6,将<1>添加1 (从结束时开始),返回到开头(到达时间结束)
  • = 7,将其增加到8,重新开始(跳过休息)
  • = 8,打印8,将1添加到 i (从结束时开始),返回到开头(到达结束时间)
  • = 9,退出

如果删除最终i+=1,请查看 i 为0时发生的情况。将其从0更改为1并允许我们移至上一条件的步骤是最后的声明。因此,如果没有这个,我们就无法逃避 i = 0条件,当我们回到 while 循环的开头时,我们仍处于同一点。

答案 2 :(得分:0)

要记住的是你的i + = 1在你的while循环范围内,所以在循环结束时它总会被执行。因此,如果你删除它然后你得到一个无限循环,因为没有其他地方你增加你的i。

自从你将i初始化为0以来,你的第一个if总是被命中。因此,除非你击中你的第二个i + = 1,否则你永远不会改变你的i。

据我所知,继续做的是跳过代码体的其余部分到循环的下一次迭代。

如果我太困惑了,请告诉我。谢谢!

答案 3 :(得分:-1)

对于breakcontinue,您应该阅读tutorial:)

简而言之,但可能还不够: continue退出封闭循环的当前运行for),而break退出整个循环

你的第二个问题答案较短: 你在if/elif/else之后有缩进块 - 从那里只有一个被执行。比之后的代码(增加i)与if处于同一级别,因此它将在之后的任何其他语句之后运行...