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循环