python迭代器和解析

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

  

原文地址:https://www.cnblogs.com/hbcb533/p/3681215.html