python中生成式和生成器、迭代器与可迭代

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。一般迭代器一定可迭代,但可迭代不一定是迭代器。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值