이 새로운 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최종 Else와 Otherwise.


글쎄요, 파이썬 제작자에게 이야기 해주세요.]
— 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.