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 这段代码的输出结果是"ChsiFChsiF"的原因是因为在函数 myRev 中使用了生成器(generator)来逆序遍历字符串 attribute 。在每次循环中,生成器会从字符串的末尾开始逐个返回字符,直到遍历完整个字符串。
在主程序中,使用 for 循环来遍历生成器对象 myRev("FishC") ,每次迭代都会调用生成器的 yield 语句来返回一个字符。由于生成器是无限循环的,所以会不断地返回字符,直到遍历完整个字符串。
由于 print 函数的 end 参数被设置为 '' ,表示不在每个字符之间添加换行符,所以最终的输出结果是将所有字符连接在一起。
因此,输出结果为"ChsiFChsiF"。 这是因为在生成器函数 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'。
希望能够解答您的问题!如果还有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案 陶远航 发表于 2023-8-12 22:20
这是因为在生成器函数 myRev 中,每次循环都会向调用者(即 for 循环)生成一个值,然后暂停执行,下次继续 ...
为什么生成器函数结束了,还会有第二次迭代。 你想达到什么效果?
问题要描述清楚。 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
isdkz 发表于 2023-8-12 22:20
这段代码的输出结果是"ChsiFChsiF"的原因是因为在函数 myRev 中使用了生成器(generator)来逆序遍历字符串 ...
为什么结果不是ChsiF 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='')
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]