2012-08-30 23 views
6

Tôi cố gắng để hiểu được hoạt động của các built-in sum() chức năng, nhưng, các tham số start đã bốc hơi tâm trí tôi:python sum chức năng - `start` tham số lời giải thích cần thiết

  1. a=[[1, 20], [2, 3]] 
    b=[[[[[[1], 2], 3], 4], 5], 6] 
    >>> sum(b,a) 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
    TypeError: can only concatenate list (not "int") to list 
    >>> sum(a,b) 
    [[[[[[1], 2], 3], 4], 5], 6, 1, 20, 2, 3] 
    
  2. >>> a=[1,2] 
    >>> b=[3,4] 
    >>> sum(a,b) 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
    TypeError: can only concatenate list (not "int") to list 
    >>> sum(b,a) 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
    TypeError: can only concatenate list (not "int") to list 
    

Tôi chỉ bị chết lặng bởi điều này và không biết bất kỳ điều gì đang xảy ra. Đây là những gì các tài liệu python phải nói: http://docs.python.org/library/functions.html#sum. Điều này không đưa ra bất kỳ lời giải thích nào về 'điều gì sẽ xảy ra nếu bắt đầu không phải là một chuỗi và không phải là một số nguyên?'

+0

Tôi sử dụng đối số 'bắt đầu' chỉ cho tổng tích luỹ và do đó, loại chỉ là' int'. Tôi không nghĩ rằng nó dành cho các trường hợp bệnh lý như vậy :) – halex

+0

Như được biểu thị trên các tài liệu: hạn chế 'tổng hợp 'thành các số :-) bạn sẽ có ít đau đầu hơn. Thực hiện một vài cấu trúc tường minh nếu bạn phải nối các danh sách lồng nhau - dù sao thì bạn sẽ có mã duy trì được nhiều hơn. – jsbueno

Trả lời

14

Sum làm điều gì đó như thế này

def sum(values, start = 0): 
    total = start 
    for value in values: 
     total = total + value 
    return total 

sum([1,2],[3,4]) mở rộng cái gì đó như [3,4] + 1 + 2, mà bạn có thể nhìn thấy cố gắng để thêm số điện thoại và danh sách với nhau.

Để sử dụng sum để tạo danh sách, giá trị phải là danh sách các danh sách, trong khi bắt đầu có thể chỉ là một danh sách. Bạn sẽ thấy trong các ví dụ thất bại của bạn rằng danh sách có chứa ít nhất một số int, thay vì sau đó tất cả các danh sách.

Các trường hợp thông thường, nơi bạn có thể nghĩ của việc sử dụng tổng hợp với danh sách là để chuyển đổi một danh sách liệt kê vào danh sách

sum([[1,2],[3,4]], []) == [1,2,3,4] 

Nhưng thực sự bạn không nên làm điều đó, vì nó sẽ chậm.

+0

giống như 'tổng = tổng giá trị +' là lý do tại sao tổng có hiệu suất bậc hai cho các danh sách –

+0

@gnibbler, đó là sự thật. Tôi đã không nghĩ về điều đó. –

4
a=[[1, 20], [2, 3]] 
b=[[[[[[1], 2], 3], 4], 5], 6] 
sum(b, a) 

Lỗi này không liên quan đến tham số bắt đầu. Có hai mục trong danh sách b. Một trong số đó là [[[[[1], 2], 3], 4], 5], số còn lại là 6 và không thể thêm danh sách và int.

sum(a, b) 

này được bổ sung thêm:

[[[[[[1], 2], 3], 4], 5], 6] + [1, 20] + [2, 3] 

nào hoạt động tốt (như bạn chỉ cần bổ sung thêm danh sách vào danh sách).

a=[1,2] 
b=[3,4] 
sum(a,b) 

Điều này đang cố gắng thêm [3,4] + 1 + 2, điều này không thể thực hiện được nữa. Tương tự, sum(b,a) đang thêm [1, 2] + 3 + 4.

Điều gì sẽ xảy ra nếu khởi đầu không phải là chuỗi và không phải là số nguyên?

sum không thể tổng hợp chuỗi. Xem:

>>> sum(["a", "b"], "c") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: sum() can't sum strings [use ''.join(seq) instead] 
1

Một trong những điều mà đã được ám chỉ nhưng không được nêu rõ ràng trong câu trả lời khác là giá trị start xác định type cho giá trị trả về và cho các mục được tóm tắt. Bởi vì mặc định là start=0, (và 0 là một số nguyên, tất nhiên) tất cả các mục trong iterable phải là số nguyên (hoặc các loại với một phương pháp __add__ làm việc với số nguyên).Những ví dụ khác đã đề cập đến danh sách concatenating:

(sum([[1,2],[3,4]], []) == [1,2,3,4])

hoặc timedate.timedelta đối tượng:

(sum([timedelta(1), timedelta(2)], timedelta()) == timedelta(3)).

Lưu ý rằng cả hai ví dụ đều chuyển một đối tượng trống của loại trong tham số có thể lặp lại làm thông số bắt đầu để tránh bị lỗi TypeError: unsupported operand type(s) for +: 'int' and 'list'.

Các vấn đề liên quan