Discuss / Python / 复习python基础知识,打卡第七天

复习python基础知识,打卡第七天

Topic source

飞云

#1 Created at ... [Delete] [Delete and Lock User]

看到评论里有个网友用生成器做本节练习,感觉代码是没问题的,但运行出错,没想明白,囤着以后再想

@郁闷~喝可乐 

def create_counter():

    i = 0

    def counter():

        nonlocal i

        while True:

            i += 1

            yield i

    return counter

gc = create_counter()()

print([next(gc) for i in range(10)])

Here the error is:

File "<pyshell#156>", line 1, in <listcomp>

    print([next(gc) for i in range(10)])

TypeError: 'function' object is not an iterator

yan32777

#2 Created at ... [Delete] [Delete and Lock User]

gc返回的是函数,而不是函数内的yield i这句,这句调用gc时才会用到,next(gc())这样估计就对了。

Super-String

#3 Created at ... [Delete] [Delete and Lock User]

GitHub Copilot: 在你的代码中,`create_counter()` 函数返回的是一个生成器函数 `counter()`,而不是一个生成器对象。因此,当你调用 `create_counter()()` 时,返回的是一个函数对象,而不是一个生成器对象。因此,当你尝试使用 `next()` 函数从函数对象中获取下一个值时,会出现 `'function' object is not an iterator` 的错误。

要解决这个问题,你需要将 `create_counter()` 函数返回的生成器函数 `counter()` 调用一次,以创建一个生成器对象。然后,你可以使用 `next()` 函数从生成器对象中获取下一个值。以下是修改后的代码:

```python

def create_counter():

    i = 0

    def counter():

        nonlocal i

        while True:

            i += 1

            yield i

    return counter()

gc = create_counter()

print([next(gc) for i in range(10)])

```

在上面的代码中,我们将 `create_counter()` 函数返回的生成器函数 `counter()` 调用一次,以创建一个生成器对象。然后,我们使用 `next()` 函数从生成器对象中获取下一个值,并将其添加到列表中。最后,使用列表推导式输出列表。

请注意,由于生成器对象是一个可迭代对象,因此可以使用 `for` 循环来遍历它。例如,以下代码将生成器对象中的前 10 个值输出到控制台:

```python

for i in range(10):

    print(next(gc))

```


  • 1

Reply