从入门到富豪 发表于 2021-10-30 22:32:30

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

在普通函数的情况下,定义一个迭代器, 用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)

从入门到富豪 发表于 2021-10-30 22:47:47

跪求, 就差这一步了。

kogawananari 发表于 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

从入门到富豪 发表于 2021-10-31 09:31:59

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




大神, 我好像明白了, 生成器函数, 执行了就变成迭代器了,对吧, 再请教一下, 还有asyncio.run接受的参数是aw ,是指await吗?

从入门到富豪 发表于 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())

kogawananari 发表于 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)

kogawananari 发表于 2021-10-31 12:36:13

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

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

不会用可迭代对象就老老实实用for in 遍历,别整别的{:10_292:}
页: [1]
查看完整版本: 迭代器相关基础问题 求大神