" 好的。作为一名本质上的 C 程序员,除了编写低级程序之外,我情不自禁地以任何方式(使用我选择的任何语言)保持敏锐。今天一个问题是由Pyt-6ren">
gpt4 book ai didi

python - 用 Python 编写手动 pop 函数

转载 作者:行者123 更新时间:2023-12-01 02:11:19 24 4
gpt4 key购买 nike

开始之前:

import sys
sys.ps1 = "<?>> "

好的。作为一名本质上的 C 程序员,除了编写低级程序之外,我情不自禁地以任何方式(使用我选择的任何语言)保持敏锐。今天一个问题是由Python3中一个非常简单的例子引起的。

当在 Stack 类中写入一点 pop() 时,我收到了一些奇怪的输出。

class Stack():

def __init__(self, data):
self.stack = [i for i in data]
self.size = int(len(self.stack))

def pop(self):
ch = self.stack[self.size - 1]
del(self.stack[-1])
self.size = self.size - 1
return ch


msg = Stack("Hello!")
for i in msg.stack:
print(m.pop(), end="")

<?>> !ol

for i in msg.stack:
print(m.pop(), end="")

<?>> le

for i in msg.stack:
print(m.pop(), end="")

<?>> H

print(msg.stack)

<?>> []

如您所见,需要 3 个循环来弹出并输出整个列表 ['H','e','l','l','o']; 3 个字符,然后是 2 个字符,然后是 1 个字符,但是列表会相应地耗尽吗?较长的输入需要更多的循环。这里的抑制因素是什么?

最佳答案

问题本质上是您在修改容器时对其进行迭代。这样想,在内部,list 迭代器只是不断推进索引,直到遇到 IndexError。由于您修改列表,因此在您从中删除 3 个元素后,它会遇到 IndexError ,因为它会尝试 my_list[3]len(my_list) == 3。有几种方法可以解决这个问题。首先,在这种情况下只需使用 while 循环:

In [4]: class Stack:
...:
...: def __init__(self, data):
...: self.stack = [i for i in data]
...: self.size = int(len(self.stack))
...:
...: def pop(self):
...: ch = self.stack[self.size - 1]
...: del(self.stack[-1])
...: self.size = self.size - 1
...: return ch
...: def __len__(self):
...: return self.size
...:

In [5]: stack = Stack("Hello!")

In [6]: while stack:
...: print(stack.pop(), end='')
...:
!olleH

注意,我定义了一个 __len__ 方法,以便 while stack: 直接工作,而不是 while stack.size:

正如您所想,您还可以简单地循环范围对象:

In [7]: stack = Stack("Hello!")

In [8]: for _ in range(len(stack)):
...: print(stack.pop(), end='')
...:
!olleH

更棘手:反向方向循环!由于从末尾弹出,因此不会收到 IndexError,因为 list_reverseiteratoralist[len(alist) - 1] 开始索引> 直到到达alist[0]。我可能不太愿意依赖这种行为,但它已被记录下来,并且确实有效:

In [9]: stack = Stack("Hello!")

In [10]: for _ in reversed(stack.stack):
...: print(stack.pop(), end='')
...:
!olleH
In [11]:

最后,经过尝试的正确方法:循环复制:

In [11]: stack = Stack("Hello!")

In [12]: for _ in stack.stack[:]: #whole slice copies
...: print(stack.pop(), end='')
...:
!olleH

关于python - 用 Python 编写手动 pop 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48675571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com