davidmou 发表于 2023-8-12 22:19:53

special problem

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

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

为什么打印结果是ChsiFChsiF

isdkz 发表于 2023-8-12 22:20:26

这段代码的输出结果是"ChsiFChsiF"的原因是因为在函数 myRev 中使用了生成器(generator)来逆序遍历字符串 attribute 。在每次循环中,生成器会从字符串的末尾开始逐个返回字符,直到遍历完整个字符串。

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

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

因此,输出结果为"ChsiFChsiF"。

陶远航 发表于 2023-8-12 22:20:49

这是因为在生成器函数 myRev 中,每次循环都会向调用者(即 for 循环)生成一个值,然后暂停执行,下次继续从暂停的地方恢复执行。在每次执行时,都会返回 attribute 的值,并将 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'。

希望能够解答您的问题!如果还有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案

davidmou 发表于 2023-8-12 23:28:36

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

为什么生成器函数结束了,还会有第二次迭代。

ba21 发表于 2023-8-12 23:30:13

你想达到什么效果?
问题要描述清楚。

davidmou 发表于 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 -= 1
      except:
            return

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

为什么打印结果是ChsiFChsiF,而不是ChsiF

davidmou 发表于 2023-8-12 23:42:51

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

为什么结果不是ChsiF

isdkz 发表于 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 -= 1

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

ba21 发表于 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 -= 1


for i in myRev("FishC"):
    print(i, end='')
页: [1]
查看完整版本: special problem