简介无论我们使用什么编程语言,我们都会写“if-else”语句,但是“for-else”呢?对于许多语言,例如C、C++和Java,在循环后使用“else”是完全错误的。然而,Python作为一门优雅的语言,却有这种“奇特而有用”的特性。如果使用得当,我们的代码会变得更加简洁。本文介绍了Python中的“for-else”特性,并通过一个简单的例子展示了如何正确使用它。“For-Else”特性的基础第一次遇到“for-else”特性时,可能会显得陌生和难以理解(PythonDevelopersHome初次使用该特性时,很容易误以为else缩进错误).但实际上,它的用法出奇的简单。一句话就够了:代码中的“else”块只有在循环没有break的情况下才会执行。听起来有点过于简单而不真实?让我们看一个例子:leaders=["Elon","Tim","Warren"]foriinleaders:ifi=="Yang":print("Yangisaleader!")breakelse:print("Not找到杨了!”)#没有找到杨!如上图:如上图,“杨”不在leader列表中,所以我们的for循环没有break。所以“else”块执行并打印消息。如果领导人名单中有“杨”怎么办?leaders=["Yang","Elon","Tim","Warren"]foriinleaders:ifi=="Yang":print("Yangisaleader!")breakelse:print("找不到杨!”)#杨是领袖!如上图,由于“Yang”被包含在leaders列表中,for循环被中断,“else”块的内容没有被执行。总之,for-else特性本身并不难理解,但要正确、熟练地使用它却并不容易。下面介绍三种适合使用for-else特性的场景。3使用For-Else特性的场景我们不一定要在Python程序中使用for-else特性。老实说,没有它我们也可以做同样的事情,但是使用它会使我们的代码更加优雅。1.迭代并查找未标记的元素迭代列表以查找特定元素是使用循环的基本场景。通常当我们找到目标元素后,继续迭代已经没有意义了,我们需要跳出循环。问题是:我们如何知道是否找到了元素?传统的解决方案是定义一个“标志”变量,并在我们找到特定项目时将其设置为True。leaders=["Yang","Elon","Tim","Warren"]have_yang=Falseforiinleaders:ifi=="Yang":have_yang=True#Dosomethingbreakifhave_yang==False:#没有杨...#做其他如上例所示,have_yang变量是一个flag。for循环运行完毕后,如果它的值为False,我们就知道“杨”不在列表中,接下来我们可以做一些其他的操作。这种方法已经足够好了,但是如果你想利用Python的“优雅”特性,使用for-else是另一种选择:leaders=["Yang","Elon","Tim","Warren"]foriinleaders:ifi=="Yang":have_yang=True#Dosomethingbreakelse:#noyang...#其他人看起来更整洁,对吧?2.用来跳出嵌套循环当代码中有嵌套循环时,for-else也能派上用场。foriinrange(5):forjinrange(5):ifj==2andi==0:breakifnot(j==2andi==0):continuebreak如上图,跳出内嵌的嵌套循环有点难度,因为我们要知道是否跳出内层循环。上面的代码显示了一个笨拙的解决方案来确定内部循环是否已被破坏。它当然有效,但我们可以通过使用for-else使其更简洁:#使用for-else语法foriinrange(5):forjinrange(5):ifj==2andi==0:breakelse:#只在内循环没有break时执行continuebreak3.协助处理异常nums=[1,3,0,5]fordenominatorinnums:try:20/denominatorexceptZeroDivisionError:breakelse:#nofoundZeroDivisionError...#doothers如上所示,如果ZeroDivisionError没有发生在for循环,我们可以在“else”块中进行相应的后续操作。总结Python中的for-else特性初看起来可能很奇怪,但是它的用法并不难理解,并且在某些场景下可以派上用场。毕竟,我们只需要记住一个规则:“else”块只有在循环中没有break时才会执行。
