답변:
실제 행동에는 차이가 없습니다. 그들은 모두 돌아 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)
반환 값이 잡히지 않기 때문에 절대로하지 말아야합니다 .
var = get_mother()
당신이 var
받아 들일 수있는 다른 함수로 넘어 가면 괜찮습니다 None
– "never"는 조금 극단적입니다
var = get_mother()
사용할 수없는 경우 반환 값을 어떻게 받아 들여야 합니까? IMHO 그렇게해도 괜찮습니다. 사용하기 전에 None
값이 아닌지 확인해야 if var
합니다.
예, 모두 동일합니다.
해석 된 기계어 코드를 검토하여 모두 동일한 작업을 수행하고 있음을 확인할 수 있습니다.
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
dis.dis
반환 None
: -X
dis.dis
도 효과가 없을 수도 있습니다. 일부 라인 번호도보고합니다.
각각 동일한 싱글 톤을 반환합니다 None
. 기능상의 차이는 없습니다.
나는 return
함수를 일찍 (이 경우 베어 return
가 더 흔하게) 빠져 나가 거나 그렇지 않은 다른 것을 반환 하지 않으면 명령문 을 떠나는 것이 관용적이라고 생각합니다 None
. 또한 return None
다른 것이 아닌 다른 경로를 갖는 함수에있을 때 쓰는 것이 의미가 있고 관용적 인 것처럼 보입니다 None
. return None
명시 적으로 작성 하는 것은 독자에게 더 흥미로운 무언가를 반환하는 또 다른 분기가 있다는 시각적 신호입니다 (호출 코드는 두 유형의 반환 값을 모두 처리해야 할 것입니다).
종종 파이썬에서 반환 None
하는 void
함수는 C의 함수 와 같이 사용됩니다 .-전역 데이터를 사용하지 않는 한 ( shudders ) 않는 한 일반적으로 입력 인수 를 처리하는 것 입니다. 일반적으로 반환 하면 인수가 변경되었다는 것이 더 명확 해집니다. 이것은 "언어 규약"관점에서 진술 을 철회하는 것이 왜 합리적인지 조금 더 분명하게 만듭니다 .None
return
즉, 이미 미리 설정된 규칙이있는 코드베이스에서 작업하는 경우 코드베이스가 균일하게 유지되도록 돕기 위해 분명히 따라야합니다 ...
Ruby
와 Javascript
파이썬과 같은 접근 방식을. 나는 표현에 "void"라고 말하는 고급 언어의 예가 있다고 확신하지만 현재 는 생각할 수 없습니다 ( Java
고급 언어 를 고려한다면 ) ... 원숭이 패치 함수 (다른 것들 중에서 테스트에서 조롱하는 데 유용함)는 파이썬이 void
키워드를 가져 와서 함수가 아무것도 반환하지 않는 가상의 세계에서 작동 합니까? (또한 이전에 말했듯이이 디자인이 잘못된 디자인이라는 것을 확신 할 필요는 없습니다. 옳은 경우에도 아무 것도 할 수 없습니다)
다른 사람들이 대답했듯이 결과는 정확히 동일 None
하며 모든 경우에 반환됩니다.
차이점은 문체이지만 PEP8 에서는 일관성있게 사용해야합니다.
반환 진술에서 일관성을 유지하십시오. 함수의 모든 return 문은 표현식을 반환하거나 그 중 어느 것도 반환하지 않아야합니다. 리턴 문이 표현식을 리턴하는 경우, 값이 리턴되지 않은 리턴 문은이를 명시 적으로 리턴 없음으로 표시해야하며 함수 끝에 도달 할 수있는 경우 명시 적 리턴 문이 있어야합니다.
예:
def foo(x): if x >= 0: return math.sqrt(x) else: return None def bar(x): if x < 0: return None return math.sqrt(x)
아니:
def foo(x): if x >= 0: return math.sqrt(x) def bar(x): if x < 0: return return math.sqrt(x)
https://www.python.org/dev/peps/pep-0008/#programming-recommendations
기본적으로 None
함수에서 비값을 반환 하면 반환 값에 의미가 있으며 호출자가 잡을 수 있습니다. 따라서을 반환 할 때 None
명시 적으로 표현해야합니다 None
.이 경우 전달할 수 있는 의미는 반환 값 중 하나입니다.
전혀 리턴이 필요하지 않으면 함수는 기본적으로 함수 대신 프로 시저로 작동하므로 return
명령문을 포함하지 마십시오 .
프로 시저와 같은 함수를 작성 중이고 더 일찍 리턴 할 기회가있는 경우 (즉, 해당 시점에서 이미 완료되었으며 나머지 함수를 실행할 필요가없는 경우) 빈 return
s를 사용 하여 독자에게 신호를 보낼 수 있습니다. 그것은 실행의 초기 마무리 일 뿐이며 None
암시 적으로 반환 된 값은 의미가 없으며 잡히지 않아야합니다 (절차와 같은 함수는 항상 None
어쨌든 반환 합니다).
return None
함수에 때로는None
반환 값 이 아닌 값이 있지만의 위치return None
에는 그러한 반환 값이 없음을 나타냅니다. 전혀 '아니오'라고 쓰면return
"함수"가 아니라 "절차"와 같은 흥미로운 반환 값이 없다는 것을 의미합니다.return
이전 시점에 따라 "절차"에서 일찍 존재 함을 의미합니다.