Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何将堆栈中的所有数字相乘_Python 3.x_Stack - Fatal编程技术网

Python 3.x 如何将堆栈中的所有数字相乘

Python 3.x 如何将堆栈中的所有数字相乘,python-3.x,stack,Python 3.x,Stack,尝试将堆栈中的所有数字相乘时,我最初考虑将所有元素放入一个列表,然后相乘,但不确定如何/如果这是正确的 这是我当前的代码,但我得到: TypeError:“方法”对象不能解释为整数 我也做了一个测试用例 my_stack = Stack() my_stack.push(12) my_stack.push(2) my_stack.push(4) my_stack.push(40) print(multi_stack(my_stack)) print(my_stack.s

尝试将堆栈中的所有数字相乘时,我最初考虑将所有元素放入一个列表,然后相乘,但不确定如何/如果这是正确的

这是我当前的代码,但我得到:

TypeError:“方法”对象不能解释为整数

我也做了一个测试用例

  my_stack = Stack()
  my_stack.push(12)
  my_stack.push(2)
  my_stack.push(4)
  my_stack.push(40)
  print(multi_stack(my_stack))
  print(my_stack.size())`
这应该打印出来:

3840
0
我正在使用的堆栈类

class Stack(): 

def __init__(self): 
    self.items = [] 

def is_empty(self): 
    return self.items == [] 

def push(self,items):
    return self.items.append(items) 

def pop(self): 
    if self.is_empty() == True:
        raise IndexError("The stack is empty!") 
    else: 
        return self.items.pop() 

def peek(self):
    if self.is_empty() == True: 
        raise IndexError("The stack is empty!") 
    else:
        return self.items[len(self.items) - 1] 
def size(self):
    return len(self.items)

Python列出了支持append()和pop()方法的列表,这些方法允许您复制后进先出堆栈行为。使用append()添加到末尾,使用pop()删除最后一个元素

但是,底层数据结构仍然是一个列表。您可以使用许多方法将列表相乘。例如,假设一个非空列表:

import functools

mylist = [i for i in range(1, 10)]
product = functools.reduce(lambda x, y: x * y, mylist)

编辑:以下是使用堆栈类的示例:

import functools


stack = Stack()
stack.push(1)
stack.push(3)
stack.push(9)

def multi_stack(s):
    """
    s: a Stack() object
    """
    return functools.reduce(lambda x, y: x * y, s.items)

def multi_stack_readable(s):
    """
    s: a Stack() object
    """
    if s.size() > 1:
        product = s.items[0]
        for i in s.items[1:]:
            product *= i

        return product
    elif s.size() == 1:
        return s.items
    else:
        raise IndexError("the stack is empty!")


print(multi_stack(stack))
print(multi_stack_readable(stack))

使用lambda函数有时被认为可读性较差,因此我使用for循环提供了一个可读性更高的版本。两者产生相同的结果。

Python列表支持append()和pop()方法,允许您复制后进先出堆栈行为。使用append()添加到末尾,使用pop()删除最后一个元素

但是,底层数据结构仍然是一个列表。您可以使用许多方法将列表相乘。例如,假设一个非空列表:

import functools

mylist = [i for i in range(1, 10)]
product = functools.reduce(lambda x, y: x * y, mylist)

编辑:以下是使用堆栈类的示例:

import functools


stack = Stack()
stack.push(1)
stack.push(3)
stack.push(9)

def multi_stack(s):
    """
    s: a Stack() object
    """
    return functools.reduce(lambda x, y: x * y, s.items)

def multi_stack_readable(s):
    """
    s: a Stack() object
    """
    if s.size() > 1:
        product = s.items[0]
        for i in s.items[1:]:
            product *= i

        return product
    elif s.size() == 1:
        return s.items
    else:
        raise IndexError("the stack is empty!")


print(multi_stack(stack))
print(multi_stack_readable(stack))

使用lambda函数有时被认为可读性较差,因此我使用for循环提供了一个可读性更高的版本。两者产生相同的结果。

您的代码不起作用,因为
size=my_stack.size
返回一个方法对象,而不是您期望的整数;您忘记在末尾添加括号以实际调用该方法。因此,当您尝试对范围内的数字(大小):执行
操作时,会出现异常,因为您正在将一个方法对象而不是整数传递给
范围()。还有一系列其他错误:您根本没有使用传递给函数的参数,而是影响全局变量
my_stack
(除非这是您的意图);您正在对某个未知变量
L
执行操作;您在函数顶部创建了
堆栈
,但未对其进行任何操作,依此类推。总的来说,对于这样一个简单的目标来说太复杂了。除了更正代码外,还有其他更有效的方法:

def multi_stack(s):
  mult = 1
  size = s.size()
  for i in range(size):
    tmp = s.pop()
    mult = mult * tmp
  return mult

这将返回您期望的产品,尽管它不会清空堆栈。如果你想这样做,那么去掉函数参数,用
s
代替
my\u stack

你的代码不起作用,因为
size=my\u stack.size
返回一个方法对象,而不是你期望的整数;您忘记在末尾添加括号以实际调用该方法。因此,当您尝试对范围内的数字(大小):
执行
操作时,会出现异常,因为您正在将一个方法对象而不是整数传递给
范围()。还有一系列其他错误:您根本没有使用传递给函数的参数,而是影响全局变量
my_stack
(除非这是您的意图);您正在对某个未知变量
L
执行操作;您在函数顶部创建了
堆栈
,但未对其进行任何操作,依此类推。总的来说,对于这样一个简单的目标来说太复杂了。除了更正代码外,还有其他更有效的方法:

def multi_stack(s):
  mult = 1
  size = s.size()
  for i in range(size):
    tmp = s.pop()
    mult = mult * tmp
  return mult

这将返回您期望的产品,尽管它不会清空堆栈。如果您想这样做,那么就去掉函数参数,并用
s
替换
my\u stack
,就像以前一样。

是否将所有元素推到一个列表中?然后从列表中使用循环将所有数字相乘?只要将元素保留在一个列表中,然后使用append()和pop()像stack一样进行添加和删除,如果我从stack=stack()开始。为了使它成为一个列表,我是否只需要使用stack.push?您的底层数据结构也是一个列表。调用stack.items将返回一个列表,您可以通过上述方式使用该列表。我大致了解您的来源,谢谢,我仍然习惯于python,所以还没有学到很多关于导入FuncToolsO的知识,比如将所有元素推到列表中?然后从列表中使用循环将所有数字相乘?只要将元素保留在一个列表中,然后使用append()和pop()像stack一样进行添加和删除,如果我从stack=stack()开始。为了使它成为一个列表,我是否只需要使用stack.push?您的底层数据结构也是一个列表。调用stack.items将返回一个列表,您可以通过上述方式使用该列表。我大致了解您的来源,谢谢,我还在习惯python,所以还没有学到很多关于导入FuncTools的知识。你是干什么的?说真的。不要发垃圾邮件。你为什么这么做?说真的。不要滥发帖子。@Rey You's welcome:)别忘了投票并接受答案。@Rey You's welcome:)别忘了投票并接受答案。