pionrrt 发表于 2023-6-30 23:33:52

关于生成器的问题

为啥这俩结果不一样呢
def counter():
    i=0
    while i<=5:
      yield 1
      i+=1

for i in counter():
    print(i)

def counter():
      i = 0
      while i <= 5:
            yield i
            i+= 1
for i in counter():
   print(i)

sfqxx 发表于 2023-6-30 23:37:48

本帖最后由 sfqxx 于 2023-6-30 23:42 编辑

好的,我会更详细地解释这两段代码的执行过程。

首先,让我们分别看一下每段代码中的`counter`函数:

第一段代码中的 `counter` 函数如下所示:
def counter():
    i = 0
    while i <= 5:
      yield 1
      i += 1
在这个函数中,我们使用了一个`while`循环来判断`i`是否小于等于5。然后,在每次循环迭代时使用`yield 1`语句返回数字1。也就是说,无论循环进行多少次,`yield`语句总是会返回数字1。

接下来,我们看一下第二段代码中的 `counter` 函数:
def counter():
    i = 0
    while i <= 5:
      yield i
      i += 1
在这个函数中,同样使用了一个`while`循环来判断`i`是否小于等于5。然后,在每次循环迭代时使用`yield i`语句返回变量`i`的当前值。也就是说,每次循环都会返回当前的`i`值,并且在下一次循环时,`i`会增加1。

现在我们分别来执行这两段代码并观察它们的输出结果。

对于第一段代码,我们使用以下代码执行它:

for i in counter():
    print(i)
输出结果如下:

1
1
1
1
1
1
可以看到,输出结果一直是数字1,并且一共打印了6次。这是因为在`yield 1`语句中,我们始终返回的是固定的数字1,并没有改变它。

接下来,对于第二段代码,我们使用以下代码执行它:

for i in counter():
    print(i)
输出结果如下:
0
1
2
3
4
5
可以看到,输出结果依次是从0到5的数字。这是因为在`yield i`语句中,我们返回的是当前的`i`值,并且在每次循环迭代时,`i`会增加1。所以在每次迭代中,我们都打印出了`i`的不同值,从0递增到5。

求最佳答案{:10_254:}

歌者文明清理员 发表于 2023-6-30 23:38:38

sfqxx 发表于 2023-6-30 23:37
好的,我会更详细地解释这两段代码的执行过程。

首先,让我们分别看一下每段代码中的`counter`函数:


求你了{:10_266:}{:10_254:}

歌者文明清理员 发表于 2023-6-30 23:39:50

本帖最后由 歌者文明清理员 于 2023-6-30 23:41 编辑

版本1:
这两个代码片段的结果不一样,是因为在第一个代码片段中,无论循环迭代多少次,都会返回相同的值1。而在第二个代码片段中,使用的是 yield i,即每次迭代都返回当前的变量 i 的值。所以第二个代码片段会按照从 0 到 5 的顺序打印出数字。

让我们详细分析一下这两个代码片段的运行过程。

首先看第一个代码片段:

python
def counter():
    i=0
    while i<=5:
      yield 1
      i+=1

for i in counter():
    print(i)
这里定义了一个生成器函数 counter(),函数内部使用一个 while 循环,保证在 i 的值小于等于 5 时继续执行。

在每次循环迭代中,使用 yield 1 返回值 1,然后 i 增加 1。因为在每次循环中都返回相同的值 1,所以最终结果打印出来的都是 1。这里的 yield 关键字使得函数变成了生成器函数,可以通过迭代器的方式依次访问生成器函数的返回值。

接下来看第二个代码片段:

python
def counter():
    i = 0
    while i <= 5:
      yield i
      i += 1

for i in counter():
    print(i)
这个代码片段与第一个的区别在于,在每次循环迭代中使用 yield i 返回变量 i 的值,而不是返回固定的数字 1。这样就实现了每次迭代都返回当前的 i 值。

循环开始时,i 的初始值为 0。在第一次迭代时,yield i 返回的是 0,并且 i 增加 1 变为 1。接下来的循环迭代中,分别返回 1、2、3、4、5。当 i 变为 6 时,不满足循环条件 i <= 5,循环结束。

所以第二个代码片段会打印出 0、1、2、3、4、5,分别对应每次迭代的 i 的值。

综上所述,这两个代码片段的结果不一样是因为其中一个返回固定的值,而另一个返回递增的变量值。

回答版本2:

第一个代码片段是这样的:

python
def counter():
    i = 0
    while i <= 5:
      yield 1
      i += 1

for i in counter():
    print(i)
在这个代码片段中,函数 counter() 定义了一个生成器。生成器使用 yield 语句返回值,并保留函数的状态以便下次调用时可以恢复执行。

在每次循环迭代中,生成器使用 yield 1 返回值 1,并且将变量 i 的值增加 1。因此,无论循环迭代多少次,每次打印出来的值都是 1。所以结果会连续打印出六个 1。

第二个代码片段是这样的:

python
def counter():
    i = 0
    while i <= 5:
      yield i
      i += 1

for i in counter():
    print(i)
在这个代码片段中,生成器函数 counter() 中的 yield i 语句会在每次循环迭代中返回变量 i 的值,并且将 i 的值增加 1。

循环从 i=0 开始,第一次迭代时会返回 0,然后 i 增加 1 变为 1。接下来的迭代中,生成器会依次返回 1、2、3、4 和 5,每次迭代后都会将 i 的值增加 1。

当 i=6 时,不满足循环条件 i <= 5,循环结束。因此,打印出的结果是从 0 到 5 的连续数字。

综上所述,这两个代码片段之间的区别在于返回值的不同。第一个代码片段返回固定值 1,而第二个代码片段则返回递增的变量值。这就解释了为什么它们的结果不一样。

sfqxx 发表于 2023-6-30 23:40:46

歌者文明清理员 发表于 2023-6-30 23:38
求你了

没事,他不会今天设置最佳答案的吧

歌者文明清理员 发表于 2023-6-30 23:41:44

sfqxx 发表于 2023-6-30 23:40
没事,他不会今天设置最佳答案的吧

555小甲鱼不在线不然他会看到我的一个最佳举报

pionrrt 发表于 2023-6-30 23:42:39

sfqxx 发表于 2023-6-30 23:37
好的,我会更详细地解释这两段代码的执行过程。

首先,让我们分别看一下每段代码中的`counter`函数:


可是这俩不是一样么

pionrrt 发表于 2023-6-30 23:43:36

pionrrt 发表于 2023-6-30 23:42
可是这俩不是一样么

我知道了{:10_266:}

sfqxx 发表于 2023-6-30 23:44:49

第一类:
可以看到,输出结果一直是数字1,并且一共打印了6次。这是因为在`yield 1`语句中,我们始终返回的是固定的数字1,并没有改变它。

第二类:
可以看到,输出结果依次是从0到5的数字。这是因为在`yield i`语句中,我们返回的是当前的`i`值,并且在每次循环迭代时,`i`会增加1。所以在每次迭代中,我们都打印出了`i`的不同值,从0递增到5。
页: [1]
查看完整版本: 关于生成器的问题