1、类表解析 列表解析可以编写任意数量的瞧他的for循环,并且每一个都有可选的if测试,结构如下: [expression for target1 in iterable1 [if condition1] for target2 in iterable2 [if condition2] for target3 in iterable3 [if condition3] ... for targetN in iteratbleN [if condtionN] ] 例如: [x+y+z for x in [0,1,2] for y in [100,200,300] for z in [-1,-2,-3] if z >0 ] 2、列表解析的速度>map的速度>for的速度 3、如果一个函数含有yield,则这个函数支持迭代器,在for循环中,如果对象支持迭代协议,则使用迭代协议遍历对象,如果对象不支持迭代协议,则通过索引来遍历对象 4、生成器函数的应用 例如: def gensquares(N): for i in range(N): yield i**2 1、生成器表达式 生成器表达式同列表解析式一样,只是外面的括号换成了圆括号,而不是方括号。这个表达式返回迭代器。 例如: G = (x**2 for x in range(5)) print(G.__next__()) #输出:0 print(next(G)) #输出:1 print(next(G)) #输出:4 2、生成器函数和生成器表达式都是单迭代器对象 3、使用迭代工具模拟zip和map 例如: def mymap(func,*args): for arg in zip(*args): yield func(*arg) 或者: def mymap(func,*args): return (func(*arg) for arg in zip(*args)) def myzip(*seqs): seqs = [list(s) for s in seqs] res = [] for all(seqs): res.append(tuple(s.pop(0) for s in seqs)) return res def myzip(*seqs,pad = None): seqs = [list(s) for s in seqs] res = [] for any(seqs): res.append(tuple((s.pop(0) if s else pad) for s in seqs)) return res 4、对迭代的各种方法进行计时 #file mytimer.py 计时文件 import time reps = 1000 replist = range(reps) def timer(func , *pargs,**kargs): start = time.clock() for i in replist: ret = func(*pargs,**kargs) elapse = time.clock-start return (elapse,ret) #file timeseqs.py 测试文件 import sys,mytimer reps = 1000 repslist = range(reps) def forLoop(): #for循环 res = [] for x in repslist: res.append(abs(x)) return res def listcomp(): #列表解析 return [abs(x) for x in repslist] def mapCall(): #map函数 return list(map(abs,repslist)) def genExpr(): #生成器表达式 return list(abs for x in repslist) def genFunc():#生成器函数 def gen(): for x in repslist: yield abs(x) return list(gen()) print(sys.version) for test in (forLoop,listcomp,mapCall,genExpr,genFunc): elapsed,result = mytimer.tester(test) print('-'*33) print('%-9s: %.5f =>[%s...%s] % (test.__name__,elapse,result[0],result[-1])) #通过测试可以得出,map速度〉列表解析 〉 生成器函数速度 〉生成器表达式〉for循环