이 새로운 if-then 구문에 대해 어떻게 생각하십니까?


11

나는 if-elif-else 컨트롤에 정말 멋진 무언가를 생각하고있었습니다.


if condition:
    stuff()
elif condition:
    otherstuff()
then:
    stuff_that_applies_to_both()
else:
    stuff_that_doesnt_aply_to_either()

따라서 기본적으로 then조건은 else 조건을 제외한 조건이 실행될 때 실행됩니다. 이것이 유용하다고 생각합니까? 파이썬의 try-except-else와 비슷합니다.

나는 당신 중 일부가 매우 예비 구현을 nitpicking 생각합니다. then블록은 단지 같은 것이 elseA의 블록 try-except파이썬에서 블록. 내가 제안하는 진정한 이유는 이와 같은 상황 때문입니다.


m = {}
if condition == '1':
    m['condition'] = condition
elif condition2 == '3':
    m['condition2'] = condition2
elif condition3 == 'False':
    m['condition3'] = True
then:
    run_test_that_relies_on_one_of_the_conditions_being_true()

return m

then단지처럼이 경우 블록은 처음에 범위가 else있다. 따라서 중첩이 잘 작동합니다. if 문 전에 메서드를 실행해야하는 경우이 사용 사례와는 아무런 관련이 없습니다.


이것이 얼마나 중첩 될 수 있습니까?
aggietech

6
상자 밖에서 생각하면 +1하지만 실제로 구현하기 위해 투표하지는 않습니다. 왜 내 대답을 아래에서 참조하십시오.
Sane Wonko

1
그렇다면 '다음'은 finallyJava에서 와 같이 작동 합니까?
Alex Feinman

1
내가 찾을 then약간 혼동이 될 수 있습니다. 일반적으로 다음 then에 발생합니다 if. 내 말은, 당신은 말하고 if condition, then stuff()있지만 말 을 계속then stuff that applies to both
매트 Olenik

2
흥미로운 생각 운동에 +1하지만, 나쁜 생각 아래에 이것을 제출하는 답변에 동의합니다. 그것은 직관적이지 않으며, 이것이 정말로 일부 코더를 넘어 뜨리는 것을 볼 수 있습니다.
BlairHippo

답변:


17

나는 그것이 끔찍한 것 같아요. 다양한 조건 후에 코드를 실행하려면 (a) 해당 조건을 다시 확인하거나 (b) 표시된 성공 상태로 변수를 설정하십시오.


2
동의합니다. 귀하가 제공 한 설명없이 의미가 무엇인지 이해하기가 매우 어렵습니다.
tcrosley 2016 년

왜 무언가를 기대하기에 너무 많이 작동하는지에 대한 설명이 필요한 이유는 무엇입니까?
Falmarri

5
코드를 읽기 어렵게하기 때문입니다.
Antsan

나는 그것이 공정한지 확실하지 않습니다. 코드의 모든 구조는 한 번 설명해야합니다.
Magus

14

일반적으로 스위치 / 케이스를 사용하여이 작업을 이미 수행 할 수 있으며 스위치 / 케이스는 제안하는 내용을보다 정밀하게 제어 할 수 있습니다.

또한 논리적으로 제대로 읽지 않습니다. A가 B 인 경우 C 인 경우 A 또는 B 인 경우 A 또는 B가 true로 평가되면 C가 실행될 것이라는 것을 다른 사람에게 암시하지 않습니다.


2
파이썬에는 switch / case 문이 없습니다
Falmarri

2
나는 그 질문이 파이썬에 대한 직접적인 대답이라고 생각하지는 않지만 그것이 의도라면 파이썬으로 태그를 달아주십시오.
Brian R. Bondy

글쎄, 그것은 파이썬을 직접적으로 말하는 것이 아닙니다. 예제는 파이썬이었습니다. 그러나 이것이 왜 필요하지 않은지에 대한 귀하의 답변이 "스위치 설명이 있습니다"라면, 파이썬에는 그러한 것이 없습니다.
Falmarri

1
@ Falmarri : 충분히 공평하기 때문에 파이썬이 고전적인 스위치 문을 지원하는 것이 더 좋을 것입니다.
Brian R. Bondy

질문의 코드가 파이썬에 있다고해서 그 질문이 파이썬에 관한 것이라는 것을 의미하지는 않습니다. 왜냐하면 의사 코드 일 수도 있기 때문입니다. 그것이 파이썬에 관한 것이라면 다음과 같이 태그되어야합니다
phuclv

8

흥미롭지 만 가독성, 논리 및 구문 문제에 대한 초대는 나에게 (내 방식으로 다소 설정되어 있음) 보입니다.

편집 : if-elif는 매우 간단합니다-10 개의 elifs가 있다면 어떨까요? 20? 모든 조건이 사실이어야합니까? 그 기회는 무엇입니까?
if-elif는 매우 간단합니다. 10 개의 elif가 있다면 어떨까요? 20? 그렇게하면 읽을 수 없습니까?

또한 검증 된 방법으로 쉽게 달성 할 수 있습니다.

if (thisCondition or thatCondition)
{
  if (thisCondition)
     stuff();
  else
     otherstuff();

    stuff_that_applies_to_both();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

개별 단계 전에 "stuff_that_applies_to_both"가 발생해야하는 경우 어떻게됩니까? 귀하의 코드는이 경우를 처리하지 않습니다 :

if (thisCondition or thatCondition)
{
  stuff_that_applies_to_both();

  if (thisCondition)
     stuff();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

마지막으로이 구문을 사용하면 더 많은 조건에서 유연성을 높일 수 있습니다. if (thisCondition 또는 thatCondition 또는 anotherCondition) {stuff_that_applies_to_all ();

  // Any combination of the three conditions using 
  // whichever logical syntax you'd like here
  if (thisCondition and anotherCondition)
     stuff();
  else if (thisCondition or thatCondition)
     stuff_number_2();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

if / else를 사용했지만 플래그와 함께 switch 문을 쉽게 사용할 수 있습니다.

Boolean conditionApplies = true;

switch (someConditionToCheck)
{
    case thisCondition:
      stuff();
      break;

    case thatCondition:
        otherStuff();
        break;

    default:
        stuff_that_doesnt_aply_sic_to_either();
        conditionApplies = false;
        break;
}

if (conditionApplies)
    stuff_that_applies_to_both();

실제로 conditionApplies 플래그가 필요하지 않았습니다. 기본이 아닌 두 조건 모두에 "stuff_that_applies_to_both ()"함수를 추가 할 수있었습니다. "else"보다는.

따라서 좀 더 일반적인 구문이 청구서를 채우는 매우 전문적인 구문 인 것 같습니다.

가능한 기능을 생각하면 +1하지만 (계속 유지하십시오!) 나는 그것을 구현하기 위해 투표하지 않을 것입니다.


1
"시도하고 확립 된 방법론"에 +1 – 문제에 대한 합리적인 해결책이 있다면, 그것을 사용하는 것이 가장 좋습니다 :)
bedwyr

what if there were 10 elifs? 20? Would all conditions need to be true?그건 불가능하다. 더 많은 평가를 중단하므로 1 elif 만 적용됩니다.
Falmarri

내 실수-나는 당신이 "또는"을 의미 할 때 "and"로 읽었습니다. 그러나 나는 내 대답을 기다립니다-당신이 지적한 것에서 그것을 업데이트 할 것입니다.
Sane Wonko

여기에 게시 한 구문이 내가 제안한 것보다 명확하다고 생각하십니까? 조건을 두 번 점검 할뿐 아니라 중첩이 아닌 것이 중첩보다 항상 좋습니다
Falmarri

1
당신의 "then"이 진정으로 모든 조건에 적용되지 않는 한, 당신의 조건은 점점 더 많아 질수록 점점 더 낮아질 것입니다. 그리고 개인적으로 C / C ++ / C # 배경에서 나왔을 때 분할 구문보다 혼동이 적습니다. .. 그렇지 않으면 "다음"에 나는 개인적으로 잘되지 않을 수 있습니다 함께 모든 조건이 더 읽을 구문을 찾을 수 있지만, 내 일상 세계에서 더 설립 된 개념이다.
Wonko 제정신

2

나는 오늘 이와 같은 것을 사용하는 것을 신경 쓰지 않을 것입니다. 그러나 반복을 사용할 때까지 자주 사용할 것입니다.

불필요한 중첩이 없으면 코드가 더 좋아 보일 것입니다. 비록 선호 Else If합니다 elif. 나는 대체 것 Then으로 Do최종 ElseOtherwise.


글쎄요, 파이썬 제작자에게 이야기 해주세요.]
Falmarri

오, 나는 당신이 새로운 언어를 디자인하고 있다고 생각했습니다. 이름 변경을보다 정확하게 제안하고 싶습니다. 원한다면 elif를 남겨 두십시오. 그러나 마지막은 다른 것과 구별되어야하는 것처럼 보입니다.
피터 터너

글쎄, 그것은 반드시 새로운 언어를위한 것은 아니지만, 파이썬을위한 것은 아닙니다. 일반적으로 구문 규칙에 대한 새로운 아이디어입니다. 부작용이 거의없는 모든 언어에 적용 할 수 있습니다.
Falmarri

0

멋진 아이디어 인 것 같습니다. 그러나 내가 생각하는 유일한 문제는 당신이 버그에 더 취약하다는 것입니다. if / else if를 작성하고 그때 blah ()를 호출하는 것과 같습니다. blah를 원하지 않는 경우 추가를 작성하여 blah를 제거한 다음 ifs / elseif에 추가하십시오. 그런 다음 사용자 또는 다른 프로그래머가 다른 명령문을 추가하면 blah가 호출 될 것으로 예상되지만 그렇지 않을 수 있습니다.

또는 여러 ifs를 가질 수 있고, blah를 작성하고 모든 ifs를 잊어 버릴 수 있지만 하나는 무언가를 깨뜨릴 필요가 있습니다. if 블록 아래에두면 모든 것을 따라야 할 수도 있습니다. 아마도 (NoUpdate = true)에 bool을 설정하고 if (! NoUpdate) {}를 직접 작성하면 더 명확하고 if로 설정할 수 있습니다

나는 단지 버그가 더 발생하기 쉽다고 말하고 있습니다. 나는 그것을 언어로 보는 것이 마음에 들지 않지만 내 언어가 그것을 지원한다면 그것을 사용할 위치를 상상할 수 없다.


Possibly setting a bool in else (NoUpdate=true) and just write a if(!NoUpdate) {} directly under which is clearer and can be set by an if이것이 정확히 방지 해야하는 것입니다. 이것이 elif 진술의 요점입니다. Elif도 필요하지 않으며 if 문으로 확인할 수 있지만 복잡해집니다.
Falmarri

0

나는 당신의 구문이 혼란 스럽지만 개념에 약간의 가치가 있다고 생각합니다. 개념적으로, 내가이 문제를 고려했을 때, 내가 찾은 것은 "unelse"인데, 기본적으로 마지막 else이 실행되지 않은 경우에 실행 됩니다. 그 각도에서 보면 비슷한 결과를 얻을 수 있다고 제안합니다.

  하다
  {
    if (조건 1)
      ... condition1 전용
    그렇지 않으면 (조건 2)
      ... condition2 전용
    그밖에
    {
      ... 무조건에 대한 것
      단절;
    }
    ... 두 조건을위한 것
  } while (0); // 휴식을위한 연속 점

경우에 따라 다른 옵션은 다음과 같습니다.

  if ((condition1 && (action1,1)) ||
       (condition2 && (action2,1)) ||
       (action_for_neither, 0))
    action_for_either;

약간 불쾌하게 보이지만 경우에 따라 코드를 복제하거나 사용 goto하는 것 ( 원하는 사람이 여기에 삽입 할 수있는 만화를 제외하고는 나쁘지 않을 수도 있음) 이외의 원하는 이벤트 시퀀스를 표현하는 좋은 방법 이 없을 수 있습니다.

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