python学习(十)——迭代器、生成器

本文深入探讨了Python中迭代器和生成器的概念及其应用,包括for循环的工作原理、生成器函数的特点,以及如何利用生成器实现高效内存管理。通过具体实例展示了生成器在实际编程中的优势。

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

一、迭代器、生成器

1、for循环:

(1)__iter__方法转换成可迭代对象

#基于for循环,我们可以完全不再依赖索引去取值了
dic={'a':1,'b':2,'c':3}
for k in dic:
    print(dic[k])

#for循环的工作原理
#1:执行in后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic
#2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码
#3: 重复过程2,直到捕捉到异常StopIteration,结束循环

num = [1,2,10,5,3,7]
for i in num: 
    print(i)
# i_num=num.__iter__()
# i_num.__next__()

2、生成器(自身有__next__()方法)

#只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码

def func():
    print('====>first')
    yield 1
    print('====>second')
    yield 2
    print('====>third')
    yield 3
    print('====>end')

g=func()
print(g) #<generator object func at 0x0000000002184360>

(1)三元表达式

name='a'
name='l'
res='ss' if name == 'alex' else '哥' # 先判断,T前,F后
print(res)

(2)列表解析

egg_list=[]
for i in range(10):
    egg_list.append('鸡%s' %i)
print(egg_list)

l=['鸡%s' %i for i in range(10)]


l1=['鸡%s' %i for i in range(10) if i > 5 ]

#没有四元表达式

laomuji=('鸡蛋%s' %i for i in range(10)) #生成器表达式
# 比列表解析更省内存

l=[1,2,3,34]
map(func,l)

(3)生成器函数

# 买包子(全部做完再买)
def product_baozi():
	ret=[]
	for i in range(100):
		ret.append('一屉包子%s' %i)
	return ret
baozi_list=product_baozi()
print(baozi_list)

#生成器函数(做一个买一个)
def product_baozi():
	for i in range(100):
		print('正在生产包子')
		yield '一屉包子%s' %i #i=1  # yield可以保存函数状态
		print('开始卖包子')
pro_g=product_baozi()

baozi1=pro_g.__next__()
#加代码
# baozi2=pro_g.__next__()

# 母鸡下蛋
def xiadan():
	ret=[]
	for i in range(100):
		ret.append('鸡蛋%s' %i)
	return ret

print(xiadan())
#缺点1:占空间大
#缺点2:效率低

# 下一个吃一个
def xiadan():
    for i in range(1000):
        yield '鸡蛋%s' %i

alex = xiadan()
print(alex.__next__())
print(alex.__next__())
print(alex.__next__())

(4)生成器特性

# 可将函数应用于for循环
# 延迟计算
def xiadan():
    for i in range(1000):
        yield '鸡蛋%s' %i

alex = xiadan()
for jd in alex:
    print(jd)

(5)send

#yield 3相当于return 控制的是函数的返回值
#x=yield的另外一个特性,接受send传过来的值,赋值给x
def test():
    print('开始啦')
    firt=yield #return 1   first=None
    print('第一次',firt)
    yield 2
    print('第二次')

t=test()
res=t.__next__() #next(t)
print(res)
# t.__next__()
# res=t.send(None)
res=t.send('函数停留在first那个位置,我就是给first赋值的')
print(res)

 

(6)消费者生产者模型

import time
def producer():
    ret=[]
    for i in range(100):
        time.sleep(0.1)
        ret.append('包子%s' %i)
    return ret

def consumer(res):
    for index,baozi in enumerate(res):
        time.sleep(0.1)
        print('第%s个人,吃了%s' %(index,baozi))

res=producer()
consumer(res)


def consumer(name):
    print('我是[%s],我准备开始吃包子了' %name)
    while True:
        baozi=yield
        time.sleep(1)
        print('%s 很开心的把【%s】吃掉了' %(name,baozi))

def producer():
    c1=consumer('wupeiqi')
    c2=consumer('yuanhao_SB')
    c1.__next__()
    c2.__next__()
    for i in range(10):
        time.sleep(1)
        c1.send('包子 %s' %i)
        c2.send('包子 %s' %i)
producer()

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值