为什么要挑战自己不要在代码中写for循环?因为这会迫使您学习使用更高级和惯用的语法或库。本文以python为例,讲了很多大家在别人的代码中看到过的语法,但是自己却很少用到。自从我开始探索Python中惊人的语言特性以来已经有一段时间了。一开始,我挑战自己练习比其他编程语言的编程经验更多的Python语言特性。这让事情变得越来越有趣!代码越来越简洁,代码看起来更加结构化和规范化。我将在下面描述这些好处。for循环通常用于以下使用场景:提取序列中的一些信息。从另一个序列生成一个序列。写作已成为一种习惯。幸运的是,Python已经有很多工具可以帮助你做到这一点,你只需要换个思路,换个角度思考。避免编写for循环可以获得哪些好处:更少的代码、更好的代码可读性、更少的缩进(对于Python仍然有意义)让我们看一下以下代码结构:#1with。..:for...:if...:try:except:else:在这个例子中,我们处理的是多级嵌套代码,很难阅读。此示例使用多层嵌套代码。我在这段代码中发现,它乱用缩进,将管理逻辑(with,try-except)和业务逻辑(for,if)混合在一起。如果您遵循仅对管理逻辑使用缩进的惯例,那么核心业务逻辑应该会立即出现。《扁平结构胜于嵌套结构》——Python之禅可以用现有的工具代替for循环1.ListComprehension/Generatorexpression我们来看一个简单的例子。如果你想将一个数组转换成另一个:result=[]foriteminitem_list:new_item=do_something_with(item)result.append(item)如果你喜欢MapReduce,你也可以使用map,或者Python中的ListComprehension:result=[do_something_with(item)foriteminitem_list]同样,如果你只是想遍历数组中的元素,你也可以使用相同的代码生成器表达式。result=(do_something_with(item)foriteminitem_list)2。Function如果想把一个数组映射成另一个数组,只需要调用map函数,就可以用更高级更实用的编程方法来解决这个问题。doubled_list=map(lambdax:x*2,old_list)如果你想将一个序列缩减为一个序列,使用reduce此外,许多Python内置函数使用迭代器:>>>a=list(range(10))>>>a[0,1,2,3,4,5,6,7,8,9]>>>all(a)False>>>any(a)True>>>max(a)9>>>min(a)0>>>list(filter(bool,a))[1,2,3,4,5,6,7,8,9]>>>set(a){0,1,2,3,4,5,6,7,8,9}>>>字典(zip(a,a)){0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}>>>排序(a,reverse=True)[9,8,7,6,5,4,3,2,1,0]>>>str(a)'[0,1,2,3,4,5,6,7,8,9]'>>>sum(a)453.ExtractFunctionsorGenerators以上两种方法都不错用于处理更简单的逻辑。更复杂的逻辑呢?作为程序员,我们编写函数来抽象掉复杂的业务。同样的想法也适用于此。如果你这样写:results=[]foriteminitem_list:#setups#condition#processing#calculationresults.append(result)显然你给一个代码块增加了太多的责任。相反,我建议您这样做:defprocess_item(item):#setups#condition#processing#calculationreturnresultresults=[process_item(item)foriteminitem_list]如果更改为嵌套函数会发生什么:results=[]foriinrange(10):forjinrange(i):results.append((i,j))被ListComprehension取代以实现这一点:results=[(i,j)foriinrange(10)forjinrange(i)]如果你的代码块需要记录一些内部状态:#找到当前项之前的最大值=[3,4,6,2,1,9,0,7,5,8]results=[]current_max=0foriina:current_max=max(i,current_max)results.append(current_max)#results=[3,4,6,6,6,9,9,9,9,9]我们使用生成器为此:defmax_generator(numbers):current_max=0foriinnumbers:current_max=max(i,current_max)yieldcurrent_maxa=[3,4,6,2,1,9,0,7,5,8]results=list(max_generator(a))读者可能会问“等等!你在生成器中使用了for循环,作弊!别着急,看看下面的代码ag是的。不要自己写。itertools会帮你实现这个模块非常简单。相信这个模块在大多数场景下都可以替代你原来的for循环。例如,最后一个例子可以重写为:fromitertoolsimportaccumulatea=[3,4,6,2,1,9,0,7,5,8]resutls=list(accumulate(a,max))此外,if要迭代一系列组合,需要使用product()、permutations()、combinations()。结论在大多数情况下,您不需要编写for循环。您应该避免编写for循环以获得更好的代码可读性。
