实际工作中,我不会这样写,而是会使用辅助函数来完成计算。有两种常见的方法来编写此类辅助函数。第一种写法是只要发现某个条件为真,就立即返回。如果从未遇到过这种情况,那么循环将被完全执行,程序将返回函数结束时的值作为默认返回值。defcoprime(a,b):foriinrange(2,min(a,b)+1):ifa%i==0andb%i==0:returnFalsereturnTrueassertcoprime(4,9)assertnotcoprime(3,6)第二种写法就是,用一个变量来记录在循环过程中是否遇到这样的情况。如果是,提前使用break跳出循环。如果没有,循环将被完全执行。在任何情况下,这个变量的值都会在最后返回。defcoprime_alternate(a,b):is_coprime=Trueforiinrange(2,min(a,b)+1):ifa%i==0andb%i==0:is_coprime=Falsebreakreturnis_coprimeassertcoprime_alternate(4,9)assertnotcoprime_alternate(3,6)为对于不熟悉for/else结构的朋友,刚才的两种写法是比较清晰的解决方案,可以根据情况选择其中一种。虽然for/else或者while/else结构本身可以实现一些逻辑表达,但是它给读者(包括你自己)带来的困惑却掩盖了它的好处。因为for和while循环的简单结构在Python中应该很容易阅读,如果else块紧跟在它后面,会使代码产生歧义。所以请不要那样写。要点Python有一种特殊的语法,可以在整个for循环或while循环之后立即放置一个else块。else块只有在整个循环没有早先跳出break时才会执行。把else块紧跟在整个循环之后,会让人很难看出这段代码的意思,所以要避免这样写。Python循环有一个大多数编程语言都不支持的特性,那就是你可以将else块紧跟在整个循环结构之后。foriinrange(3):print('Loop',i)else:print('Elseblock!')>>>Loop0Loop1Loop2Elseblock!奇怪的是,程序执行完for循环后,会执行else块中的内容。既然是这样,那为什么叫“else”呢?应该叫“和”。在if/else结构中,else的意思是:如果前面的语句没有执行,则执行else块。在try/except结构中,except还有这个意思:如果前面的语句执行失败,则执行except块。try/except/else结构中的else仍然沿用这个概念,意思是:如果没有异常需要处理,则执行这条语句。try/finally结构中的finally也很直观,意思是:不管前面的代码块怎么执行,最后的finally代码块都要执行。知道了上面结构中else、except、finally等的用法,Python新手可能会觉得for/else结构中的else也是同一个意思,即如果循环没有从头到尾执行,那么执行else块。其实恰恰相反,如果循环没有从头执行到尾(即循环提前终止),那么else块中的代码就不会执行。在循环中使用break语句实际上会跳过else块。foriinrange(3):print('Loop',i)ifi==1:breakelse:print('Elseb1ock!')>>>Loop0Loop1另一个奇怪的事情是,如果你在一个空白序列上做一个for循环,那么程序立即else块将被执行。forxin[]:print('Neverruns')else:print('ForElseblock!')>>>ForElseblock!while循环也是一样,如果第一个循环遇到False,那么程序会立即运行else块。whileFalse:print('Neverruns')else:print('WhileElseblock!')>>>WhileElseblock!像这样设计else,就是让你用它来实现搜索逻辑。比如你要判断两个数是否互质(即除了1之外是否没有其他数可以同时整除它们),就可以用这个结构体来实现。先把所有可能同时整除的数一个一个试一遍。如果全部都试了还是找不到这样的数,那么循环就会从头执行到尾(这说明循环没有因为break而提前跳出),然后程序就是else块中的代码将被执行。a=4b=9foriinrange(2,min(a,b)+1):print('测试',i)ifa%i==0andb%i==0:print('Notcoprime')breakelse:print('Coprime')>>>Testing2Testing3Testing4Coprime在实际工作中,作者不会这样写,而是会使用辅助函数来完成计算。有两种常见的方法来编写此类辅助函数。第一种写法是只要发现某个条件为真,就立即返回。如果从未遇到过这种情况,那么循环将被完全执行,程序将返回函数结束时的值作为默认返回值。defcoprime(a,b):foriinrange(2,min(a,b)+1):ifa%i==0andb%i==0:returnFalsereturnTrueassertcoprime(4,9)assertnotcoprime(3,6)第二种写法就是,用一个变量来记录在循环过程中是否遇到这样的情况。如果是,提前使用break跳出循环。如果没有,循环将被完全执行。在任何情况下,这个变量的值都会在最后返回。defcoprime_alternate(a,b):is_coprime=Trueforiinrange(2,min(a,b)+1):ifa%i==0andb%i==0:is_coprime=Falsebreakreturnis_coprimeassertcoprime_alternate(4,9)assertnotcoprime_alternate(3,6)为对于不熟悉for/else结构的朋友,刚才的两种写法是比较清晰的解决方案,可以根据情况选择其中一种。虽然for/else或者while/else结构本身可以实现一些逻辑表达,但是它给读者(包括你自己)带来的困惑却掩盖了它的好处。因为for和while循环的简单结构在Python中应该很容易阅读,如果else块紧跟在它后面,会使代码产生歧义。所以请不要那样写。要点Python有一种特殊的语法,可以在整个for循环或while循环之后立即放置一个else块。else块只有在整个循环没有早先跳出break时才会执行。把else块紧跟在整个循环之后,会让人很难看出这段代码的意思,所以要避免这样写。
