迭代器相关基础问题 求大神
在普通函数的情况下,定义一个迭代器, 用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) 跪求, 就差这一步了。 本帖最后由 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
kogawananari 发表于 2021-10-31 01:48
你这是生成器函数 不是迭代器执行了才是类似于一个闭包函数 你每次都 foo()()怎么能行
大神, 我好像明白了, 生成器函数, 执行了就变成迭代器了,对吧, 再请教一下, 还有asyncio.run接受的参数是aw ,是指await吗? 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()) 从入门到富豪 发表于 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)
从入门到富豪 发表于 2021-10-31 09:48
但是为啥我在类外面写,执行getone() 显示的是迭代对象呢?
mylist = ['a', 'b', 'c', 'd', 'e', 'f', ...
getone()是可迭代对象你把他当成闭包函数加了一个括号就行next当成加了2个括号
不会用可迭代对象就老老实实用for in 遍历,别整别的{:10_292:}
页:
[1]