一日一库—itertools

#一日一库——itertools

from itertools import count, chain
import operator
#=======count=========
#count 实现了一个无限累加器,默认从0开始累加,当然我可以给count一个默认初始值
#从这个初始值开始累加
# count 内部实现了__iter__ __next__ 因此它是一个迭代器,可以用通过next来迭代

c = count()
print(c)
print(next(c)) #0 第一次next返回默认值
print(next(c)) #1 以后则累加

#因此我可以for _ in c 产出无限大小值,但是不建议这样做,容易造成编辑器的卡死

c1 = count(10)
print(next(c1))

cc = c1.__next__
print(cc()) #11
print(cc()) #12

#=======chain=========
#遍历所有的可迭代的对象,直到所有参数可迭代对象被遍历完,并返回一个生成器;
a = chain('a我c', 'cde', 'fgh')
print(a)
# 可以通过chain.from_iterables();
print(list(a.from_iterable(['ac', 'df']))) #['a', 'c', 'd', 'f


 

from itertools import repeat, cycle, takewhile, dropwhile, filterfalse
#=============repeat==============
#这个函数没啥好说的,简单粗暴,参数2为要重复参数1的次数,返回一个迭代器
print(list(repeat(2, 10)))
print(list(repeat('ab', 10)))

#==============takewhile==========
#参数1为一个条件函数,常用lambda简写
print(list(takewhile(lambda x: x<5, [1, 2, 4, 5, 3, 4, 10])))

#===============dropwhile==========
#参数1同样为一个条件函数,当条件满足是会丢弃迭代对象中满足条件的对象
#值得注意的是只会丢弃第一个满足的对象之前的数值,之后的数值即使满足条件也会被输出,有点绕口
#看下源码
print(list(dropwhile(lambda x: x<5, [1, 2, 4, 5, 3, 4, 10]))) #print 5, 3, 4, 10
'''
def dropwhile(predicate, iterable):
    # dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1
    iterable = iter(iterable)
    for x in iterable:
        if not predicate(x):
            yield x
            break
    for x in iterable:
        yield x
'''
# 可以看到当遍历对象满足条件函数时,会跳出循环,由于遍历的是同一迭代器,迭代器会保存当前
# 迭代下标,跳出循环后会继续迭代后续的对象

#===============cycle===============
#for _ in cycle('ABC'):
#    print(_)
#无脑的循环输出就完事了

#======================filterfalse===========
#类似之前的dropwhile、takewhile 都是根据条件函数,进行筛选数据
#看源码
'''
def filterfalse(predicate, iterable):
    # filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8
    if predicate is None:
        predicate = bool
    for x in iterable:
        if not predicate(x):
            yield x
'''

 

posted @ 2019-03-30 17:55  我是外婆  阅读(133)  评论(0编辑  收藏  举报