鱼C论坛

 找回密码
 立即注册
查看: 1947|回复: 6

迭代器相关基础问题 求大神

[复制链接]
发表于 2021-10-30 22:32:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在普通函数的情况下,定义一个迭代器, 用next()方法就可以调用 ,但是为什么放到类中了,用next()方法 就会报错呢?

class AA():

    def getone(self):  # 这是一个迭代器
        val = 0
        while True:
            val += 1
            yield val


    async def xieru(self,id,delay):
        # global g
        while True:
            await asyncio.sleep(delay)
            print(id,next(self.getone()))  #这里用迭代器取值就报错了。

    async def main(self):
        task1 =asyncio.create_task(self.xieru("AA",1)) #线程AA
        task2 =asyncio.create_task(self.xieru("BB",2))  #线程BB
        task3 = asyncio.create_task(self.xieru("CC",3))  #线程CC
        await task1 #把线程加入可等待队列
        await task2
        await task3
if __name__ =='__main__':
    aa = AA()
    asyncio.run(aa.main)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-30 22:47:47 | 显示全部楼层
跪求, 就差这一步了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-31 01:48:01 | 显示全部楼层
本帖最后由 kogawananari 于 2021-10-31 12:36 编辑

你这是生成器函数 不是迭代器  执行了才是  类似于一个闭包函数 你每次都 foo()()怎么能行
import asyncio

class AA():
    def getone(self):  # 这是一个生成器函数
        val = 0
        while 1:
            val += 1
            yield val

    async def xieru(self,id,delay):
        for i in self.getone():
            await asyncio.sleep(delay)
            print(id,i)

    async def main(self):
        task1 =asyncio.create_task(self.xieru("AA",1)) 
        task2 =asyncio.create_task(self.xieru("BB",2))  
        task3 = asyncio.create_task(self.xieru("CC",3)) 
        await task1
        await task2
        await task3
if __name__ =='__main__':
   
    aa = AA()
    asyncio.run(aa.main())

另外asyncio.run接受的参数是aw 不是async function
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-31 09:31:59 | 显示全部楼层
kogawananari 发表于 2021-10-31 01:48
你这是生成器函数 不是迭代器  执行了才是  类似于一个闭包函数 你每次都 foo()()怎么能行

大神, 我好像明白了, 生成器函数, 执行了就变成迭代器了,对吧, 再请教一下, 还有asyncio.run接受的参数是aw ,是指await吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-31 09:48:15 | 显示全部楼层
kogawananari 发表于 2021-10-31 01:48
你这是生成器函数 不是迭代器  执行了才是  类似于一个闭包函数 你每次都 foo()()怎么能行

但是为啥我在类外面写,执行getone() 显示的是迭代对象呢?
mylist = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
def getone():
    for val in mylist:
        # print(val)
        yield val

async def xieru(id, delay):
    try:
        while True:
            await asyncio.sleep(delay)
            print(id, getone())  # next取yield的值
    except:
        print('取值完成')

async def main():
    task1 = asyncio.create_task(xieru("AA", 2))  # 协程AA
    task2 = asyncio.create_task(xieru("BB", 2))  # 协程BB
    await task1
    await task2

asyncio.run(main())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-31 11:48:31 | 显示全部楼层
从入门到富豪 发表于 2021-10-31 09:31
大神, 我好像明白了, 生成器函数, 执行了就变成迭代器了,对吧, 再请教一下, 还有asyncio.run接受的 ...

aw是 coroutine, task, future的总称
其中coroutine是async function的返回值
类似的
asyncio.run(aw)
asyncio.create_task(aw)
asyncio.gather(*aws)
asyncio.as_completed(aws)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-31 12:36:13 | 显示全部楼层
从入门到富豪 发表于 2021-10-31 09:48
但是为啥我在类外面写,执行getone() 显示的是迭代对象呢?
mylist = ['a', 'b', 'c', 'd', 'e', 'f', ...

getone()是可迭代对象  你把他当成闭包函数加了一个括号就行  next当成加了2个括号

不会用可迭代对象就老老实实用for in 遍历,别整别的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 22:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表