可迭代对象与迭代器
可迭代对象与迭代器概念不同。可迭代对象在内部实现了__iter__
,所以可以进行迭代,迭代器在内部实现了__iter__
和__next__
,所以是个迭代器也可以进行迭代。
举例:
1 | for x in range(10)] mylist = [x |
生成器
生成器本质就是一个迭代器,自带了iter
方法和next
方法。迭代器是用来迭代可迭代对象的,而生成器是用来迭代方法的。调用函数的之后函数不执行,返回一个生成器每次调用next
方法的时候会取到一个值直到取完最后一个,再执行next会报错。
生成器表达式类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。
比较:
- 列表表达式在生成后可以按序列取值,排序,切片等,但是占用内存大。
- 生成器表达式只是产生一个可迭代对象,需要时再迭代取值,占用内存小,但是不可进行列表的操作,迭代完后对象清空。
itertools
itertools.product
产生多个列表和迭代器的笛卡尔积,可以用product来改写深度嵌套的列表推导操作。
1 | 'ABC', range(3)) x = itertools.product( |
itertools.accumulate
简单来说就是累加。
1 | import itertools |
itertools.chain
连接多个列表或者迭代器。
1 | 3), range(4), [3,2,1]) x = itertools.chain(range( |
itertools.combinations
求列表或生成器中指定数目的元素不重复的所有组合
1 | 4), 3) x = itertools.combinations(range( |
itertools.combinations_with_replacement
允许重复元素的组合
1 | 'ABC', 2) x = itertools.combinations_with_replacement( |
itertools.count
就是一个计数器,可以指定起始位置和步长
1 | 20, step=-1) x = itertools.count(start= |
itertools.cycle
循环指定的列表和迭代器
1 | 'ABC') x = itertools.cycle( |
itertools.dropwhile
按照真值函数丢弃掉列表和迭代器前面的元素
1 | lambda e: e < 5, range(10)) x = itertools.dropwhile( |
itertools.takewhile
与dropwhile相反,保留元素直至真值函数值为假。
1 | lambda e: e < 5, range(10)) x = itertools.takewhile( |
itertools.filterfalse
保留对应真值为False的元素
1 | lambda e: e < 5, (1, 5, 3, 6, 9, 4)) x = itertools.filterfalse( |
itertools.groupby
按照分组函数的值对元素进行分组
1 | 10), lambda x: x < 5 or x > 8) x = itertools.groupby(range( |
itertools.islice
上文使用过的函数,对迭代器进行切片
1 | 10), 0, 9, 2) x = itertools.islice(range( |
itertools.repeat
简单的生成一个拥有指定数目元素的迭代器
1 | 0, 5) x = itertools.repeat( |
itertools.zip_longest
类似于zip,不过已较长的列表和迭代器的长度为准
1 | 3), range(5)) x = itertools.zip_longest(range( |