programing

여러 변수를 동시에 선언하는 보다 우아한 방법

lastmoon 2023. 7. 1. 09:21
반응형

여러 변수를 동시에 선언하는 보다 우아한 방법

여러 변수를 동시에 선언하려면 다음을 수행합니다.

a, b = True, False

하지만 제가 훨씬 더 많은 변수를 선언해야 한다면, 그것은 점점 덜 우아하게 변합니다.

a, b, c, d, e, f, g, h, i, j = True, True, True, True, True, False, True ,True , True, True

이것을 하는 더 나은/우아한/편리한 방법이 있습니까?

이것은 매우 기본적인 것임에 틀림없지만 변수를 저장하기 위해 목록이나 튜플을 사용했다면 다음과 같이 도움이 될 수 있도록 어떻게 접근해야 할까요?

aList = [a,b]

유효하지 않습니다. 다음 작업을 수행해야 합니다.

a, b = True, True

아니면 내가 뭘 놓쳤을까요?

a, b, c, d, e, g, h, i, j = (True,)*9
f = False

목록/사전을 사용하거나 자신의 클래스를 정의하여 정의하는 항목을 캡슐화합니다. 그러나 이러한 변수가 모두 필요한 경우 다음 작업을 수행할 수 있습니다.

a = b = c = d = e = g = h = i = j = True
f = False

다른 사람들이 제안했듯이, 부울 값과 함께 10개의 다른 로컬 변수를 사용하는 것이 루틴을 작성하는 가장 좋은 방법은 아닐 것입니다(특히 한 글자 이름을 가진 경우).

수행하는 작업에 따라 사전을 대신 사용하는 것이 합리적일 수 있습니다.예를 들어, 한 문자 플래그 집합에 대한 부울 사전 설정 값을 설정하려면 다음을 수행할 수 있습니다.

>>> flags = dict.fromkeys(["a", "b", "c"], True)
>>> flags.update(dict.fromkeys(["d", "e"], False))
>>> print flags
{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}

원하는 경우 단일 할당 문을 사용하여 이 작업을 수행할 수도 있습니다.

>>> flags = dict(dict.fromkeys(["a", "b", "c"], True),
...              **dict.fromkeys(["d", "e"], False))
>>> print flags
{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}

매 개 수변째의 두 번째 :dict것은 를 완히이위것아은닙과 같은 할 수 . 이는 실제로 다음과 같은 키워드 인수를 사용하여 사전의 개별 요소를 재정의할 수 있도록 합니다.d=False위의 코드는 다음 식의 결과를 폭파합니다.**호출된 함수로 전달되는 키워드 인수 집합으로 변환됩니다.이것은 확실히 사전을 만드는 신뢰할 수 있는 방법이고, 사람들은 적어도 이 관용구를 받아들이는 것처럼 보이지만, 저는 일부 사람들이 그것을 언피토닉이라고 생각할지도 모른다고 생각합니다. </disclaimer>


이자주 를 플래그하는 것입니다.True,False) 이름 문자열에 플래그 이름(단일 문자 문자열)에 매핑됩니다.그런 다음 이 데이터 정의를 플래그 이름을 플래그 값에 매핑하는 반전 사전으로 변환합니다.이것은 중첩된 목록 이해로 매우 간단하게 수행할 수 있지만, 다음은 매우 읽기 쉬운 구현입니다.

>>> def invert_dict(inverted_dict):
...     elements = inverted_dict.iteritems()
...     for flag_value, flag_names in elements:
...         for flag_name in flag_names:
...             yield flag_name, flag_value
... 
>>> flags = {True: ["a", "b", "c"], False: ["d", "e"]}
>>> flags = dict(invert_dict(flags))
>>> print flags
{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}

invert_dict제너레이터 함수입니다.키-값 쌍의 값을 반복적으로 반환합니다.이러한 키-값 쌍은 초기의 두 요소의 내용과 반대입니다.flags사전.그들은 그것들을 공급됩니다.dict에는 이경는에dict생성자는 인수로서 사전이 아닌 반복자에게 공급되기 때문에 위와 다르게 작동합니다.


@Chris Lutz의 코멘트를 이용하여:단일 문자 값에 대해 이 기능을 사용할 경우 실제로 다음을 수행할 수 있습니다.

>>> flags = {True: 'abc', False: 'de'}
>>> flags = dict(invert_dict(flags))
>>> print flags
{'a': True, 'c': True, 'b': True, 'e': False, 'd': False}

이것은 Python 문자열이 반복 가능하기 때문에 작동합니다. 즉, 값별로 값을 이동할 수 있습니다.문자열의 경우 값은 문자열의 개별 문자입니다.따라서 반복 가능한 것으로 해석될 때, for 루프에서 사용되는 경우처럼,['a', 'b', 'c']그리고.'abc'실질적으로 동등합니다.또 다른 예는 와 같이 반복 가능한 함수로 전달되는 경우입니다.

저는 개인적으로 이것을 하지 않을 것입니다. 왜냐하면 그것은 직관적으로 읽히지 않기 때문입니다. 제가 문자열을 볼 때, 저는 그것이 목록이 아닌 하나의 값으로 사용되기를 기대합니다.그래서 저는 첫 번째 줄을 보고 "좋아요, 참 깃발과 거짓 깃발이 있습니다."라고 생각합니다.그렇기 때문에 가능성이 있다고는 하지만 갈 길은 아닌 것 같습니다.반대로 반복 가능성과 반복기의 개념을 더 명확하게 설명하는 데 도움이 될 수 있습니다.


하기 정의수invert_dict그것이 실제로 사전을 반환하는 것도 나쁜 생각은 아닙니다; 저는 단지 그것이 일상적인 작동 방식을 설명하는 데 도움이 되지 않기 때문에 대부분 그렇게 하지 않았습니다.


Python 2.7에는 사전적인 이해가 있어 이 기능을 구현하는 매우 간결한 방법이 될 것입니다.저는 파이썬 2.7이 설치되어 있지 않기 때문에 이것은 독자들에게 연습으로 남겨집니다 :)

또한 항상 사용 가능한iter 도구 모듈의 일부 기능을 결합할 수 있습니다.그들이 말했듯이, 그것을 하는 데는 한 가지 이상의 방법이 있습니다.잠깐, 파이썬 사람들은 그렇게 말하지 않습니다.어쨌든 어떤 경우에는 사실입니다.저는 Guido가 사전적인 이해를 우리에게 주었기 때문에 이것을 할 있는 한 가지 분명한 방법이 있을 것이라고 추측합니다.

이것은 @Jeff M과 나의 논평에 대한 정교한 작업입니다.

이 작업을 수행할 때:

a, b = c, d

이것은 튜플 포장 및 포장 풀기 작업을 합니다.포장 단계와 포장 풀기 단계를 구분할 수 있습니다.

_ = c, d
a, b = _

첫 번째 줄은 다음과 같은 튜플을 만듭니다._두 가지 요소를 가지고 있는데, 첫 번째 요소는 가치가 있습니다.c그리고 가치가 있는 두 번째.d두 번째 줄은 포장을 풉니다._ 변에튜 넣다을플수▁variables에 .a그리고.b이것은 당신의 하나의 거대한 라인을 무너뜨립니다.

a, b, c, d, e, f, g, h, i, j = True, True, True, True, True, False, True, True, True, True

두 개의 작은 선으로:

_ = True, True, True, True, True, False, True, True, True, True
a, b, c, d, e, f, g, h, i, j = _

첫 번째 줄과 정확히 동일한 결과를 제공합니다(한 부분에 값 또는 변수를 추가했지만 다른 부분을 업데이트하는 것을 잊은 경우에는 동일한 예외 포함).하지만, 이 특정한 경우에, Yan의 대답이 아마도 가장 좋을 것입니다.

값 목록이 있는 경우에도 값의 압축을 풀 수 있습니다.먼저 튜플로 변환하면 됩니다.를 들어,9의 "0", "0", "9"에 할당합니다.a를 통하여j각각:

a, b, c, d, e, f, g, h, i, j = tuple(range(10))

: 5를 ( EDIT : 요를소 5외제변모든항지참깔트정는끔릭하한으로목수을한변를▁edit▁to▁neat:트:▁edit▁except)f):

a, b, c, d, e, f, g, h, i, j = tuple(x != 5 for x in range(10))

사람들이 "목록이나 튜플 또는 기타 데이터 구조를 사용하라"고 제안할 때, 그들이 말하는 것은 여러분이 관심을 갖는 많은 다른 값들이 있을 때, 그들 모두를 지역 변수로 이름 짓는 것이 최선의 방법이 아닐 수도 있다는 것입니다.

대신 하나의 로컬 변수에 저장할 수 있는 더 큰 데이터 구조로 이러한 데이터를 함께 수집할 수 있습니다.

을 풀기 전에 . 해야 할 옵션은 Chris Lutz를 사용하는 입니다. 그러나 고려해야 할 또 다른 옵션은collections.namedtuple값을 더 영구적으로 번들합니다.

따라서 다음과 같은 작업을 수행할 수 있습니다.

# Define the attributes of our named tuple
from collections import namedtuple
DataHolder = namedtuple("DataHolder", "a b c d e f g")

# Store our data
data = DataHolder(True, True, True, True, True, False, True)

# Retrieve our data
print(data)
print(data.a, data.f)

물론 실제 코드는 "데이터 홀더"와 알파벳 문자보다 더 의미 있는 이름을 사용하기를 바랍니다.

사실 뭐가 문제죠?

만약 당신이 정말로 10 a, b, c, d, e, f, g, h, i, j가 필요하거나 원한다면, 한 번에 a를 쓰고 b를 쓰고 c를 쓰는 다른 가능성은 없을 것입니다...

값이 모두 다를 경우 예를 들어 글을 써야 합니다.

a = 12
b= 'sun'
c = A() #(where A is a class)
d = range(1,102,5)
e = (line in filehandler if line.rstrip())
f = 0,12358
g = True
h = random.choice
i = re.compile('^(!=  ab).+?<span>')
j = [78,89,90,0]

즉, "데이터 세트"를 개별적으로 정의하는 것입니다.

글을 해서 또는, 다글사여하용, 할필없다니습가요사용을을 사용할 ._:

a,b,c,d,e,f,g,h,i,j =\
12,'sun',A(),range(1,102,5),\
(line for line in filehandler if line.rstrip()),\
0.12358,True,random.choice,\
re.compile('^(!=  ab).+?<span>'),[78,89,90,0]

또는

a,b,c,d,e,f,g,h,i,j =\
(12,'sun',A(),range(1,102,5),
 (line for line in filehandler if line.rstrip()),
 0.12358,True,random.choice,
 re.compile('^(!=  ab).+?<span>'),[78,89,90,0])

.

만약 그들 중 일부가 같은 값을 가져야 한다면, 쓰기에 너무 긴 것이 문제입니다.

a, b, c, d, e, f, g, h, i, j = True, True, True, True, True, False, True ,True , True, True 

?

그러면 다음과 같이 쓸 수 있습니다.

a=b=c=d=e=g=h=i=k=j=True
f = False

.

저는 정확히 당신의 문제가 무엇인지 이해할 수 없습니다.코드를 작성하려면 지침 및 정의 작성에 필요한 문자를 사용해야 합니다.물론이지.

저는 당신의 질문이 당신이 무언가를 오해하고 있다는 표시가 아닌지 궁금합니다.

를 쓸 때a = 10"값이 바뀔 수 있는 메모리의 크기"라는 의미에서 변수를 만들지 않습니다.다음 지침:

  • 둘 중 하나가 유형의 객체를 생성하도록 트리거합니다.integer 값 네임스페이스에 이 값 10 및 현 네 스 페 이 스 'a' 바

  • 또는 네임스페이스의 'a' 이름을 개체 10에 다시 입력합니다('a'가 다른 개체에 먼저 바인딩되었기 때문).

10개의 식별자 a,b,c를 정의할 수 있는 유용성이 보이지 않기 때문에 그렇게 말하는 것입니다.False 또는 True를 가리킵니다.실행 중에 이러한 값이 변경되지 않으면 왜 식별자 10개가 변경됩니까? 그리고 변경되면 식별자를 먼저 정의하는 이유는 무엇입니까? 사전에 정의되지 않은 경우 필요할 때 생성됩니다.

당신의 질문이 이상하게 보입니다.

당신은 당신의 문제에 잘못된 방식으로 접근하고 있는 것처럼 들립니다.

튜플을 사용하도록 코드를 다시 작성하거나 모든 데이터를 저장할 클래스를 작성합니다.

저는 1위로 뽑힌 답변이 마음에 드는데, 아래와 같이 목록에 문제가 있습니다.

  >> a, b = ([0]*5,)*2
  >> print b
  [0, 0, 0, 0, 0]
  >> a[0] = 1
  >> print b
  [1, 0, 0, 0, 0]

이것은 (여기서) 매우 상세하게 논의되지만, 요점은a그리고.b는 와동개체다니입과 같은 입니다.a is bTrue(에 대해서도 마찬가지)id(a) == id(b)하면 둘 다 a그리고.b서로 연결되어 있기 때문에.이 문제를 해결하기 위해 당신은 할 수 있습니다 (소스)

>> a, b = ([0]*5 for i in range(2))
>> print b
[0, 0, 0, 0, 0]
>> a[0] = 1
>> print b
[0, 0, 0, 0, 0]

그러면 이를 상위 답변의 변형으로 사용할 수 있으며, "원하는" 직관적인 결과를 얻을 수 있습니다.

>> a, b, c, d, e, g, h, i = (True for i in range(9))
>> f = (False for i in range(1)) #to be pedantic

자바스크립트처럼 파이썬에서 한 줄에 여러 문을 사용할 수도 있습니다.a = 1; b = "Hello World"; c += 3

당신의 경우, 저는 YAML을 사용할 것입니다.

그것은 여러 매개 변수를 처리하기 위한 우아하고 전문적인 표준입니다.값은 별도의 파일에서 로드됩니다.다음 링크에서 일부 정보를 볼 수 있습니다.

https://keleshev.com/yaml-quick-introduction

하지만 표준이기 때문에 구글 검색을 하는 것이 더 쉽습니다. 당신은 당신의 이해에 가장 적합한 것을 찾을 수 있습니다.;)

안부 전합니다.

언급URL : https://stackoverflow.com/questions/5495332/more-elegant-way-of-declaring-multiple-variables-at-the-same-time

반응형