本文转载自公众号《读芯》(ID:AI_Discovery)可能每个刚接触Python的程序员,第一个概念里都有一个For循环。对数据执行许多操作。但是,大量的for循环也可能让用户的思维仅限于简单的迭代,而忽略了一些更高效简洁的迭代方式。如何让你的for循环告别复杂拥抱简单,如何重启探索Python循环迭代的大门,希望以下小技巧能给你带来启发。Zip:同时循环遍历两个列表作者在实践中发现代码可以同时循环遍历两个数组。这在其他编程语言中是比较难做到的,这也体现了Python的简单性。要同时遍历两个数组,只需使用zip()函数即可。forfirst,secondinzip(array1,array2):print(first)print(second)在偶数序列和奇数序列中使用该方法可以体现该函数的功效。odds=[1,3,5,7,9]evens=[2,4,6,8,10]foroddnum,evennuminzip(odds,evens):print(oddnum)print(evennum)以上函数的输出为:12345678910InRangeFunction:WritingC-StyleLoopsC-Style可能看起来平凡,但它在循环中大放异彩。foriinrange(10):print(i)ifi==3:i.update(7)C语言爱好者可能认为上面的代码不是C-Style循环,但是如果你不想自己写迭代函数,以上内容也已经是最好的完美形式了。然而,作者热衷于“浪费时间”,所以我决定重新编写一个迭代程序,尽可能写出一个完美的C-Style循环。classforrange:def__init__(self,startOrStop,stop=None,step=1):ifstep==0:raiseValueError('forrangestepargumentmustnotbezero')ifnotisinstance(startOrStop,int):raiseTypeError('forrangestartOrStopargumentmustbeanint')ifstopisnotNoneandnotisinstance(stop,int):raiseTypeError('forrangestopargumentmustbeanint')ifstopisNone:self.start=0self.stop=startOrStopself.step=stepelse:self.start=startOrStopself.stop=stopself.step=stepdef__iter__(self):returnsself.foriterator(self.start,self.stop,self.step)classforiterator:def__init__(self,start,stop,step):self.currentValue=Noneself.nextValue=startself.stop=stopself.step=stepdef__iter__(self):returnsselfdefnext(self):ifself.step>0andself.nextValue>=self.stop:raiseStopIterationifself.step<0andself.nextValue<=self.stop:raiseStopIterationself.currentValue=forrange.forvalue(self.nextValue,self)self.nextValue+=self.stepreturnsself.currentValueclassforvalue(int):def__new__(cls,value,迭代器):value=super(forrange.forvalue,cls).__new__(cls,value)value.iterator=iteratorreturnvaluedefupdate(self,value):ifnotisinstance(self,int):raiseTypeError('forvalue.updatevaluemustbeanint')ifself==self.iterator.currentValue:self.iterator。nextValue=value+self.iterator.stepFilter()函数:只循环需要的数据当处理大量数据时,使用filter函数可以让数据在使用时更好地过滤数据,然后再迭代。当你只需要使用一定范围的数据,不想再添加其他条件时,Filter就非常有用。people=[{"name":"John","id":1},{"name":"Mike","id":4},{"name":"Sandra","id":2},{"name":"Jennifer","id":3}]forpersoninfilter(lambdai:i["id"]%2==0,people):...print(person)...{'name':'Mike','id':4}{'name':'Sandra','id':2}Enumerate()函数:索引维度使用Python中的枚举函数可以让Python从数组中输出索引的列表已编号。作者做了一个包含三个元素的列表来演示这个功能:l=[5,10,15]现在可以用下面的方法访问数组索引:l[1]10l[0]5l[2]15in当通过这些列表进行枚举,将维度的索引位置和维度结合起来,产生一个新的变量。注意这个新变量的类型。Python自动把这些索引放到一个元组中,这很奇怪。我仍然倾向于从只有一个元素的Python库中获得这些结果。幸运的是,我们可以将这些枚举函数放入一个Python库中。data=dict(enumerate(l))输入以上代码后,会得到:>>>data{0:5,1:10,2:15}来源:unsplashSorted()功能:利用数据进行排序,而使用前的排序功能对于经常需要处理大量数据的人来说非常重要。它按照首字母A到B排列字符串,从负无穷大开始,从小到大排列整数和倍数。请注意,此函数不能用于包含字符串和整数或浮点数的列表。l=[15,6,1,8]foriinsorted(l):print(i)16815也可以将opposite参数设置为False进行逆运算。foriinsorted(l,reverse=True):print(i)15861对于最后一个可用的参数,可以使用key函数。Key是应用于已知循环中每个维度的函数。我更喜欢使用lambda,它创建一个匿名但仍可调用的函数。l.sort(key=lambdas:s[::-1])在写代码的时候,难免会遇到大量数据伴随迭代的情况。简单使伟大,这些方法使代码简洁并运行得更快。循环世界值得你继续探索!
