Programming

반품, 반품 없음, 전혀 반품 없음?

procodes 2020. 3. 4. 07:50
반응형

반품, 반품 없음, 전혀 반품 없음?


세 가지 기능을 고려하십시오.

def my_func1():
  print "Hello World"
  return None

def my_func2():
  print "Hello World"
  return

def my_func3():
  print "Hello World"

그들은 모두 None을 반환하는 것으로 보입니다. 이 함수의 반환 값이 동작하는 방식에 차이가 있습니까? 하나를 선호하는 이유가 있습니까?


실제 행동에는 차이가 없습니다. 그들은 모두 돌아 왔고 None그게 다야. 그러나이 모든 것들을위한 시간과 장소가 있습니다. 다음 지침은 기본적으로 다른 방법을 사용해야하는 방법 (또는 적어도 내가 가르쳐야하는 방법)이지만 절대적인 규칙은 아니므로 필요한 경우 혼합 할 수 있습니다.

사용 return None

이것은 함수가 실제로 나중에 사용하기 위해 값을 리턴한다는 의미이며,이 경우에는를 리턴합니다 None. None그런 다음 이 값 을 다른 곳에서 사용할 수 있습니다. return None함수에서 다른 가능한 반환 값이 없으면 사용되지 않습니다.

다음 예제에서, 우리는 반환이 personmother경우 생성 person주어진 인간이다. 그것이 인간이 아니라면, 우리 는 동물 이 없기 None때문에 돌아온다 .personmother

def get_mother(person):
    if is_human(person):
        return person.mother
    else:
        return None

사용 return

이것은 break루프에서 와 같은 이유로 사용됩니다 . 반환 값은 중요하지 않으며 전체 기능을 종료하려고합니다. 일부 장소에서는 매우 유용하며, 필요하지 않은 경우도 있습니다.

우리는 15를 얻었고 prisoners그들 중 하나가 칼을 가지고 있음을 알고 있습니다. prisoner칼이 있는지 확인하기 위해 하나씩 하나씩 반복합니다 . 우리가 칼로 사람을 때리면, 우리는 단지 하나의 칼이 있다는 것을 알 수있는 기능을 종료 할 수 있습니다 prisoners. 칼로을 찾지 못하면 prisoner경고를 발생시킵니다. 이것은 여러 가지 방법으로 수행 될 수 있으며 사용하는 return것이 가장 좋은 방법은 아니지만 return기능 종료 에 사용하는 방법을 보여주는 예제 일뿐 입니다.

def find_prisoner_with_knife(prisoners):
    for prisoner in prisoners:
        if "knife" in prisoner.items:
            prisoner.move_to_inquisition()
            return # no need to check rest of the prisoners nor raise an alert
    raise_alert()

참고 : var = find_prisoner_with_knife()반환 값이 잡히지 않기 때문에 절대로하지 말아야합니다 .

더 사용하지 return전혀

이 또한 반환 None하지만 해당 값은 사용되거나 포착되지 않습니다. 그것은 단순히 기능이 성공적으로 종료되었음을 의미합니다. 그것은 기본적으로 동일합니다 return에서 void같은 C ++ 또는 Java와 같은 언어 기능.

다음 예에서는 사람의 어머니 이름을 설정 한 다음 성공적으로 완료된 후 기능이 종료됩니다.

def set_mother(person, mother):
    if is_human(person):
        person.mother = mother

참고 : var = set_mother(my_person, my_mother)반환 값이 잡히지 않기 때문에 절대로하지 말아야합니다 .


예, 모두 동일합니다.

해석 된 기계어 코드를 검토하여 모두 동일한 작업을 수행하고 있음을 확인할 수 있습니다.

import dis

def f1():
  print "Hello World"
  return None

def f2():
  print "Hello World"
  return

def f3():
  print "Hello World"

dis.dis(f1)
    4   0 LOAD_CONST    1 ('Hello World')
        3 PRINT_ITEM
        4 PRINT_NEWLINE

    5   5 LOAD_CONST    0 (None)
        8 RETURN_VALUE

dis.dis(f2)
    9   0 LOAD_CONST    1 ('Hello World')
        3 PRINT_ITEM
        4 PRINT_NEWLINE

    10  5 LOAD_CONST    0 (None)
        8 RETURN_VALUE

dis.dis(f3)
    14  0 LOAD_CONST    1 ('Hello World')
        3 PRINT_ITEM
        4 PRINT_NEWLINE            
        5 LOAD_CONST    0 (None)
        8 RETURN_VALUE      

각각 동일한 싱글 톤을 반환합니다 None. 기능상의 차이는 없습니다.

나는 return함수를 일찍 (이 경우 베어 return가 더 흔하게) 빠져 나가 거나 그렇지 않은 다른 것을 반환 하지 않으면 진술 을 떠나는 것이 관용적이라고 생각합니다 None. 또한 return None다른 것이 아닌 다른 경로를 갖는 함수에있을 때 쓰는 것이 의미가 있고 관용적 인 것처럼 보입니다 None. return None명시 적으로 작성 하는 것은 독자에게 더 흥미로운 무언가를 반환하는 또 다른 분기가 있다는 시각적 신호입니다 (호출 코드는 아마도 두 유형의 반환 값을 모두 처리해야 할 것입니다).

파이썬에서 종종 리턴 None하는 void함수는 C의 함수 와 같이 사용됩니다. 그들의 목적은 일반적으로 입력 인수 에서 제자리를 다루는 것입니다 (글로벌 데이터를 사용하지 않는 한 ( shudders )). None일반적으로 반환 하면 인수가 변경되었다는 것이 더 명확 해집니다. 이것은 왜 return"언어 규약"관점에서 진술 을 철회하는 것이 합리적 일까요?

즉, 이미 미리 설정된 규칙이있는 코드베이스에서 작업하는 경우 코드베이스가 균일하게 유지되도록 돕기 위해 분명히 따라야합니다 ...


기능면에서 이들은 모두 동일하며, 차이점은 코드 가독성과 스타일에 있습니다 (고려해야 함).

참고 URL : https://stackoverflow.com/questions/15300550/return-return-none-and-no-return-at-all



반응형