一、迭代器增强
1,迭代器是访问集合的一种方式,迭代器是从第一个元素开始访问,迭代器只能迭代可迭代对象
2,迭代器一旦开始迭代就不能回退
3,迭代器他是线程不安全的,一旦使用不可变的集合有可能会出现不可避免的问题所以我们避免使用不可变的集合
4,迭代器迭代器和for循环的的区别是:
(1)迭代器丢失了索引,证明了迭代器不可操作需要索引的集合会有点吃亏,但我们可以使用函数enumerate()自动添加一个索引来弥补索引的缺失但他操作set集合有一点的优势
(2)迭代器还有一个好的优点就是便利大的文件有优势,因为遍历的时候不是对整个元素进行操作而是使用延迟计算或惰性求值
二、生成器增强
(1)生成器是一个特殊的迭代器
(2) 生成器的两种体现
1,生成器表达式 列如:(x for x inrange(100)) 必须是要小括号括起来
2,使用yield 关键字 但他必须要写在方法里面 每次碰到yield都会
暂停执行,并且在调用next方法来返回值
(3)无线迭代
· count(start,[step])
从start开始,以后每个元素都加上step。step默认值为1。
count(10) --> 10 11 12 13 14 ...
· cycle(p)
迭代至序列p的最后一个元素后,从p的第一个元素重新开始。
cycle('ABCD') --> A B C D A B C D ...
· repeat(elem [,n])
将elem重复n次。如果不指定n,则无限重复。
repeat(10, 3) --> 10 10 10
(4)最短的序列参数终止迭代
· chain(p, q, ...)
迭代至序列p的最后一个元素后,从q的第一个元素开始,直到所有序列终止。
chain('ABC', 'DEF') --> A B C D E F
· compress(data, selectors)
如果bool(selectors[n])为True,则next()返回data[n],否则跳过data[n]。
compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F
· dropwhile(pred, seq)
当pred对seq[n]的调用返回False时才开始迭代。
dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1
· takewhile(pred, seq)
dropwhile的相反版本。
takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4
· ifilter(pred, seq)
内建函数filter的迭代器版本。
ifilter(lambda x: x%2, range(10)) --> 1 3 5 7 9
· ifilterfalse(pred, seq)
ifilter的相反版本。
ifilterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8
· imap(func, p, q, ...)
内建函数map的迭代器版本。
imap(pow, (2,3,10), (5,2,3)) --> 32 9 1000
· starmap(func, seq)
将seq的每个元素以变长参数(*args)的形式调用func。
starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
· izip(p, q, ...)
内建函数zip的迭代器版本。
izip('ABCD', 'xy') --> Ax By
· izip_longest(p, q, ...,fillvalue=None)
izip的取最长序列的版本,短序列将填入fillvalue。
izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
· tee(it, n)
返回n个迭代器it的复制迭代器。
· groupby(iterable[, keyfunc])
这个函数功能类似于SQL的分组。使用groupby前,首先需要使用相同的keyfunc对iterable进行排序,比如调用内建的sorted函数。然后,groupby返回迭代器,每次迭代的元素是元组(key值, iterable中具有相同key值的元素的集合的子迭代器)。或许看看Python的排序指南对理解这个函数有帮助。
groupby([0, 0, 0, 1, 1, 1, 2, 2, 2]) --> (0, (0 0 0)) (1, (1 1 1)) (2, (2 22))
(5)组合迭代器
· product(p, q, ... [repeat=1])
笛卡尔积。
product('ABCD', repeat=2) --> AA AB AC AD BA BB BC BD CA CB CC CD DA DB DCDD
· permutations(p[, r])
去除重复的元素。
permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
· combinations(p, r)
排序后去除重复的元素。
combinations('ABCD', 2) --> AB AC AD BC BD CD
· combinations_with_replacement()
排序后,包含重复元素。
combinations_with_replacement('ABCD', 2) --> AA AB AC AD BB BC BD CC CD DD
三、闭包和&LEGB
所谓闭包,就是讲组成函数的语句和这些的语句的执行环境打包在一起时得到的对象
很明显闭包将会捕捉内层函数执行所需的整个环境
四,装饰器
装饰器实际上就是为了给某程序增添功能,但该程序已经上线或已经被使用,那么就不能大批量的修改源代码,这样是不科学的也是不现实的,因为就产生了装饰器,使得其满足:
不能修改被装饰的函数的源代码
不能修改被装饰的函数的调用方式
满足1、2的情况下给程序增添功能
同时满足了这三点原则,这才是我们的目的。因为,下面我们从解决这三点原则入手来理解装饰器。
函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器