python学习之生成器&三者关系

1.生成器 generator

python中一边循环一边计算的机制,叫做生成器

1.1生成器表达式

列表推导式

复制代码
li = [i*5 for i in range(5)]
print(li)
gen = (i*5 for i in range(5)) #列表推导式的[]改为()就成了生成器表达式
print(gen)
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))

1.2生成器表达式

python中,使用yield关键字的函数就称之为生成器表达式

yield的作用:

1.类似return,将指定值或多个是返回给调用者

2.yield语句一次返回一个结果,在每个结果中间,挂起函数,执行__next__(),再重新从挂起点继续往下执行

使函数中断,并保存状态

复制代码
li = []
def test():
    global li
    li.append('a')
    print('li:',li)
test()
test()
生成器函数
def gen():
    print("开始了")
    yield 'a'  #返回了一个'a',并暂停函数,在此处挂起,下一次再从此处恢复执行
    yield 'b'
    yield 'c'
gen_01 = gen()
print(gen_01)
print(next(gen_01))
print(next(gen_01))
print(next(gen_01))
复制代码
def gen_2(n):
    li = []
    # for i in range(n):
    #     li.append(i)
    a = 0
    while a <= n:
        li.append(a)
        yield a
        a += 1
    print('li: ',li)
print(gen_2(9))
for i in gen_2(9):
    print(i)
复制代码
# 使用yield关键字就是生成器函数
def test_a():
    yield 1
    yield 2
    yield 3
print(test_a())
ta = test_a()
print(next(ta))   #从对象里面取值
print(next(ta))
print(next(ta))
print(next(test_a()))  #加括号是调用函数,永远都是<generator object test_a at 0x00000233D5F40F90>的下一个,也就是1
print(next(test_a()))
print(next(test_a()))
复制代码
4.三者关系
可迭代对象只实现了python迭代协议,可以通过for...in...循环遍历的对象,比如list、dict、str...、迭代器、生成器
迭代器: 可以记住自己遍历位置的对象,直观体现就是使用next()函数返回值,迭代器只能往前,不能往后(单向),当遍历完毕后,迭代器会抛出异常StopIteration
生成器:是特殊的迭代器,需要注意一下迭代器不一定是生成器,它是python中提供的通过简便的方法写出迭代器的一种手段
包含关系:可迭代对象>迭代器>生成器
相关推荐
一隅论数智3 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
XiHongShi20163 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
爱吃苹果的日记本3 天前
离散数学第六课
学习·离散数学
AI职业加油站3 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
奇思妙想聪明勤奋的小羊3 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
彧azz3 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
我爱cope3 天前
【操作系统 | 计算机硬件:CPU、内存与 I/O 如何支撑操作系统?】
学习·操作系统