이를 지원하는 언어에서 여러 값을 반환하는 일반적인 방법은 튜플링을 사용하는 경우가 많습니다.
이 사소한 예를 살펴봅시다:
def f(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return (y0, y1, y2)
하지만 반환되는 값의 수가 증가하면 문제가 됩니다. 네 개 또는 다섯 개의 값을 반환하려면 어떻게 해야 할까요? 물론, 계속 튜플링할 수는 있지만 어떤 값이 어디에 있는지 잊어버리기 쉽습니다. 또한 값을 받으려는 곳에서 포장을 푸는 것도 다소 보기 흉합니다.
다음 논리적 단계는 일종의 '레코드 표기법'을 도입하는 것 같습니다. 파이썬에서 이를 수행하는 확실한 방법은 딕셔너리
를 사용하는 것입니다.
다음을 고려하세요:
def g(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return {'y0': y0, 'y1': y1 ,'y2': y2}
(분명히 말씀드리자면, y0, y1, y2는 추상적인 식별자라는 뜻입니다. 앞서 지적했듯이 실제로는 의미 있는 식별자를 사용합니다.)
이제 반환된 객체의 특정 멤버를 투영할 수 있는 메커니즘이 생겼습니다. 예를 들어
result['y0']
하지만 다른 옵션도 있습니다. 대신 특수한 구조를 반환할 수 있습니다. 파이썬의 맥락에서 설명했지만 다른 언어에도 적용될 수 있습니다. 실제로 C로 작업하는 경우 이것이 유일한 옵션일 수 있습니다. 시작하겠습니다:
class ReturnValue:
def __init__(self, y0, y1, y2):
self.y0 = y0
self.y1 = y1
self.y2 = y2
def g(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return ReturnValue(y0, y1, y2)
파이썬에서는 앞의 두 가지가 배관 측면에서 매우 유사할 수 있습니다. 결국 { y0, y1, y2 }
는 ReturnValue
의 내부 __dict__
에 들어가는 항목이 될 뿐입니다.
작은 객체에 대해 파이썬이 제공하는 추가 기능이 하나 더 있는데, 바로 __slots__
어트리뷰트입니다. 이 클래스는 다음과 같이 표현할 수 있습니다:
class ReturnValue(object):
__slots__ = ["y0", "y1", "y2"]
def __init__(self, y0, y1, y2):
self.y0 = y0
self.y1 = y1
self.y2 = y2
파이썬 참조 매뉴얼]2에서 가져왔습니다:
__slots__
선언은 인스턴스 변수의 시퀀스를 취하고 각 인스턴스에 각 변수의 값을 저장할 수 있는 충분한 공간만 예약합니다. 각 인스턴스에 대해__dict__
가 생성되지 않으므로 공간이 절약됩니다.
파이썬 3.7의 새로운 데이터클래스를 사용하면 특수 메서드, 타이핑 및 기타 유용한 도구가 자동으로 추가된 클래스를 반환합니다:
@dataclass
class Returnvalue:
y0: int
y1: float
y3: int
def total_cost(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return ReturnValue(y0, y1, y2)
제가 간과했던 또 다른 제안은 도마뱀 빌의 제안입니다:
def h(x):
result = [x + 1]
result.append(x * 3)
result.append(y0 ** y3)
return result
이 방법은 제가 가장 선호하지 않는 방법입니다. 하스켈을 많이 접한 탓인지 모르겠지만, 혼합형 목록이라는 개념은 항상 불편하게 느껴졌습니다. 이 특정 예제에서는 목록이 혼합 유형이 아니지만 그럴 수도 있습니다.
이런 식으로 사용되는 목록은 제가 알 수 있는 한 튜플과 관련하여 실제로 아무것도 얻지 못합니다. 파이썬에서 리스트와 튜플의 유일한 차이점은 리스트는 변경 가능한 반면 튜플은 그렇지 않다는 것입니다.
저는 개인적으로 함수형 프로그래밍의 관습을 그대로 이어받아 같은 유형의 요소는 얼마든지 리스트를 사용하고, 미리 정해진 유형의 요소는 정해진 수만큼 튜플을 사용하는 경향이 있습니다.
긴 서문이 끝나면 피할 수 없는 질문이 나옵니다. 어떤 방법이 가장 좋다고 생각하시나요?
저는 일반적으로 설정 작업이 덜 필요하기 때문에 사전 방식을 선호합니다. 그러나 유형 관점에서 보면 사전이 무엇을 나타내는지 혼동하는 것을 피하는 데 도움이 될 수 있으므로 클래스 경로를 사용하는 것이 더 나을 수 있습니다.
반면에 파이썬 커뮤니티에서는 명시적 인터페이스보다 암시적 인터페이스를 선호해야 한다고 생각하는 사람들이 있는데, 이 경우 기본적으로 동일한 속성은 항상 동일한 의미를 갖는다는 규칙에 의존하기 때문에 객체의 유형은 실제로 관련이 없습니다.
그렇다면 파이썬에서 여러 값을 반환하려면 어떻게 해야 할까요?
[Release. 튜플을] [1] 이 목적을 위해 2.6 에 추가되었다. [오스릭스테] [2] 의 내장 비슷한 예를 볼 수 있다.
>>> import collections
>>> Point = collections.namedtuple('Point', ['x', 'y'])
>>> p = Point(1, y=2)
>>> p.x, p.y
1 2
>>> p[0], p[1]
1 2
[1]: http://docs.python.org/library/collections.html # 네메트루프레 팩터리의 기능을 가진 튜플을 release. 필드 [2]: http://docs.python.org/library/os.html # 오스릭스테
최근 버전의 파이썬 3 (3.6+ 생각한다), '새' 를 라이브러리란 attaboy 를 ['네메트루프레'] (https://docs.python.org/3/library/typing.html # 티핑.남드투플레) 라는 클래스를 만들고 간소화하는지 튜플을 만들기 위해 더욱 강력한. ',' 에서 상속 및 유형 주석입니다 기본값과 티핑.남드투플레 닥스트링스 사용할 수 있습니다.
예 (&solarisdvd docs):
class Employee(NamedTuple): # inherit from collections.NamedTuple
name: str
id: int = 3 # default value
employee = Employee('Guido')
assert employee.id == 3
내가 가장 쉽게 사용할 수 있는 소규모 프로젝트를 위해 찾아 튜플을. 시작할 때 너무 세게 얻을 수 있는 논리 구조를 셨으며 그룹화하면 관리할 수 있지만, 내가 아닌 과거) 를 사용하는 것은 옳지 않은 것 같다 '' 객체에는 레투른바루이 너회의 제안됩니다 사전 및 (또는 너무 상투적이고).
키가 있는 ',', '" y1" y0" 사전을 찾는 ";;;;' 등의 ',' " y2" doesn& # 39, t 에서 제공하는 다른 우위를 튜플을. '속성' 반환 '레투른바루이 인스턴스입니다 .y0 .y1 .y2' 등을 통해 ',', ',' t # 39 에서 제공하는 다른 우위를 doesn& 튜플을 중 하나. Drstart 스크립트를 실행하여 명명 창조하셨노 스케쳐내 afaq 어디든요, 진실이며당신이 튜플을 이용해 할 수 있겠죠.
def get_image_data(filename):
[snip]
return size, (format, version, compression), (width,height)
size, type, dimensions = get_image_data(x)
이럴 수 있는 유일한 방법은 튜플을 좋은 것이 아니라 실제 객체에는 복귀하십시오 이벤트수정적절한 메서드 및 속성 () '또는', '같은 레지마치 얻을 수 있는 오픈 (파일)'.
많은 답변 모음을 반환되기를 제안하세요 정렬하려면 사전 또는 바뀌엇어요 일부 듯 합니다. 그리고 그냥 추가 구문을 남겨두십시오 끕니까 반환 값, 쉼표로 구분된 쓸 수 있습니다. 참고: 엄밀히 말하면 이 튜플 반환합니다.
def f():
return True, False
x, y = f()
print(x)
print(y)
보기입니다:
True
False
나는 표를 사전이므로
내가 찾을 수 있는 내가 만들 경우, 그 이상 아무것도 반환하는 함수를 2-3 배 up in 사전이란다 com/go/4e6b330a_kr I& # 39 ll 그렇지 않으면 내가 순서 및 컨텐츠 # 39 m, 다시 뭐한테 I& 될 수 있다.
사전 키를 사용하여 유형에 대한 우려가 있는 경우, 예를 들어, & # 39 설명식 찾기, x 값을 list& # 39;.
def g(x):
y0 = x + 1
y1 = x * 3
y2 = y0 ** y3
return {'y0':y0, 'y1':y1 ,'y2':y2 }
내가 사용할 때마다 가슴이 natural" 포지셔닝하십시오 튜플을 튜플 ";; 좌표는 별도의 객체에는 스스로 설 수 있는 일반적인 들어 있는 미디어만을 한 축을 ns500 계산, and the order 중요하다. (예: 참고: 내가 할 수 없는 경우 또는 무순서 정렬하려면 항목에 대한 부작용 제꿈의 그룹 관심용 아마 shouldn& # 39, 튜플 사용할 수 없다.
내가 사용하는 경우에만 사전 비호환성의 aren& 객체에는 그룹화됩니다 # 39, 항상 같은 값을 반환하지 않는다. 생각하노라 옵션임 전자_메일 헤더도.
남은 건 그룹화할 객체에는 고유한 의미가 있는 그룹 내의 또는 완전 본격적인 객체에는 색상에는 고유한 메서드을 요구되는가, 내가 클래스를 사용할.
일반적으로 '특수 구조'는 실제로는 고유한 메서드가 있는 객체의 합리적인 현재 상태입니다.
class Some3SpaceThing(object):
def __init__(self,x):
self.g(x)
def g(self,x):
self.y0 = x + 1
self.y1 = x * 3
self.y2 = y0 ** y3
r = Some3SpaceThing( x )
r.y0
r.y1
r.y2
저는 가능하면 익명의 구조체에 이름을 붙이는 것을 좋아합니다. 의미 있는 이름은 사물을 더 명확하게 만들어 줍니다.
for score,id,name in scoreAllTheThings():
if score > goodScoreThreshold:
print "%6.3f #%6d %s"%(score,id,name)
.as 객체에는 버전이 더 어수선하게 사항:
for entry in scoreAllTheThings():
if entry.score > goodScoreThreshold:
print "%6.3f #%6d %s"%(entry.score,entry.id,entry.name)
이 딕트 그레타 '혼자'.
for entry in scoreAllTheThings():
if entry['score'] > goodScoreThreshold:
print "%6.3f #%6d %s"%(entry['score'],entry['id'],entry['name'])
비슷한 작업을 하고 있는 자신을 볼 경우, 당신은 이 아닌 사소한 것은 널리 사용되는 여러 곳에 it& 코드에서 # 39, s 클래스 객체에는 보람 있게 일반적으로 다음, 적절한 방법.
마지막으로, # 39 m 될 경우, 데이터 교환을 통해 비 파이썬 I& 시스템 구성 요소, I& # 39, 가장 자주 보관합니다 딕트 '때문에' ll that& # 39 의 가장 적합한 JSON 직렬화하지.
파이썬 2.6 및 up 을 위한 [release. 튜플] [1] 은 이러한 컨테이너입니다 클래스뿐만 쉽게 유용한 방법입니다 만들기, 결과가 ", 가볍고, 일반 tuples" 것보다 더 많은 메모리를 필요하지 않습니다.
[1]: http://docs.python.org/library/collections.html # 콜레스티언스트남드투플레
난 다시 사용할 수 있는 값을 함수은 전달하십시오 딕트:
양식 에서 정의된 변수를 사용하여 형태로.
form = {
'level': 0,
'points': 0,
'game': {
'name': ''
}
}
def test(form):
form['game']['name'] = 'My game!'
form['level'] = 2
return form
>>> print(test(form))
{u'game': {u'name': u'My game!'}, u'points': 0, u'level': 2}
이는 가장 효과적인 방법으로 가져다줄래요 및 처리 장치.
다시 한 번 있는 단 하나의 포인터입니다 아웃해야 포인터입니다 전달하십시오 합니다.
" Best"; 는 부분적으로 주관적인 결정을 내렸다. 중소기업에 대한 일반적인 경우에 사용할 수 있는 튜플에 복귀하십시오 세트 불변 사용할 수 있습니다. 한 때 꼭 필요한 것은 아닙니다 바뀌엇어요 가변성 튜플 항상 것이 바람직하다.
좀 더 복잡한 형식이 있는 경우를 충족하거나 반환 값 (즉, 높은 가치를 code) 는 뵀謗 명명된 튜플 좋다. 가장 복잡한 객체에 대한 경우 보통 가장 좋습니다. 그러나 it& # 39 의 가장 중요한 역할을 하는 것이다. 이기 때문에 자연스럽게 이해할 수 있는 경우 객체를 반품하십시오 너희는너희가 끝에 함수 (예를 들어 팩토리 패턴) 을 반품하십시오 객체에는.
현명한 사람이 있다 "고 말했다.
>. 너무 일찍 최적화됩니다 the root of all evil (또는 최소한 대부분 >. 정보기술 (it) 의 프로그래밍.