zoukankan      html  css  js  c++  java
  • 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循环
    

      

  • 相关阅读:
    填充与复制
    张量排序
    数据统计
    合并与分割
    前向传播(张量)- 实战
    数学运算
    Broadcasting
    TensorFlow2-维度变换
    集合3
    集合2
  • 原文地址:https://www.cnblogs.com/hbcb533/p/3681215.html
Copyright © 2011-2022 走看看