鱼C论坛

 找回密码
 立即注册
查看: 1136|回复: 8

[已解决]关于生成器的问题

[复制链接]
发表于 2023-6-30 23:33:52 | 显示全部楼层 |阅读模式

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

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

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

  6. for i in counter():
  7.     print(i)
复制代码

  1. def counter():
  2.         i = 0
  3.         while i <= 5:
  4.             yield i
  5.             i+= 1
  6. for i in counter():
  7.      print(i)
复制代码

截图未命名.jpg
最佳答案
2023-6-30 23:37:48
本帖最后由 sfqxx 于 2023-6-30 23:42 编辑

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

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

第一段代码中的 `counter` 函数如下所示:
  1. def counter():
  2.     i = 0
  3.     while i <= 5:
  4.         yield 1
  5.         i += 1
复制代码

在这个函数中,我们使用了一个`while`循环来判断`i`是否小于等于5。然后,在每次循环迭代时使用`yield 1`语句返回数字1。也就是说,无论循环进行多少次,`yield`语句总是会返回数字1。

接下来,我们看一下第二段代码中的 `counter` 函数:
  1. def counter():
  2.     i = 0
  3.     while i <= 5:
  4.         yield i
  5.         i += 1
复制代码

在这个函数中,同样使用了一个`while`循环来判断`i`是否小于等于5。然后,在每次循环迭代时使用`yield i`语句返回变量`i`的当前值。也就是说,每次循环都会返回当前的`i`值,并且在下一次循环时,`i`会增加1。

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

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

  1. for i in counter():
  2.     print(i)
复制代码

输出结果如下:

  1. 1
  2. 1
  3. 1
  4. 1
  5. 1
  6. 1
复制代码

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

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

  1. for i in counter():
  2.     print(i)
复制代码

输出结果如下:
  1. 0
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
复制代码

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

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-30 23:37:48 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sfqxx 于 2023-6-30 23:42 编辑

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

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

第一段代码中的 `counter` 函数如下所示:
  1. def counter():
  2.     i = 0
  3.     while i <= 5:
  4.         yield 1
  5.         i += 1
复制代码

在这个函数中,我们使用了一个`while`循环来判断`i`是否小于等于5。然后,在每次循环迭代时使用`yield 1`语句返回数字1。也就是说,无论循环进行多少次,`yield`语句总是会返回数字1。

接下来,我们看一下第二段代码中的 `counter` 函数:
  1. def counter():
  2.     i = 0
  3.     while i <= 5:
  4.         yield i
  5.         i += 1
复制代码

在这个函数中,同样使用了一个`while`循环来判断`i`是否小于等于5。然后,在每次循环迭代时使用`yield i`语句返回变量`i`的当前值。也就是说,每次循环都会返回当前的`i`值,并且在下一次循环时,`i`会增加1。

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

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

  1. for i in counter():
  2.     print(i)
复制代码

输出结果如下:

  1. 1
  2. 1
  3. 1
  4. 1
  5. 1
  6. 1
复制代码

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

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

  1. for i in counter():
  2.     print(i)
复制代码

输出结果如下:
  1. 0
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
复制代码

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

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

求你了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 23:39:50 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-6-30 23:41 编辑

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

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

首先看第一个代码片段:

python
  1. def counter():
  2.     i=0
  3.     while i<=5:
  4.         yield 1
  5.         i+=1

  6. for i in counter():
  7.     print(i)
复制代码

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

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

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

python
  1. def counter():
  2.     i = 0
  3.     while i <= 5:
  4.         yield i
  5.         i += 1

  6. for i in counter():
  7.     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
  1. def counter():
  2.     i = 0
  3.     while i <= 5:
  4.         yield 1
  5.         i += 1

  6. for i in counter():
  7.     print(i)
复制代码

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

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

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

python
  1. def counter():
  2.     i = 0
  3.     while i <= 5:
  4.         yield i
  5.         i += 1

  6. for i in counter():
  7.     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,而第二个代码片段则返回递增的变量值。这就解释了为什么它们的结果不一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 23:40:46 From FishC Mobile | 显示全部楼层
歌者文明清理员 发表于 2023-6-30 23:38
求你了

没事,他不会今天设置最佳答案的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 23:41:44 | 显示全部楼层
sfqxx 发表于 2023-6-30 23:40
没事,他不会今天设置最佳答案的吧

555小甲鱼不在线不然他会看到我的一个最佳举报
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-30 23:42:39 | 显示全部楼层
sfqxx 发表于 2023-6-30 23:37
好的,我会更详细地解释这两段代码的执行过程。

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

可是这俩不是一样么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-30 23:43:36 | 显示全部楼层
pionrrt 发表于 2023-6-30 23:42
可是这俩不是一样么

我知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 23:44:49 | 显示全部楼层
第一类:
可以看到,输出结果一直是数字1,并且一共打印了6次。这是因为在`yield 1`语句中,我们始终返回的是固定的数字1,并没有改变它

第二类:
可以看到,输出结果依次是从0到5的数字。这是因为在`yield i`语句中,我们返回的是当前的`i`值,并且在每次循环迭代时,`i`会增加1。所以在每次迭代中,我们都打印出了`i`的不同值,从0递增到5。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 10:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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