编写一个自定义求和函数来计算数字列表的和

6 投票
11 回答
55338 浏览
提问于 2025-04-18 04:15

我刚开始学Python,需要一些帮助来写一个函数,这个函数可以接收一个列表作为参数。

我希望用户能够输入一个数字列表(比如说,[1,2,3,4,5]),然后我的程序能把这个列表里的数字加起来。不过,我想用一个循环来加,而不是直接用内置的sum函数。

我遇到的问题是,我不知道怎么告诉解释器用户输入的是一个列表。当我用下面的代码时:

  def sum(list):

它不工作,因为解释器只想要一个元素来进行加法,但我想输入的是一个列表,而不是单个元素。我试过用list.append(..),但没能按照我想要的方式实现。

谢谢你的帮助!

补充:我想要的效果大概是这样的(谢谢“irrenhaus”):

def listsum(list):
    ret=0
    for i in list:
        ret += i
    return ret

# The test case:
print listsum([2,3,4])  # Should output 9.

11 个回答

0

这个方法虽然有点慢,但效果非常好。

# option 1
    def sumP(x):
        total = 0
        for i in range(0,len(x)):
            total = total + x[i]
        return(total)    

# option 2
def listsum(numList):
   if len(numList) == 1:
        return numList[0]
   else:
        return numList[0] + listsum(numList[1:])

sumP([2,3,4]),listsum([2,3,4])
0

你甚至可以写一个函数,来计算一个列表里面嵌套列表的元素总和。比如,它可以计算 [1, 2, [1, 2, [1, 2]]] 这个列表的总和。

    def my_sum(args):
    sum = 0
    for arg in args:
        if isinstance(arg, (list, tuple)):
            sum += my_sum(arg)
        elif isinstance(arg, int):
            sum += arg
        else:
            raise TypeError("unsupported object of type: {}".format(type(arg)))
    return sum

当你调用 my_sum([1, 2, [1, 2, [1, 2]]]) 时,输出结果会是 9

如果你用标准的内置函数 sum 来做这个事情,它会报一个 TypeError 错误。

1

这个方法适用于Python 3.x,和亚当·斯密的解决方案很相似。

list_user = str(input("Please add the list you want to sum of format [1,2,3,4,5]:\t"))
total = 0
list_user = list_user.split() #Get each element of the input
for value in list_user:
    try:
        value = int(value) #Check if it is number
    except:
        continue
    total += value

print(total)
1

在Python中,for循环非常简单易用。对于你的应用,可以这样写:

def listsum(list):
    ret=0
    for i in list:
        ret+=i
    return ret

# the test case:
print listsum([2,3,4])
# will then output 9

编辑: 嗯,我反应慢了。其他的回答可能更有帮助。;)

4

我不太清楚你是怎么构建你的“用户输入列表”的。你是用循环吗?还是纯粹的输入?或者是从JSON或pickle中读取的?这就是一个大问题。

假设你想让他们输入用逗号分隔的值,只是为了有个答案。

# ASSUMING PYTHON3

user_input = input("Enter a list of numbers, comma-separated\n>> ")
user_input_as_list = user_input.split(",")
user_input_as_numbers_in_list = map(float, user_input_as_list) # maybe int?
# This will fail if the user entered any input that ISN'T a number

def sum(lst):
    accumulator = 0
    for element in lst:
        accumulator += element
    return accumulator

前面三行代码看起来有点乱。你可以把它们合并成一行:

user_input = map(float, input("Enter a list of numbers, comma-separated\n>> ").split(','))

不过这样看起来也不太好。那我们试试:

raw_in = input("Enter a list of numbers, comma-separated\n>> ").split(',')
try:
    processed_in = map(float, raw_in)
    # if you specifically need this as a list, you'll have to do `list(map(...))`
    # but map objects are iterable so...
except ValueError:
    # not all values were numbers, so handle it

撰写回答