鱼C论坛

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

special problem

[复制链接]
发表于 2023-8-12 22:19:53 | 显示全部楼层 |阅读模式

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

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

x
def myRev(attribute):
    a = len(attribute) - 1
    while 1:
        try:
            yield attribute[a]
            a -= 1
        except:
            return

for i in myRev("FishC"):
    print(i, end='')

为什么打印结果是ChsiFChsiF
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-12 22:20:26 | 显示全部楼层
这段代码的输出结果是"ChsiFChsiF"的原因是因为在函数 myRev 中使用了生成器(generator)来逆序遍历字符串 attribute 。在每次循环中,生成器会从字符串的末尾开始逐个返回字符,直到遍历完整个字符串。

在主程序中,使用 for 循环来遍历生成器对象 myRev("FishC") ,每次迭代都会调用生成器的 yield 语句来返回一个字符。由于生成器是无限循环的,所以会不断地返回字符,直到遍历完整个字符串。

由于 print 函数的 end 参数被设置为 '' ,表示不在每个字符之间添加换行符,所以最终的输出结果是将所有字符连接在一起。

因此,输出结果为"ChsiFChsiF"。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-12 22:20:49 | 显示全部楼层
这是因为在生成器函数 myRev 中,每次循环都会向调用者(即 for 循环)生成一个值,然后暂停执行,下次继续从暂停的地方恢复执行。在每次执行时,都会返回 attribute[a] 的值,并将 a 减1。

然而,在 for 循环中,每次迭代时,生成器函数 myRev 都会重新启动并从头开始执行。这意味着每次迭代都会生成新的值,而不是接着上一次的位置继续生成。

因此,当您使用 for i in myRev("FishC") 进行迭代时,会依次生成 'C''h''s''i',然后在生成 'F' 时,由于 a 的值为 -1,会触发 except 子句中的 return 语句,结束了生成器函数的执行。

由于生成器函数已经结束,所以在第二个迭代时,生成器函数将会重新启动,并从头开始执行。这就解释了为什么打印结果是 'ChsiFChsiF'

如果您想要逆序打印字符串 'FishC',您可以使用其他方式实现,例如:
attribute = "FishC"
reversed_str = attribute[::-1]
print(reversed_str)

这将直接逆序输出字符串,结果为 'ChsiF'

希望能够解答您的问题!如果还有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-12 23:28:36 | 显示全部楼层
陶远航 发表于 2023-8-12 22:20
这是因为在生成器函数 myRev 中,每次循环都会向调用者(即 for 循环)生成一个值,然后暂停执行,下次继续 ...

为什么生成器函数结束了,还会有第二次迭代。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-12 23:30:13 | 显示全部楼层
你想达到什么效果?
问题要描述清楚。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-12 23:38:56 | 显示全部楼层
ba21 发表于 2023-8-12 23:30
你想达到什么效果?
问题要描述清楚。


def myRev(attribute):
    a = len(attribute) - 1
    while 1:
        try:
            yield attribute[a]
            a -= 1
        except:
            return

for i in myRev("FishC"):
    print(i, end='')

为什么打印结果是ChsiFChsiF,而不是ChsiF
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-12 23:42:51 | 显示全部楼层
isdkz 发表于 2023-8-12 22:20
这段代码的输出结果是"ChsiFChsiF"的原因是因为在函数 myRev 中使用了生成器(generator)来逆序遍历字符串 ...

为什么结果不是ChsiF
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-12 23:49:13 | 显示全部楼层
davidmou 发表于 2023-8-12 23:38
def myRev(attribute):
    a = len(attribute) - 1
    while 1:

因为python中列表支持负数作为索引,所以你一直到有异常才结束迭代就是正索引和负索引都输出了一遍,如果你不想输出两遍,那就给 a 限定不能小于0
def myRev(attribute):
    a = len(attribute) - 1
    while a >= 0:
        yield attribute[a]
        a -= 1

for i in myRev("FishC"):
    print(i, end='')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-12 23:52:36 | 显示全部楼层
davidmou 发表于 2023-8-12 23:38
def myRev(attribute):
    a = len(attribute) - 1
    while 1:

循环的时候判断长度。
def myRev(attribute):
    a = len(attribute) - 1
    while a+1:
        yield attribute[a]
        a -= 1


for i in myRev("FishC"):
    print(i, end='')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 22:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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