python中生成式和生成器、迭代器与可迭代
标签: python
列表生成式
这个是在python
中可以快速创建一个列表的操作,如果没有列表生成式,要创建一个list里面存储0-9,那么你需要使用一个for循环,然后一直append,但是有了列表生成就可以一句话即可:
list(range(0,10))
,其中range可以生成0-9的序列。除了这样写,还可以[i for i in range(0,10)]
这样也能生成一个列表,在python中列表生成器非常灵活,其实就是for循环的连写,不用换行,直接写在一个[]
,并且还能做判断:[i for i in range(0,10) if i%2==0]
,就是生成了一个偶数的列表。关于列表在[]里面的for除了可以遍历一个range还可以遍历一个列表或者其他的可遍历的。
比如a =[1,2,3]
如果想生成一个b里面存的是a的2倍,则可以使用[2*i for i in a]
。
生成器
上面通过生成式虽然可以生成一个列表,但是如果我们列表过于大,可能一次存储不下,所以便有了生成器这个说法。
生成器你可以把他看做一个方法,每次使用一下它,他就能帮你按照你的规则生成一个数。在python中可以使用两种方法创建一个生成器。
第一种就是把上面的生成式中的[]
换成()
,比如g =(i for i in range(0,9))
,其实就是创建了一个生成器g,你可以使用next(g)
访问生成器的一个一个的值,也可以使用for i in g:
来遍历整个生成器,只是使用next的时候在访问到最后一个元素会抛出一个异常,而for不会。
第二种是通过yield
关键字,我们可以定义一个函数:
def gen():
print("***")
for i in range(10):
yield i
print("----")
g = gen()
print(next(g))
print("%%%")
for i in g:
print(i)
你会发现输出的可能跟你想象的不一样,在这里由于函数中有yield
关键字,所以把这个函数看做是一个生成器,你可以使用type来看g的类型,然后调用的时候g = gen()
你发现并没有输出***
,这是由于g=gen()只是创建了一个生成器,但是并没有使用,而下面使用next(g)
就相当于使用了生成器开始,生成器会走到yiled那个地方,然后停止,等待下次使用next,所以print(next(g))
后会输出两句话第一个是***和0,然后我们使用for遍历生成器,其实还是相当于调用了next,只是帮你执行了,所以继续访问,则会输出1-9,然后生成器在生成结束后,就相当于函数结束,所以会输—。生成器的概念可能不太好理解,但是多做点题估计就行了。
def gen():
i =0
while True:
yield i
i=i+1
g = gen()
for i in g:
print(i)
这个代码就相当于做了一个不断生成递增数的生成器。
迭代器和可迭代
可迭代的概念比较好理解,向我们之前学的列表,元组,以及生成式,生成器,这些都可以通过for遍历,所以都是可迭代的,所以都是Iterable
你可以通过下面代码检查是否可迭代:
from collections import Iterable
a = [1,2,3]
isinstance(a, Iterable)
而迭代器代表能够使用next访问下个元素的,比如上面学习的生成器就是一个迭代器,你可以通过下面代码检查是否为一个迭代器。
from collections import Iterator
a = (x for x in range(10))
isinstance(a, Iterator)
一定注意一个是Iterable
一个是Iterator
。一般迭代器一定可迭代,但可迭代不一定是迭代器。