2012-06-12 6 views
0

합계가 올바른 0 값을 자동으로 가져올 수없는 이유는 무엇입니까?합계 시작 값이 반복 가능한 값이 0이 아닌 이유는 무엇입니까?

>>> def sum(s, start=None): 
    it = iter(s) 
    n = next(it) 
    if start is None: 
     start = type(n)() 
    return n + __builtins__.sum(it, start) 

>>> sum((['1'], ['2'])) 
['1', '2'] 
>>> 

어쨌든 문자열을 가입하지 않는 합계는, 어쩌면 그것은 단지 다른 'summings'에 대한 적절한 방법을 사용하는 것이 좋습니다 것입니다 :

>>> sum((['1'], ['2'])) 

Traceback (most recent call last): 
    File "<pyshell#13>", line 1, in <module> 
    sum((['1'], ['2'])) 
TypeError: unsupported operand type(s) for +: 'int' and 'list' 
>>> sum((['1'], ['2']), []) 
['1', '2'] 

는 다음과 같이 구현하는 간단하다.

반면에 숫자로만 사용하려는 경우 sum_numbers이 아닌 sum을 명확하게 표시해야합니다.

편집 : 우리는 약간의 코드를 추가해야합니다 빈 순서를 처리 할 수있는 :

>> sum([]) 

Traceback (most recent call last): 
    File "<pyshell#36>", line 1, in <module> 
    sum([]) 
    File "<pyshell#28>", line 3, in sum 
    n = next(it) 
StopIteration 
>>> def sum(s, start=None): 
    it = iter(s) 
    try: 
     n= next(it) 
    except: 
     return 0 

    if start is None: 
     start = type(n)() 
    return n + __builtins__.sum(it, start) 

>>> sum([]) 
0 
>>> 
+0

여기에 질문하는 것이 아닙니다. 당신은 파이썬에서 한 기능에 대한 개선을 제안하고 있습니다. StackOverflow가이를위한 잘못된 장소입니다. 파이썬 메일 링리스트에서이 제안을해야한다. 내 머리 꼭대기에서, 이것은 합리적인 제안처럼 보입니다. 기존 코드가 손상 될 수 있다고 생각하지 않습니다. – steveha

+0

@steveha :이 제안은 실제로 기존 코드를 깨뜨릴 수 있지만 [이 코드는 다소 이상 할 것입니다] (https://gist.github.com/2919731). –

+0

@steveha : (그러나이 반대론은 왜이 제안이 파이썬 아이디어에 쏟아 질지 이유가되지 않을 것입니다.) 인수 유형에서 결과 유형을 추론하는 것은 일반적으로 의문의 여지가 있으며 Guido는 이러한 종류의) –

답변

2

제로 값을 유추은 일반적인 경우에 불가능하다. iterable이 인수가없는 생성자가없는 사용자 정의 클래스의 인스턴스를 생성하면 어떻게 될까요? 그리고 여러분이 보았 듯이, 스스로 제공하는 것은 쉽습니다.

+0

그의 코드에서 혁신은 '시작'을 자동으로 결정하는 것입니다. 그것은 0 값을 추론합니다. –

+0

우리는 ** type ** 값을 사용하고 있으며, 예를 들어 'counter = int()'에 의해 정수를 0으로 설정하지 않아도 0 값을 생성합니다. –

+0

어쩌면 100 %의 경우에는 가능하지 않지만 항상 0을 기본값으로하는 것보다 나에게 적합합니다. 그리고 클래스를 적절하게 구현하는 __add__에 0을 구현하는 것이 좋습니다. 적절한 0 값을 가진 자체 클래스를 구현하면 매번 0 값을 제공하여 불필요한 도움말 기능을 정의하거나 정의하고, 내장 코드를 사용하지 않아도된다. 그리고 ** ** ** ** 내장 코드를 덮어 쓰기 위해 합계를 정의한다면 혼란 스러울 것입니다. 물론 코드를 읽을 수 있도록 다른 이름을 사용해야 할 것입니다. –

관련 문제