반품, 반품 없음, 전혀 반품 없음?
세 가지 기능을 고려하십시오.
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
함수에서 다른 가능한 반환 값이 없으면 사용되지 않습니다.
다음 예제에서, 우리는 반환이 person
의 mother
경우 생성 person
주어진 인간이다. 그것이 인간이 아니라면, 우리 는 동물 이 없기 None
때문에 돌아온다 .person
mother
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
'Programming' 카테고리의 다른 글
Android : 프로그래밍 방식으로 .apk 설치 (0) | 2020.03.04 |
---|---|
UI 용어 : 로그온 및 로그인 (0) | 2020.03.04 |
StackPanel의 아이들이 최대 공간을 아래쪽으로 채우도록하는 방법은 무엇입니까? (0) | 2020.03.04 |
sys.stdout.write와 print의 차이점은 무엇입니까? (0) | 2020.03.04 |
IF 문을 사용할 때 쉘 명령을 여러 줄로 나누려면 어떻게해야합니까? (0) | 2020.03.04 |