鱼C论坛

 找回密码
 立即注册
查看: 3256|回复: 20

求问 这道题何解???

[复制链接]
发表于 2020-2-9 20:47:42 | 显示全部楼层 |阅读模式

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

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

x
  1. def demo():
  2.     for i in range(4):
  3.         yield i
  4. g=demo()
  5. g1=(i for i in g)
  6. g2=(i for i in g1)

  7. print(list(g1))
  8. print(list(g2))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-9 20:49:15 | 显示全部楼层
g1为 生成器,用list能把g1循环打印出来,但是g2是什么意思呢。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 20:53:39 | 显示全部楼层
换汤不换药啊- -
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 21:18:35 | 显示全部楼层
def demo():
    for i in range(4):
        yield i
g=demo()
g1=(i for i in g)
g2=(i for i in g1)

print(list(g1))
print(list(g2))

第一个是[0,1,2,3]
第二个为空[]
具体情况我也没不知道啥情况

貌似执行完 g2=(i for i in g1)
无论是对g1还是g2 进行for in遍历后
g1 和 g2都是空
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 21:19:09 | 显示全部楼层

第一个是[0,1,2,3]
第二个为空[]
具体情况我也没不知道啥情况

貌似执行完 g2=(i for i in g1)
无论是对g1还是g2 进行for in遍历后
g1 和 g2都是空

大神解释一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 21:21:33 | 显示全部楼层
g2 因为是遍历 g1。而 g1 遍历一遍已经为空了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 21:22:03 | 显示全部楼层
TJBEST 发表于 2020-2-9 21:19
第一个是[0,1,2,3]
第二个为空[]
具体情况我也没不知道啥情况

生成器只能遍历一遍。

  1. >>> a = (i for i in range(5))
  2. >>> list(a)
  3. [0, 1, 2, 3, 4]
  4. >>> list(a)
  5. []
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2020-2-9 21:28:51 | 显示全部楼层
zltzlt 发表于 2020-2-9 21:22
生成器只能遍历一遍。

谢谢了  这个题的意思告诉我们 (i的表达式 for i in 可迭代对象)形式生成器最好加list 因为list的迭代器
用过自动回到原点而不会变空?
他的题改成下面是不是没有这个问题?
  1. def demo():
  2.     for i in range(4):
  3.         yield i
  4. def g1():
  5.     for i in demo():
  6.         yield i
  7. def g2():
  8.      for i in g1():
  9.         yield i
  10. print(list(g1()))
  11. print(list(g2()))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 21:29:55 | 显示全部楼层
TJBEST 发表于 2020-2-9 21:28
谢谢了  这个题的意思告诉我们 (i的表达式 for i in 可迭代对象)形式生成器最好加list 因为list的迭代 ...

应该可以,就看他能不能理解

  1. >>> def a():
  2.         for i in [1, 2, 3, 4, 5]:
  3.                 yield i

  4.                
  5. >>> list(a())
  6. [1, 2, 3, 4, 5]
  7. >>> list(a())
  8. [1, 2, 3, 4, 5]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 21:32:37 | 显示全部楼层
zltzlt 发表于 2020-2-9 21:21
g2 因为是遍历 g1。而 g1 遍历一遍已经为空了。


不对,如果生成g2后g1时空 为什么 执行list(g1)打出 [0,1,2,3]我觉得 这个问题没这么简单 可能是生成器有迭代之类的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 21:33:56 | 显示全部楼层
TJBEST 发表于 2020-2-9 21:32
不对,如果生成g2后g1时空 为什么 执行list(g1)打出 [0,1,2,3]我觉得 这个问题没这么简单 可能是生成器 ...
  1. def demo():
  2.     for i in range(4):
  3.         yield i


  4. g = demo()
  5. g1 = (i for i in g)
  6. g2 = (i for i in g1)

  7. print(list(g1))
  8. print(list(g2))
  9. print(list(g1))
复制代码


这段代码我这里的输出结果:

  1. [0, 1, 2, 3]
  2. []
  3. []
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 21:37:01 | 显示全部楼层
zltzlt 发表于 2020-2-9 21:33
这段代码我这里的输出结果:

没错,g2 = (i for i in g1) 执行完 list(g1)结果【0,1,2,3】 显然g2 = (i for i in g1)之后g1没空
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 21:38:49 | 显示全部楼层
TJBEST 发表于 2020-2-9 21:37
没错,g2 = (i for i in g1) 执行完 list(g1)结果【0,1,2,3】 显然g2 = (i for i in g1)之后g1没空

print(list(g1)) 后 g1 才真正被遍历,g2 同理
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 21:42:53 | 显示全部楼层
zltzlt 发表于 2020-2-9 21:38
print(list(g1)) 后 g1 才真正被遍历,g2 同理

哦 生成器 只有 for in 或者 list(迭代器) 也就是调用生成器的next函数 才算调用吧

g = demo()
g1 = (i for i in g)
g2 = (i for i in g1)
这三个 都相当于 准备状态
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 21:43:23 | 显示全部楼层
TJBEST 发表于 2020-2-9 21:42
哦 生成器 只有 for in 或者 list(迭代器) 也就是调用生成器的next函数 才算调用吧

g = demo()

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 21:43:56 | 显示全部楼层
TJBEST 发表于 2020-2-9 21:19
第一个是[0,1,2,3]
第二个为空[]
具体情况我也没不知道啥情况

迭代器到通过for迭代到头,没东西可迭代了,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-9 22:17:23 | 显示全部楼层
本帖最后由 奔跑的少年丶 于 2020-2-9 23:18 编辑

.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-9 23:41:19 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2020-2-9 23:43 编辑
TJBEST 发表于 2020-2-9 21:18
def demo():
    for i in range(4):
        yield i


嗯,我印象里好像没有“元组推导式”这种东西,并且小甲鱼曾经在视频中否定过“元组推导式”的存在
要看清符号啊。(圆)括号是元组,[方]括号才是列表
话说你们是怎么执行出有东西的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 23:47:43 | 显示全部楼层
TJBEST 发表于 2020-2-9 21:32
不对,如果生成g2后g1时空 为什么 执行list(g1)打出 [0,1,2,3]我觉得 这个问题没这么简单 可能是生成器 ...

第049讲:乱入:生成器 | 课后测试题及答案
https://fishc.com.cn/thread-60398-1-1.html
(出处: 鱼C论坛)
小甲鱼这里的答案有说生成器一定迭代。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 23:52:48 | 显示全部楼层
TJBEST 发表于 2020-2-9 21:28
谢谢了  这个题的意思告诉我们 (i的表达式 for i in 可迭代对象)形式生成器最好加list 因为list的迭代 ...

这种生成器的称呼,我建议称作 “有限生成器”
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-22 08:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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