python迭代器与生成器

本文详细介绍了Python中的列表推导式、字典推导式和集合推导式,以及可迭代对象、迭代器和生成器的概念和用法。通过实例展示了如何使用生成器表达式和生成器函数,并探讨了yield与return的区别。最后总结了迭代对象、迭代器和生成器之间的区别,强调了生成器在内存效率上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

  • python推导式
  • python可迭代对象(iterable)
  • 迭代器(iterator)
  • 生成器(genatator)
  • 总结

一、python推导式

1、列表推导式

a = [1,2,3,4,5,6,7]
b = [x for x in a if x % 2 == 1]
print(b)

2、字典推导式

d1 = {"a":1, "b":2}
d2 = {v:k for k,v in d1.items()}
print(d2)

3、集合推导式:和列表推导式差不多,只不过使用{},自动去重

a = [1,-1,2,1]
b = {i*i for i in a if i in a}
print(b)

二、python可迭代对象

能被for循环的都是可迭代对象

实现了__iter__方法,并且该方法返回一个迭代器的对象

​
lst = ["x","y",1,2,3]
print(dir(lst))

​

三、迭代器(iterator)

实现了__iter__和__next__方法的都叫迭代器;

__iter__方法返回自身;

__next__方法返回下一个值。

在for循环中,for先调用可迭代对象__iter__方法,返回一个迭代器,然后再对迭代器调用__next__方法,直到最后一个退出。

迭代器是懒加载,惰性求值,需要的时候在生成。

四、生成器(genatator)

生成器它不需要手动实现__iter__和__next__方法;

是迭代器更优雅的写法。

生成器有两个写法:a生成器表达式  b生成器函数。

a生成器表达式:

生成器表达式类似于列表推导式,只不过使用()。

例:

result = (x for x in range(1,31) if x % 3 == 0)
print(result)
print(dir(result))

b生成器函数:

包含了yield关键字的函数就叫做生成器函数

例:

def get_content():
    x = 2
    yield x
    y = 3
    yield y
    z = 4
    yield z

g = get_content()
print(g)
print(dir(g))
#第一次执行next的时候,遇到yield就退出,并且返回yield后面携带的参数,还会记录之前的位置
print(next(g))
#第二次执行的时候就会从上一次执行的地方继续执行
print(next(g))
print(next(g))

例题:

用生成器函数实现斐波拉契数列

def func1():
    o, t = 0, 1
    while 1:
        yield t
        o, t = t, t + o
u = func1()
for i in range(1,8):
    print(next(u))

​​

yield与return的比较

              * 相同点:都可以返回一个值,值的类型和个数没有限制

              * 不同点:yield返回的值可以保存返回值的状态,可以多次返回

                              Return返回值只能返回一次,函数就会退出

五、总结

迭代对象、迭代器、生成器的区别

  1. 可直接作用于for循环的对象称为可迭代对象,可迭代对象实现了__iter__()方法。
  2. 迭代器则是实现了__iter__()和__next__()方法的对象,可以显示地获取下一个元素。
  3. 生成器是特殊的迭代器,生成器返回一个迭代器,生成器中包含yield关键字,相当于一个断点,执行到此返回一个值后暂停,从而实现next取值。

​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值