python生成器笔记

生成器:自动实现了迭代器协议(对象必须提供一个next方法,执行改方法要么返回迭代中的下一项,要么就引起一个StopIteration的异常,以终止迭代(只能往后走不能往前进))

第一种形式:idter=(i for  i  in  range(10))

idter为一个生成器,有next()方法,idter.__next__()---------python3        idter.next()----------------python2


第二种形式:

     函数中的生成器:

                      def  test():

                                yield 1

                               yield 2

yield和return都是返回函数的值,但是yield可以多次返回,只需要用next()方法来实现


生成器的好处

吃饱子问题:

def   prduct_baozi():

            ret=[]

           for  i   in  range(100):

                    ret.append('包子%s'  % i)

           return  ret

生成器可以保留函数的执行的上一次的状态

生成器总结:


 语法上和函数的类似:生成器函数和常规的函数几乎是相同的,他们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return返回一个值

自动实现迭代器协议:对于生成器,python会自动实现迭代器协议,以便于应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next()方法,并且,在没有可以返回的时候,生成器会自动产生StopIteration异常

状态挂起: 生成器使用yield语句返回一个值,yield语句挂起改生成器的状态,保留足够的信息,以便之后从它离开的地方继续执行


优点:生成器的好处是延迟计算,一次返回一个结果也就是说,它不会一次生成所有的结果,这对于大多数的数据处理来说

列表解析:

 sum([i   for    i    in    range(100000000000000000)])  #占用内存太大,机器容易卡死

生成器表达式:

sum(i   for   i   in   range(100000000000)   )  #几乎不占内存

优点:生成器还可以有效的提高代码的可读性


           



猜你喜欢

转载自blog.csdn.net/qq_40229995/article/details/80494751