2014-12-05 3 views
2

가 여기에 내가 무엇을하고 있었는지입니다 (예 : * 운영자 인수가 문자열에 적용) 삼항 연산자 인수에 적용 가지고 :사용은

#a:1 b: 2 args: N o a r g s 

* 운영자가 'No args'을 풀고있다 끈. 그래서 여기 내가 뭘 했어야 내용은 다음과 같습니다

#Produces expected result: 
def func(a,b=1,*args): 
    print('a:',a,'b:',b,'args:',*args if args else ['No args']) 

는 그래서 * 운영자는 전체 삼항 문에 적용됩니다. 그러나 이것은 - 연산자로 발생하지 않는 것 다음 * 운영자가하는 반면

def func(a,b=1,*args): 
    print('a:',a,'b:',b,'negative args[0]:', -args[0] if args else 1000000) 
func(1,2) 
#expected result: 
#a:1 b: 2 negative args[0]: -1000000 
#actual result: 
#a:1 b: 2 negative args[0]: 1000000 

부정적인 - 운영자는 전체 삼항 문에 적용되지 않습니다. 왜? * 연산자의 특별한 점은 무엇입니까?

답변

2

당신은 이미 your own answer에서 코드를 작성하는 올바른 방법을 발견 : 나는 조금 더 실험을해야

def func(a,b=1,*args): 
    print('a:',a,'b:',b,'args:',*args if args else ['No args']) 

을하지만 그 '아무튼 "* 연산자에 대한 특별한 점"에 대한 질문에 대답하십시오.

우선주의해야 할 점은 *은 실제로 연산자가 아니며, function call syntax의 일부입니다. 그러나 느슨한 대화 (실제 문서를 포함하여)에서는 종종 "스 플랫 연산자"라고 불리우므로이 답변이 많지 않습니다. (연산자 표현이 아닌 conditional expressions에 대해서도 마찬가지이지만, 여전히 "삼항 연산자"또는 "if-else 연산자"라고도합니다.)

하지만 더 중요한 것은, 원하는 경우 *… if … else … (대충)을 연산자로 사용하는 경우 연산자 우선 순위를 고려해야합니다. 삼항 연산자는 단항 연산자보다 더 단단히 바인딩하는 반면 부정 연산자보다 더 단단히 묶지는 않습니다.

따라서 2/3 * 52 - 3 * 5을 쓸 때 "/ 연산자에 특별한 점"을 묻는 것과 같습니다. -은 전체 3 * 5에 적용되지만 은 운영자 우선 순위로 인해 3에만 적용됩니다.

+0

답변을 매우 친절하고 설명해 주셔서 감사합니다. 기본적으로 (정확하게!) : "그냥 해내겠습니다." ;) –

+0

@RickTeachey : 음, 어느 정도까지 모든 언어의 연산자 우선 순위 규칙은 임의적입니다. 그러나 실제로 언어 디자이너는 일을 더 가독성있게 만드는 우선 순위 규칙을 제시하려고합니다. (파이썬의 디자이너는 선행 규칙을 단순하고 미니멀리스트로 만들기위한 추가적인 제약을 추가하기 때문에 분명하지 않을 때 적어도 기억하기 쉽습니다.) – abarnert

+0

그 점이 좋습니다. –

3

편집 : 질문을 변경했지만 아래의 유용한 설명 때문에이 대답을 남겨 두겠습니다. 수정 된 질문에 대한 대답은 다음과 같이 요약 할 수 있습니다.

"연산자 우선 순위, 더미."


아하! 예상대로

def func(a,b=1,*args): 
    print('a:',a,'b:',b,'args:',*args if args else ['No args']) 
func(1,2) 

결과 :

#a: 1 b: 2 args: No args 
+4

나는이 방법보다 깨끗한 방법이있을 것이라고 생각하지 않습니다. 별은 [전체 인수에 적용됩니다] (https://docs.python.org/3/reference/expressions.html#grammar-token-argument_list),'(* args) if args ... '. – Kevin