动态方式生成列表
这样的方式生成列表会有一个特点:就是列表中的元素都是一下子生成的,因为这里之生成10个元素,因为元素数量比较少,所以体会不到,当我们这样的话:[i for i in range(10000)],这个程序为了形成列表会循环10000次,然后生成列表,这个速度会很慢,而且我们可能有时只需要列表中的前10个数据,而10之后的用不到,这就造成了资源内存的浪费,为了解决这个问题,我们可以使用python生成器。
生成器
要想将[i for i in range(10000)]变成生成器会非常的简单,只需要将[]改成()即可,这就是生成器,比如
现在list里面没有任何元素,只有我们使用list的时候才会有生成元素,元素使用到哪里,迭代器就生成到哪里的元素,而且使用的时候必须只能从索引为0开始使用,也就是从第一位开始逐渐往后生成,不可以直接调到其它位置使用,比如:
而且生成器的索引只能往后走,不能倒退
该程序生成了一个生成器,其中第一个循环对其进行遍历,因为是初次遍历,所以肯定是从索引0开始的,第二次进行遍历,因为生成器的光标只能往下走,所以第二次的遍历并不是从头开始遍历,而是继续当前光标进行遍历,接下来输出next也是接着当前的坐标进行遍历。
yield
我们可以在方法中使用yield,从而将方法变成一个生成器函数,当生成器函数内部调用yield,生成器函数的状态会被冻结,所有的变量的值会被保留下来,下一行要执行的代码的位置也会被记录,直到再次调用next()。一旦next()再次被调用,生成器函数会从它上次离开的地方开始。如果永远不调用next(),yield就一直记录原来的文字。
程序
结果
每调用一次fun()就会生成一个动态列表,所以list和list1不是同一个动态列表,这个动态列表的全部内容是["huan","feng","de","bian","cheng","ri","ji"]这个不是一次生成的,而是每调用一次动态列表,迭代器会往下执行,直到执行到yield,此时程序停止,然后生成一个列表元素,我们就可以获取到了。
在生成器函数中,return的作用就是返回异常,当执行到return的时候,会把它当作异常返回给调用者
我们可以对其进行异常处理
yield的两个功能
功能一:第一返回参数(next)
功能二:第二是执行接收参数(send)
会有以下几种情况:
一:执行功能一,然后执行功能二,不断交替执行
二:执行功能一,然后继续执行功能一,也就是不断next,这样功能二就被跳过了
三:执行功能二,也就是跳过功能一,但有一点需要注意,就是第一个yield不可以跳过功能1
举例一,全部执行功能1
过程分析:第一个next会执行返回数据获取到11,输出11(因为没有send方法,所以接收数据环节全部省略)