初学python时,感到[for i in range(10)]这种语法实在太强大了,再也不用像C语言那样写for循环了,迭代器在python中用途非常广泛,除了range这样的迭代器,迭代器的巨大优势在于速度快,内存占用极低,在python内置的Itertools中提供了更多的迭代器,使用起来效率高,代码更优雅。
Itertools中提供了3类迭代器:
一、无穷类型
无穷类型顾名思义就是可以一直迭代下去
count()
计数器,这个方法两个参数,迭代起始值start,步进值step。
cycle()
循环器,这个方法一个参数,提供一个可迭代的对象,然后提供一个循环迭代器。
repeat()
重复,这个方法两个参数,第一个是传入一个对象,然后一直重复返回这个对象,后面的times是可选参数,表示重复的次数,默认为无限次。
二、通过序列生成
这个类型是传入一个有限序列,经过变换后返回一个迭代器
accumulate()
accumulate是累积的意思,接受两个参数,第一个参数是可迭代对象,第二个为可选参数,是一个方法,用来对前面的迭代器进行操作,默认为加法。
chain()
chain接受的参数是可变参数,然后将传入的参数串起来,逐个返回。
chain.from_iterable()
它和chain功能一样,区别是接收的参数为可迭代对象。
compress()
compress是压缩的意思,它接收两个参数,第一个data为被操作的数据,第二个参数为选择器,data和selectors位置一一对应,selectors中为True时,data中对应的元素会返回,如果为False则跳过。
dropwhile()
dropwhile接收两个参数,第一个为一个函数,第二个为可迭代对象,当可迭代对象中的内容传入第一个函数返回为假时才开始返回内容,否则被丢弃。
filterfalse()
filterfalse接收两个参数,第一个为一个函数,第二个为可迭代对象,当可迭代对象中的内容传入第一个函数返回为假时则返回传入的内容,否则被丢弃。
groupby()
groupby接收两个参数,第一个参数为可迭代对象,第二个为分组方法,它是可选参数,默认为返回自身,groupby和SQL中的groupby不一样,它是根据顺序来的,不会纵观整个序列后进行分组,只要前后两个元素不一样就分组了,而且前面迭代生成的分组会消失,需要自行存储。
islice()
islice是生成切片的迭代器,用法非常简单看上图的例子就明白了。
starmap()
starmap接收两个参数,第一个为一个函数,第二个为可迭代对象,依次将可迭代对象的元素传入函数,然后返回函数计算后的结果,它和map的区别是它可以接收可变参数。
takewhile()
takewhile第一个参数是条件判断,第二个为可迭代对象,依次将可迭代对象的元素传入predicate中,如果为真就返回,一旦为假就中止迭代。
tee()
tee的作用是用一个可迭代对象生成多个迭代器,当使用tee以后,原可迭代对象要避免再被使用,如果临时存储的数据量过大则应该使用list。
zip_longest()
和zip的功能一样,但是它可以组合多个可迭代对象
三、排列组合迭代器
这个系列的迭代器非常有用,因为在很多场景我们都需要将数据进行排列组合。
product()
product可以对多个输入序列进行排列组合,组合方式为笛卡尔积。
permutations()
permutations会考虑组合的顺序
combinations()
combinations不考虑顺序,不放回数据。
combinations_with_replacement()
combinations_with_replacement不考虑顺序,有放回数据。
领取专属 10元无门槛券
私享最新 技术干货