2014-10-30 4 views
6

PHP가 or die()을 사용하는 것과 비슷한 or을 파이썬으로 사용합니까?PHP가`die()`를 사용하는 것과 비슷하게`or`를 사용하는 것은 파이썬 적이겠습니까?

요즘 대신
if verbose: print(stuff)
quiet or print(stuff)

을 사용하고있다.

나는 더 멋지게 보인다, 그들은 똑같은 일을하고, 줄에 저장합니다. 성능면에서 다른 것보다 낫지 않습니까?

모두가 나에게 거의 동일한 보이지만, 난 정말 내가 찾고 있어요 모르는에 대한 바이트 코드 ...

or


    2   0 LOAD_FAST    0 (quiet) 
       3 JUMP_IF_TRUE_OR_POP  15 
       6 LOAD_GLOBAL    0 (print) 
       9 LOAD_CONST    1 ('foo') 
      12 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
     >> 15 POP_TOP 
      16 LOAD_CONST    0 (None) 
      19 RETURN_VALUE 

if


    2   0 LOAD_FAST    0 (verbose) 
       3 POP_JUMP_IF_FALSE  19 

    3   6 LOAD_GLOBAL    0 (print) 
       9 LOAD_CONST    1 ('bar') 
      12 CALL_FUNCTION   1 (1 positional, 0 keyword pair) 
      15 POP_TOP 
      16 JUMP_FORWARD    0 (to 19) 
     >> 19 LOAD_CONST    0 (None) 
      22 RETURN_VALUE 
+4

제발하지 마세요. – PaulMcG

+0

좋은 생각 같아요 :) –

+0

PHP 프로그래머가 아닌 사람에게는 더 좋지 않습니다. 선을 저장하는 한, 당신이 사는 곳에 선이 부족합니까? 우리는 여분이 있어요. –

답변

18

아니,이 확실히 파이썬 아닙니다 사용하는 것입니다. 길을 따라 내려진 결정의 많은 부분이 이런 종류의 코딩을 특별히 막아 버렸습니다. 자체 stuff을 계산하는 것은 돌이킬 수없는// 비용 위험하지 않은 경우

if verbose: 
    print(stuff) 

또는 단지를 확인하는 기능에 print 포장 :


이를 작성하는 올바른 방법은 확실한 방법입니다 플래그 :

def printv(*args, **kwargs): 
    if verbose: 
     print(*args, **kwargs) 

... 당신이받을거야으로 그래서 당신은 단지에 대한 간결 인이를 수행 할 수 있습니다

,536,913,632 10
printv(stuff) 

휠을 다시 제작하는 대신 logging 모듈을 사용하는 것이 더 좋습니다.


그러나 stuff 경우는 비용이, 그리고 당신이 정말로 라인을 저장하려면?

글쎄, 아마 라인을 저장할 필요가 없을 것입니다. 그렇게하면 간결성을 위해 항상 가독성을 희생합니다. "가독성 계산"은 the Zen of Python의 핵심 부분입니다.그러나 파이썬은이 조건으로 같은 줄에 한 줄 한 벌을 넣을 수 있도록 않습니다 PEP 8으로

if verbose: print(stuff) 

그것을두고, "가끔은 괜찮아"하지만 "일반적으로 실망"입니다. 귀도 (Guido)가 아이디어 메일 링리스트의 이메일에 "선을 저장해야한다면, '영리한'것이 라기보다는 한줄의 if 문을 사용하십시오.하지만 선을 저장해야한다면, 코드를 읽으십시오. "

식에서이 원하는 경우 (이 당신은 내가 아래에 설명 할 것 같은 안) 또는 노골적으로 정신을 위반하는 동안은 문자로 기술적으로 다음과의 PEP 8 원하는 :

print(stuff) if verbose else None 

그래서, 그것에 대해 파이썬 게 아니에요?

print에 유용한 결과가없고 부작용이있을 때만 표현식에 print의 결과를 사용하고 있습니다. 이것은 오도 된 것입니다.

그리고 일반적으로

는, 파이썬은 줄에 하나의 부작용을 가지고 있으며, 그것은 쉽게 코드를 훑어 변경 무엇을 볼 수있는 왼쪽 가능한에게까지 발생합니다. 이는 문장과 표현 사이의 강한 구분 (예를 들어, 문장이되는 과제)과 대신에 관용적으로 None을 반환하는 부작용을 갖는 방법 등에 의해 강화됩니다.

그러나 결과를보기보다는 단락을 위해 andor을 사용하는 것은 모두 혼란스럽고 적어도 사람들의 생각에는 추악합니다. 그래서 세 번째 표현식 (spam if eggs else beans)이 추가되었습니다. 사람들을 쓰지 못하게하려면 eggs and spam or beans입니다. 왜 혼란 스럽습니까? 당신이 실제 영어보다 더 많은 펄 코드를 읽지 않는 한, 영어와 같이 읽을 수는 없습니다. 또 다른 경우에는 실수로 잘못된 값을 사용하는 것이 매우 쉽습니다. 당신은 그것을하지 말아야하고, 그것을 확인하기 위해, 당신이 if을 볼 때, 그러나 당신은 여기 있지 않습니다. 또한 print(stuff) if verbose else None은 사용자가 아무 것도하지 않고 값을 생성한다는 것을 명시 적으로 나타냅니다. 명시 적으로 항상 암시적인 것보다 낫지 만 특히 드문 일을 할 때는 특히 그렇습니다.


마지막으로, 성능 등 : (A) 고려하고 있으며, (b)는 왜 측정하는 대신 당신이 이해하지 않는 바이트 코드를 읽어 추측하려고하지? 그래서 당신이 갈

In [511]: quiet = True 
In [512]: %timeit quiet or None 
10000000 loops, best of 3: 48.2 ns per loop 
In [513]: verbose=False 
In [514]: %timeit if verbose: pass 
10000000 loops, best of 3: 38.5 ns per loop 

은 빠른 패스의 경우, if 문은하지 느린 그들이있어 모두 이제까지 프로그램에 영향을 미칠 가능성이 있다고 너무 빨리 어쨌든 실제로 약 20 % 빠른입니다 . 10 억 배를 빡빡한 루프에서 수행하면서 그 성능을 압박해야한다면 루프의 나머지 부분을 들어 올리려는 것입니다. 코드 (특히, print이없는 루프가 캐시 등에 적합 할 가능성이 더 크다는 것을 고려하면).

왜 그런지 알고 싶다면 특정 구현의 특정 버전에 대한 바이트 코드의 구현을 살펴 봐야 할 것입니다.하지만 대부분의 경우, 대신에 POP_TOP을 수행해야합니다. 이전 작업으로 병합 된 것이 차이의 일부입니다.

+1

'자세한 경우 : print (stuff)'가 파이썬이 아니므로 PEP8을 확인하십시오. – ErlVolton

+0

@ErlVolton : 질문이하는 것보다 훨씬 더 Python 적입니다. – abarnert

+0

아니야! 그것은 그의 예와 마찬가지로 나쁩니다. – ErlVolton

3

나는 이것이 파이썬이라고 생각하지 않습니다. ("암시 적보다 낫다"). 당신이 필사적으로 당신의 라인 카운트 다운, 당신이 할 수있는 유지해야하는 경우

당신

if verbose: print(stuff) 

그렇게 쓸 수 있습니다.

가장 파이썬 방법은 ("가독성 카운트.") 여전히

if verbose: 
    print(stuff) 
+0

"명백한 것이 내재적 인 것보다 낫다"는 것이 확실하지 않습니다. 그러나 확실히 "가독성"에 해당합니다! (나는 선 (zen)의 어느 부분을 참조 할 것인가를 생각하려고 시도하고 있었고, 나는 가장 분명한 부분을 놓쳤다. :) – abarnert

+1

@abarnert : 네, 가독성이 더 큰 역할을합니다. "내재적"이라면 부울 조건이 아직 충족되지 않은 경우에만 표현식을 평가하기위한 Python (가능성이있는 것은 아님) 디자인 선택을 언급했습니다. 사람들은'print()'가이 기능에 대해 모른다면 왜 항상 호출되지 않는지 궁금해 할 것입니다. –