当前位置: 首页 > 科技观察

挑战不再为循环编写Python_1

时间:2023-03-18 21:11:14 科技观察

我开始探索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)如果你想将一个序列缩减为一个序列,使用reducefromfunctoolsimportreducesummation=reduce(lambdax,y:x+y,numbers)此外,许多Python内置函数使用迭代:>>>a=list(range(10))>>>a[0,1,2,3,4,5,6,7,8,9]>>>all(a)False>>>任何(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}>>>dict(zip(a,a)){0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}>>>sorted(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]'>>>总和(a)453。提取函数或生成器以上两种方法适用于处理更简单的逻辑。更复杂的逻辑呢?作为程序员,我们编写函数来抽象掉复杂的业务。同样的想法也适用于此。如果你这样写: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]我们用generator来实现这:defmax_generator(numbers):current_max=0foriinnumbers:current_max=max(i,current_max)yieldcurrent_maxa=[3,4,6,2,1,9,0,7,5,8]结果=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循环以获得更好的代码可读性。