조건부 할당 한 줄


140

다음 코드가 있습니다

num1 = 10
someBoolValue = True

나는의 값으로 설정해야 num1하는 20경우 someBoolValue입니다 True; 그렇지 않으면 아무 것도하지 마십시오. 그래서 여기에 대한 코드가 있습니다.

num1 = 20 if someBoolValue else num1

어쨌든 ...else num1깨끗하게 보이도록 부품을 피할 수 있습니까? 에 해당

if someBoolValue:
    num1 = 20

나는 ...else pass이것을 다음 과 같이 바꾸려고 시도했다 num1=20 if someBoolValue else pass. 내가 가진 것은 구문 오류였습니다. 나도 그 ...else num1부분을 생략 할 수 없었다 .


2
모든 것을로 변경하십시오 num1 = 20 if someBoolValue else 10. 그런 다음 줄도 저장 num1=10하시겠습니까?
Thomas Ahle

감사. 그러나 이것은 정확히 내 코드가 아닙니다. 그 의미 num1... 이미 존재
bdhar

답변:


195

파이썬에서 이것이 가능하지 않다고 생각합니다. 실제로하려는 일이 다음과 같이 확장 될 수 있기 때문입니다.

num1 = 20 if someBoolValue else num1

배제 else num1하면 할당이 실제로 무언가를 반환해야하기 때문에 구문 오류가 발생합니다.

다른 사람들이 이미 언급 했듯이이 작업을 수행 할 수는 있지만 다음에 해당 코드를 읽을 때 혼란스러워 할 수 있기 때문에 좋지 않습니다.

if someBoolValue: num1=20

나는 num1 = someBoolValue and 20 or num1똑같은 이유로 큰 팬이 아닙니다 . 나는 실제로 그 라인이 무엇을하고 있는지 두 번 생각해야합니다.

실제로 원하는 것을 달성하는 가장 좋은 방법은 원본 버전입니다.

if someBoolValue:
    num1 = 20

가장 좋은 이유는 당신이하고 싶은 일이 매우 분명하기 때문에 자신을 혼란스럽게하지 않을 것입니다.

또한, num1 = 20 if someBoolValue루비가 조금 다르게 작동하기 때문에 부수적 으로 유효한 루비 코드입니다.


8
PEP-308 ( docs.python.org/2.5/whatsnew/pep-308.html )에 따라와 같이 paren에 넣으면 조건식을 더 명확하게 만들 수 있습니다 num1 = (20 if someBoolValue else num1).
haridsv

46

이것을 사용하십시오 :

num1 = 20 if someBoolValue else num1

3
이것은 내가 사용하고있는 것입니다 .... 대체를 찾고 있습니다 .. 어쨌든 감사합니다!
bdhar

이 블록을 호출하는 방법? 이름이 뭐에요?
fuat

1
그것은 삼항 연산자입니다
크리스 메이스

큰 데이터 세트를 반복하는 경우 else 문으로 끝나는 경우 불필요한 할당이 발생하므로이 방법을 사용하지 않아야합니다.
dapc

21

한 줄로 :

if someBoolValue: num1 = 20

하지만 그렇게하지 마십시오. 이 스타일은 일반적으로 예상되지 않습니다. 사람들은 명확성과 일관성을 위해 더 긴 형식을 선호합니다.

if someBoolValue:
    num1 = 20

(동일하게 낙타 모자는 피해야합니다. 대신을 사용하십시오 some_bool_value.)

참고 인라인 것을 표현 some_value if predicate 없는 else술어가 거짓 인 경우 반환 값이되지 않을 것 때문에 부분은 존재하지 않습니다. 그러나 표현식은 모든 경우에 명확하게 정의 된 리턴 값을 가져야합니다. 이것은 Ruby 나 Perl과 같은 사용법과 다릅니다.


2
읽기가 어려워지고 아마도 자신의 코드에 혼란 스러울 수 있으므로 결코 좋은 생각이 아닙니다.
프로스트

@bdhar, 왜 한 줄에 넣고 싶습니까? 그것은 다른 사람들이 읽을 그냥 열심히 할 것이다, 더 빨리 실행되지 않습니다
존 라 Rooy

1
사실 @gnibbler입니다. 가독성이 더 좋은 짧은 형식을 찾고있었습니다.
bdhar

17

다음 중 하나를 사용할 수 있습니다.

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal

1
멋진 한 라이너 조건부 할당
minhas23

그 "구조"는 어떻게 불리는가? 나는 ~ 6 개월 동안 파이썬을 배우는 것을 본 적이 없습니다.
Guimoute

1
당신이 그들 앞에 하나를 두지 않는 한, 적어도 이것들은 과제가 아닙니다. 두번째는 여기에 설명 된 방식으로 작동하지 않을 것입니다. 첫 번째는 튜플을 만든 다음 해당 요소 중 하나를 인덱스별로 선택합니다. 하위 클래스 이므로 -1과 1 사이의 정수 또는 True/ 를 반환하는 테스트에서만 작동합니다 . 테스트가 참으로 평가되는 것을 반환하는 모든 경우에 예외로 실패합니다. 두 번째 는 거짓 자체를 평가하지 않는 한 작동하기 때문에 테스트가 참이더라도 벌이 할당됩니다. FalseboolinttrueValfalseVal
Bachsau

에 그것은 또한 매우 까다 짧은 잘하지만, 안전하게 "권장 패턴"(나는 그것을을 downvoted 때문에), ... Bachsau에서 코멘트 위의 참조로 사용할 수
tverrbjelke

6

아니요. 같은 num1 = 20 if someBoolValue것이 효과 가 있기를 바랐 지만 그렇지 않습니다. 가장 좋은 방법은 if성명서를 작성하는 것입니다.

if someBoolValue:
    num1 = 20

5
num1 = 10 + 10*(someBoolValue is True)

이것이 나의 새로운 최종 답변입니다. 사전 답변은 다음과 같으며 명시된 문제에 대해 과도하게 사용되었습니다. Getting_too_clever == not Good. 다음은 사전 답변입니다 ... Truecond 에 하나를 추가 하고 다른 하나를 추가하려는 경우 여전히 좋습니다 False.

num1 = 10 + (0,10)[someBoolValue is True]

num1이미 언급 한 값은 이미 그대로 두어야합니다. 나는 그것이 num1 = 10포스트의 첫 번째 진술이기 때문에 가정 했으므로 얻을 수있는 작업 20은 add 10입니다.

num1 = 10
someBoolValue = True

num1 = 10 + (0,10)[someBoolValue is True]

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')

이 출력을 생성

num1 = 20
someBoolValue = True

이제 'num1 = 10 + 10 * (someBoolValue == True)'라고 대답해야한다고 생각합니다. 기본적으로 '거짓'조건으로 정의 된 문제입니다. 'False'에 다른 값을 추가하는 선택이 필요한 경우 이전 답변이 더 적합합니다. 댓글에서 내 게시물을 수정하거나이 작업을 수행합니까?
MikeyB


2

일부 부울이 true 인 경우 메소드를 호출하려는 경우 else None삼항을 종료 할 수 있습니다 .

>>> a=1
>>> print(a) if a==1 else None
1
>>> print(a) if a==2 else None
>>> a=2
>>> print(a) if a==2 else None
2
>>> print(a) if a==1 else None
>>>

1

하나의 라인 코드가 확실하게 발생할 경우 Python 3.8 은“walrus operator”라고 알려진 할당 표현을 소개 합니다 .

:=

someBoolValue and (num := 20)

20할당됩니다 num첫 번째 부울 표현식 인 경우 True. 할당은 여기에 괄호 안에 있어야합니다. 그렇지 않으면 구문 오류가 발생합니다.

num = 10
someBoolValue = True

someBoolValue and (num := 20)
print(num) # 20

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10

0

미래의 Google 여행자를 위해 다음과 같은 새로운 방법이 있습니다 (python 3.8 이상에서 사용 가능).

b = 1
if a := b:
    # this section is only reached if b is not 0 or false.
    # Also, a is set to b
    print(a, b)


-1

여기 내가 제안 할 수있는 것이 있습니다. 다른 변수를 사용하여 if 절을 파생시키고 num1에 지정하십시오.

암호:

num2 =20 if someBoolValue else num1
num1=num2


-1

이런 식으로 할 수 있습니다.

try:
    a = [i for i in [20] if False][0]
except IndexError:
    print("Do what ever you want here")

이 방법으로 문제를 해결할 수는 있지만 'try / except block'을 사용하는 것이 파이썬의 모범 사례는 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.