คุณคิดอย่างไรกับไวยากรณ์ 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()

ดังนั้นโดยทั่วไป a thenจะถูกเรียกใช้เมื่อเงื่อนไขใด ๆ ถูกเรียกใช้ยกเว้นเงื่อนไขอื่น คุณคิดว่าสิ่งนี้มีประโยชน์หรือไม่? มันคล้ายกับ try-except-else ของ python

ฉันคิดว่าพวกคุณบางคนกำลังวางมือในการดำเนินการเบื้องต้น thenบล็อกจะเป็นเช่นเดียวกับelseบล็อกใน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 statement นั่นไม่เกี่ยวข้องกับกรณีการใช้งานจริง ๆ


วิธีนี้ซ้อนกันได้อย่างไร
aggietech

6
+1 สำหรับการคิดนอกกรอบ แต่ฉันจะไม่ลงคะแนนเพื่อใช้งานจริง ดูคำตอบของฉันทำไมด้านล่าง
Wonko the Sane

1
ดังนั้น 'จะ' ทำหน้าที่เหมือนfinallyใน Java?
Alex Feinman

1
ฉันรู้สึกthenสับสนเล็กน้อย มักจะthenบอกเป็นนัย ๆ ifที่จะเกิดขึ้นหลังจากที่ ฉันหมายถึงคุณกำลังพูดif condition, then stuff()แต่หลังจากนั้นพูดต่อไปthen stuff that applies to both
Matt Olenik

2
+1 สำหรับแบบฝึกหัดความคิดที่น่าสนใจ แต่ฉันเห็นด้วยกับคำตอบที่ยื่นภายใต้แนวคิดที่ไม่ดี มันไม่ได้ใช้งานง่ายและฉันสามารถเห็นสิ่งนี้ทำให้ผู้เขียนโค้ดเพิ่มขึ้นเป็นสามเท่า
BlairHippo

คำตอบ:


17

ฉันคิดว่ามันดูน่ากลัว หากคุณต้องการให้โค้ดทำงานหลังจากเงื่อนไขต่างๆ (a) ตรวจสอบเงื่อนไขเหล่านั้นอีกครั้งหรือ (b) ตั้งค่าตัวแปรเป็นสถานะความสำเร็จที่ระบุไว้


2
ฉันเห็นด้วย - ยากมากที่จะรับความหมายโดยไม่มีคำอธิบายเช่นที่คุณให้ไว้
tcrosley

ทำไมต้องมีคำอธิบายว่ามีอะไรทำงานได้มากเกินคาด
Falmarri

5
เพราะมันทำให้โค้ดอ่านยากขึ้น
Antsan

ฉันไม่แน่ใจว่ามันยุติธรรม ทุกการสร้างในรหัสจะต้องมีการอธิบายครั้งเดียว
Magus

14

โดยทั่วไปคุณสามารถทำสิ่งนี้ได้ด้วยสวิตช์ / ตัวพิมพ์และสวิตช์ / ตัวพิมพ์ให้การควบคุมที่ละเอียดยิ่งขึ้นกว่าสิ่งที่คุณกำลังเสนอ

นอกจากนี้ยังอ่านเหตุผลไม่ถูกต้อง ถ้า A อื่นถ้า B ดังนั้น C ไม่ได้บอกเป็นนัยถึงคนที่จะถูกดำเนินการถ้า A หรือ B ประเมินว่าเป็นจริง


2
Python ไม่มีคำสั่ง switch / case
Falmarri

2
ฉันไม่คิดว่าคำถามนี้ถูกเขียนขึ้นโดยตรงต่อคำตอบของ Python แต่ถ้านั่นเป็นเจตนากรุณาติดแท็กเป็น Python ด้วย
Brian R. Bondy

มันไม่ได้พูดโดยตรงกับไพ ธ อน ตัวอย่างคือไพ ธ อน แต่ถ้าคุณตอบกลับไปว่าทำไมไม่จำเป็นต้องมี "มีคำสั่ง switch", python ก็ไม่มี
Falmarri

1
@Falmarri: ยุติธรรมเพียงพอดังนั้นฉันเดาว่าคำตอบของฉันคือว่า Python จะดีกว่าที่จะสนับสนุนงบสวิตช์แบบคลาสสิค
Brian R. Bondy

รหัสในคำถามอยู่ใน Python ไม่ได้หมายความว่าคำถามนั้นเกี่ยวกับ Python เพราะนั่นอาจเป็นรหัสเทียมเช่นกัน หากนั่นเป็นเพียงเกี่ยวกับ Python คุณควรติดแท็กเป็นเช่นนี้
phuclv

8

น่าสนใจ แต่ดูเหมือนว่าสำหรับฉัน (เป็นที่ยอมรับในแนวทางของฉัน) คำเชิญสำหรับปัญหาการอ่านตรรกะและไวยากรณ์

แก้ไข: if-elif ของคุณนั้นง่ายมาก - จะเกิดอะไรขึ้นถ้ามี 10 elif 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();
}

ในที่สุดไวยากรณ์นี้จะช่วยให้มีความยืดหยุ่นมากขึ้นด้วยเงื่อนไขเพิ่มเติม: ถ้า (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 ()" ให้กับทั้งเงื่อนไขที่ไม่ใช่ค่าเริ่มต้น - ฉันเพิ่งทำสิ่งนี้เพื่อให้ดูเหมือนกับไวยากรณ์ที่กำหนดไว้ด้านบนแม้ว่า "จากนั้น" มากกว่า "อื่น ๆ "

ดังนั้นฉันจึงดูเหมือนว่าจะเป็นไวยากรณ์ที่พิเศษมากซึ่งไวยากรณ์ทั่วไปที่เติมขึ้นจะเรียกเก็บเงินและอีกมากมาย

+1 เมื่อคิดถึงคุณลักษณะที่เป็นไปได้ (ทำต่อไป!) แต่ฉันจะไม่ลงคะแนนเพื่อใช้งาน


1
+1 สำหรับ "พยายามและวิธีการจัดตั้งขึ้นจริง" - ถ้ามีวิธีการแก้ปัญหาที่เหมาะสมสำหรับปัญหาก็มักจะดีที่สุดที่จะใช้มัน :)
bedwyr

what if there were 10 elifs? 20? Would all conditions need to be true?มันเป็นไปไม่ได้. มีเพียง 1 elif เท่านั้นที่สามารถเป็นจริงได้เนื่องจากจะหยุดการประเมินเพิ่มเติม
Falmarri

ความผิดพลาดของฉัน - ฉันอ่านมันว่า "และ" เมื่อคุณหมายถึง "หรือ" อย่างไรก็ตามฉันยืนตามคำตอบของฉัน - ฉันจะอัปเดตจากสิ่งที่คุณชี้ให้เห็น
Wonko the Sane

คุณคิดว่าไวยากรณ์ที่คุณโพสต์ไว้ที่นี่ชัดเจนกว่าที่ฉันแนะนำหรือไม่ คุณไม่เพียง แต่ตรวจสอบสภาพของคุณสองครั้ง แต่การทำรังแบบไม่ดีกว่าการทำรังอยู่เสมอ
Falmarri

1
เช่นเดียวกับคุณเว้นแต่ว่า "แล้ว" ของคุณจะใช้กับทุกเงื่อนไขอย่างแท้จริงซึ่งเมื่อคุณเพิ่มเงื่อนไขเหล่านั้นมากขึ้นเรื่อย ๆ และโดยส่วนตัวมาจากพื้นหลัง C / C ++ / C # ฉันพบว่าการทำรังค่อนข้างสับสนน้อยกว่าการแยกไวยากรณ์ (เช่นทำอะไรบางอย่างที่นี่ใน "ถ้า" หรืออาจเป็น "elsif" แล้วทำกระโดดลงและทำอะไรบางอย่าง อื่นใน "แล้ว" ฉันเองค้นหาไวยากรณ์ที่อ่านง่ายขึ้นเพื่อให้มีเงื่อนไขทั้งหมดเข้าด้วยกันอาจไม่ถูกต้อง แต่เป็นแนวคิดที่เป็นที่ยอมรับมากขึ้นในโลกในแต่ละวันของฉัน
Wonko the Sane

2

วันนี้ฉันไม่รังเกียจที่จะใช้อะไรแบบนี้ แต่เพื่อให้แน่ใจว่าฉันใช้มันบ่อยเท่าที่ฉันใช้ซ้ำจนกระทั่ง

อย่างน้อยโค้ดก็จะดูดีขึ้นโดยไม่ต้องทำรังฟุ่มเฟือย ถึงแม้ว่าผมจะชอบที่จะElse If elifฉันต้องการแทนที่Thenด้วยDoและสุดท้ายกับ ElseOtherwise


พูดคุยกับผู้สร้างของหลามไม่ใช่ฉัน =]
Falmarri

โอ้ฉันคิดว่าคุณกำลังออกแบบภาษาใหม่ ฉันแค่แนะนำให้เปลี่ยนชื่อให้แม่นยำยิ่งขึ้นปล่อยให้เอลฟ์ถ้าคุณต้องการ แต่สุดท้ายก็ดูเหมือนว่ามันควรจะแตกต่างจากปกติ
Peter Turner

มันไม่ได้จำเป็นสำหรับภาษาใหม่ แต่ก็ไม่จำเป็นสำหรับงูใหญ่เช่นกัน เป็นแนวคิดใหม่สำหรับกฎไวยากรณ์โดยทั่วไป สามารถใช้กับภาษาใดก็ได้ที่มีผลข้างเคียงค่อนข้างน้อย
Falmarri

0

ดูเหมือนจะเป็นความคิดที่ยอดเยี่ยม อย่างไรก็ตามปัญหาเดียวที่ฉันจินตนาการคือคุณมีแนวโน้มที่จะเป็นโรคจิตมากกว่า เช่นการเขียน if / else ถ้าและการเรียก blah () ในนั้น เขียนพิเศษอื่นถ้าไม่ต้องการ blah เอา blah จากนั้นและเพิ่มลงใน ifs / elseifs ของคุณ จากนั้นเมื่อคุณหรือโปรแกรมเมอร์อื่นเพิ่มคำสั่งอื่นคุณอาจคาดว่า blah จะถูกเรียก แต่ไม่ใช่

หรือคุณสามารถมีหลายไอเอฟเอเขียน blah และลืมไอเอฟเอทั้งหมด แต่ต้องมีสิ่งนี้ซึ่งจะทำลายบางสิ่งบางอย่าง นอกจากนี้ยังมีโอกาสหากคุณต้องการให้พวกเขาติดตามทุกครั้งหากคุณวางไว้ใต้บล็อก if อาจตั้งค่าบูลเป็นอย่างอื่น (NoUpdate = true) และเพียงแค่เขียน if (! NoUpdate) {} โดยตรงภายใต้ซึ่งมีความชัดเจนและสามารถตั้งค่าโดยถ้า

ฉันแค่บอกว่ามันดูเหมือนว่าจะเป็นแมลงมากกว่าไม่ใช่ว่าฉันไม่ชอบความคิด ฉันไม่รังเกียจที่จะเห็นมันเป็นภาษา แต่ฉันไม่สามารถจินตนาการซิตตาเรียนใด ๆ ที่ฉันจะใช้ถ้าภาษาของฉันรองรับ


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 ก็ไม่จำเป็นเช่นกันมันสามารถตรวจสอบได้ถ้าข้อความ แต่มันซับซ้อน
Falmarri

0

ฉันพบว่าไวยากรณ์ของคุณสับสน แต่ฉันเห็นคุณค่าในแนวคิด แนวคิดเมื่อฉันพิจารณาปัญหาสิ่งที่ฉันพบว่าตัวเองต้องการคือ "unelse" ซึ่งโดยทั่วไปแล้วจะดำเนินการสิ่งต่าง ๆ ในกรณีที่คนสุดท้ายelseไม่ได้ยิง เมื่อมองจากมุมนั้นฉันอยากจะแนะนำว่าคน ๆ หนึ่งสามารถบรรลุผลที่คล้ายกันผ่าน:

  ทำ
  {
    ถ้า (เงื่อนไข 1)
      ... เนื้อหาสำหรับเงื่อนไข 1 เท่านั้น
    อื่นถ้า (เงื่อนไข 2)
      ... เนื้อหาสำหรับเงื่อนไข 2 เท่านั้น
    อื่น
    {
      ... สิ่งที่ไม่มีเงื่อนไข
      หยุดพัก;
    }
    ... สิ่งสำหรับทั้งสองเงื่อนไข
  } ในขณะที่ (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.