ระดับเริ่มต้น: ทำไมไม่มีการดำเนินการภายในคำสั่งเอาต์พุต


23

ฉันกำลังอ่านหนังสือแนะนำการเขียนโปรแกรมเบื้องต้นและจะแสดงตัวอย่างง่าย ๆ ใน pseudocode:

Start
  input myNumber
  set myAnswer = myNumber * 2
  output myAnswer
Stop

ทำไมเราไม่ละเว้นการสร้างตัวแปรอื่นที่เรียกว่าmyAnswerและเพียงแค่ใส่การดำเนินการลงในคำสั่งเอาต์พุตเช่นนี้:

Start
  input myNumber
  output myNumber * 2
Stop

ทำไมอดีตถึงถูกต้องและไม่หลัง


39
หนังสือเล่มนี้บอกว่าคุณทำไม่ได้เหรอ?
Tulains Córdova

2
หนังสือเล่มนี้ไม่ได้บอกว่าฉันทำไม่ได้ มันไม่ได้พูดอะไรเกี่ยวกับมัน
user1475207

5
ฉันคิดว่ามันค่อนข้างสมเหตุสมผลที่จะเริ่มต้นด้วยบล็อกที่สองที่สั้นกว่าจากนั้นแปลงเป็นบล็อกแรกหากคุณต้องการ
Mateen Ulhaq

13
คำตอบสั้น ๆ : คุณทำได้ผู้เขียนเพียงแค่ทำสิ่งนี้ (ในความพยายาม) เพื่อทำให้ชัดเจนยิ่งขึ้น (แม้ว่าจะเป็นความจริง แต่ก็อาจไม่ได้ทำให้ชัดเจนขึ้นเลย ... )
จูลส์

1
ทั้งสองวิธีทำงาน ด้วยประสบการณ์ที่มากขึ้นคุณจะพบว่าการอ่านโค้ดอย่างจริงจังนั้นมีความสำคัญมากกว่าความเรียบง่ายหรือความสามารถในการสร้างสรรค์ของโค้ด รหัสของคุณควรอ่านได้ง่ายโดยผู้อื่นหลายคนดูแลรักษา
Frantisek Kossuth

คำตอบ:


36

คุณสามารถทำได้ แต่อีกอันคือคุณเห็นว่าเกิดอะไรขึ้นและคุณสามารถใช้myAnswerในภายหลังในโปรแกรม หากคุณใช้อันที่สองคุณจะไม่สามารถนำมาใช้ซ้ำmyAnswerได้

ดังนั้นภายหลังในโปรแกรมที่คุณอาจต้องการ:

myAnswer + 5
myAnswer + 1
etc.

คุณอาจมีการดำเนินการต่าง ๆ ที่คุณต้องการใช้

พิจารณาการแลกเปลี่ยนตัวเลข:

Start
  input myNumber
  set myAnswerA = myNumber * 2
  output myAnswerA
  set myAnswerB = myNumber * 3
  output myAnswerB
  set temp = myAnswerA
  set myAnswerA = myAnswerB
  set myAnswerA = temp
  output myAnswerA
  output myAnswerB
Stop

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


1
ดังนั้นมันเป็นตรรกะที่ถูกต้อง แต่ไม่ใช่วิธีปฏิบัติที่ดีที่สุดเพราะมันไม่อนุญาตให้ฉันนำการดำเนินการไปใช้ในส่วนอื่น ๆ ของโปรแกรมได้หรือไม่
user1475207

@ user1475207 ดูการแก้ไขของฉัน ในโปรแกรมเล็ก ๆ นี้มันไม่สำคัญ ผู้เขียนรู้ว่าคุณจะทำอะไรได้มากกว่าการส่งออกค่าในภายหลัง มีเพียงความซับซ้อนที่คุณจะได้เห็น ติดกับมัน.
johnny

อ่าฉันเข้าใจแล้ว ฉันจะอ่านหนังสือต่อไปโดยคำนึงถึงสิ่งนี้ ขอบคุณ
user1475207

29
@ user1475207 ทั้งสองมีสถานที่ของพวกเขา บางครั้งคุณอาจต้องใช้ตัวแปรพิเศษ บางครั้งคุณอาจไม่ต้องการตัวแปรเพิ่มเติม แต่ต้องการใช้มันเพราะในบางสถานการณ์เพียงแค่ให้ชื่อที่คิดมาอย่างดีทำให้มันชัดเจนยิ่งขึ้น บางครั้งคุณไม่ต้องการใช้ตัวแปรพิเศษเพราะมันเป็นแค่สัญญาณรบกวน และหลายครั้งความแตกต่างก็ไม่สำคัญ
8bittree

3
ฉันคิดว่ามันถูกต้องที่จะส่งคืนผลลัพธ์ของการดำเนินการโดยไม่ต้องกำหนดให้กับตัวแปรล่วงหน้า แต่ฉันเอานิสัยเพื่อสร้างresultตัวแปรแม้แต่สำหรับฟังก์ชั่นระยะสั้นดังนั้นการดีบักโดยการเพิ่มprint(result)นั้นเร็วมาก มันสะดวกกว่าการฝึกฝนที่ดี
ขาขวา

33

อีกเหตุผลหนึ่งที่ได้รับมอบหมายset myAnswer = myNumber * 2ให้เป็นค่าที่ส่งผลให้ชื่อ myNumber * 2คนอ่านรุ่นสองบรรทัดของรหัสของคุณเท่านั้นที่รู้ว่ามันพิมพ์ออกค่าของ คนอ่านรุ่นสามบรรทัดจะเห็นว่าmyNumber * 2เป็นคำตอบ

มันอาจดูเหมือนไม่สำคัญในการดังกล่าวเป็นตัวอย่างเล็ก ๆ น้อย ๆ แต่บางครั้งการกำหนดค่าผลให้กับตัวแปรที่มีชื่อที่มีความหมายสามารถทำให้มันมากได้ง่ายขึ้นสำหรับการเขียนโปรแกรมอื่น ๆ ที่จะอ่านและทำความเข้าใจรหัสของคุณ


10
+1 แม้ว่านี้เพียงใช้เมื่อชื่อมีความหมาย ใช้ vars ชั่วคราวเช่นนี้ชื่อi, resultหรือบางตัวระบุความหมายอื่น ๆ ไม่มีอะไรที่จะปรับปรุงความชัดเจนและมีเพียง clutters รหัส
อเล็กซานเด - คืนสิทธิ์ให้กับโมนิกา

7
@Alexander: ชื่อที่ไม่มีความหมายยังคงมีความหมาย iควรเป็นดัชนีอาเรย์ ถ้ามีresult, ฟังก์ชั่นควรจะจบด้วยreturn resultหรือเทียบเท่าทางศีลธรรม และอื่น ๆ ...
Kevin

6
@Kevin "ชื่อที่ไม่มีความหมายยังมีความหมาย" uhhh ... คุณแน่ใจเหรอ? lol
Alexander - Reinstate Monica

3
@Kevin หากคุณกำลังจะไปreturn resultคุณอาจเพียงแค่อินไลน์เพื่อส่งคืนสิ่งที่คุณกำหนดให้ผลลัพธ์ เราสามารถเห็นผลลัพธ์ได้ คุณกลับมาเราได้รับมัน
Alexander - Reinstate Monica

5
@ อเล็กซานเดอร์: เห็นได้ชัดว่าคุณสามารถอินไลน์ผลตอบแทนถ้ามันเป็นเรื่องง่าย แต่ถ้าคุณต้องการที่จะสร้างมันขึ้นมาในหลายงบ? การใช้รูปแบบการตั้งชื่อที่สอดคล้องทำให้ชัดเจนว่าคุณกำลังทำอะไรในกรณีเหล่านี้
Kevin

14

นั่นคือ pseudocode มันไม่ได้แปลกที่จะเป็นภาษาที่นำไปใช้โดยเฉพาะ

ภาษาการเขียนโปรแกรมบางภาษาไม่สนับสนุนการประเมินผลการแสดงออกแล้ว outoputting ผลลัพธ์ในบรรทัดของรหัสเดียวกัน ตัวอย่างเช่นแอสเซมเบลอร์ส่วนใหญ่ไม่สนับสนุนสิ่งนั้น บางทีผู้แต่งหนังสืออยากจะแสดงสิ่งต่าง ๆ ในระดับต่ำ


2
และบางภาษา (เช่น C) อนุญาตทั้งสองอย่างในเวลาเดียวกัน - คุณสามารถเขียนสิ่งต่าง ๆ เช่น "เอาท์พุท (answer = answer * 2)" ถ้าคุณต้องการ! (แต่ระวังมากกว่า "output (answer == answer * 2))" หมายถึงบางสิ่งที่แตกต่างออกไป ...
alephzero

9

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

คุณกำลังเรียนภาษา

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

ในภาษาใด ๆ ก็ตามที่มีประโยชน์มีมากกว่าหนึ่งวิธีในการแสดงความคิดเห็นเกือบทุกอย่างที่แสดงในภาษานั้น


พิจารณาความแตกต่างของความแตกต่างที่มีอยู่ในภาษาอังกฤษ แม้แต่ประโยคง่าย ๆ เช่น

แมวกระโดดขึ้นไปบนกล่อง

สามารถเปลี่ยนแปลงเพื่อแสดงความคิดเห็นที่แตกต่างกันเล็กน้อยหรือให้ความสำคัญกับส่วนต่าง ๆ ของฉากในขณะที่พูดถึงการกระทำของเอกภพทางกายภาพที่แน่นอน

ประการแรกคือรูปแบบทางไวยากรณ์:

กล่องถูกกระโดดโดยแมว

บนกล่องกระโดดแมว

จากนั้นจะเป็นรูปแบบที่กว้างขึ้นและกว้างขึ้นซึ่งยังคงหมายถึงการกระทำทางกายภาพเดียวกัน:

กล่องสั่นสะเทือนภายใต้ผลกระทบของแมว

แมวลงมาพร้อมกับเสียงฟ้าร้องที่ด้านบนของกล่อง

แมวกระโดดขึ้นไปในอากาศเบา ๆ และตกลงบนกล่องใกล้ ๆ

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


มีเสมอมากกว่าหนึ่งวิธีที่จะทำมันหลามเซนไปในทางตรงกันข้าม


แน่นอนว่าจะมีวิธีหนึ่งที่แสดงความตั้งใจของคุณได้อย่างสมบูรณ์แบบและเหมาะสมที่สุดเช่นเดียวกับที่คุณเลือกประโยคภาษาอังกฤษหนึ่งประโยคข้างต้นขึ้นอยู่กับสิ่งที่คุณต้องการสื่อสาร นั่นคือความหมายของ Zen of Python

แต่ในหลักสูตรการเขียนโปรแกรมเบื้องต้นหรือหลักสูตรภาษาอังกฤษเบื้องต้นคุณต้องเรียนรู้วิธีการต่างๆ (คำศัพท์โค้ดตัวอย่าง) ที่คุณสามารถคาดเดาความคิดก่อนที่คุณจะพัฒนาวิจารณญาณในการเลือกที่เหมาะสมที่สุด


3
แน่นอน Python ทำลายกฎของมันเอง คุณมี lambdas และฟังก์ชันซ้อนกัน; ลูป, รายการความเข้าใจและนิพจน์ตัวสร้าง; ลอยทศนิยมและเศษส่วน และ__init__และ__new__เพียงเพื่อชื่อไม่กี่ ประเด็นคือแต่ละคนเหมาะสมกับปัญหาที่แตกต่างกันอย่างละเอียด คุณจะไม่เลือกประโยคภาษาอังกฤษอย่างใดอย่างหนึ่งโดยการสุ่มและคุณจะไม่เลือกคุณลักษณะภาษา Python อย่างใดอย่างหนึ่ง
Kevin

1
@ เควินใช่เห็นด้วย ประเด็นก็คือสำหรับคนใหม่ทั้งหมดในการเขียนโปรแกรมความถูกต้องของไวยากรณ์ที่ใช้สามารถทำให้ดูเหมือนว่ามีเพียงวิธีเดียวที่สามารถทำได้ - คือการคัดลอกรหัสที่แน่นอนจากคำต่อคำกวดวิชาคล้ายกับปัญหาคณิตศาสตร์ของโรงเรียนมัธยม (573 x 247) มีคำตอบเดียวเท่านั้น ดูเพิ่มเติมคำถามเช่น "คืออะไรโปรแกรมจะหดตัวลงไฟล์?" ถ้าคุณอ่านคำตอบของฉันฉันไม่ได้บอกว่าจะทำอะไรแบบสุ่ม ฉันกำลังบอกว่าคุณกำลังเลือกอยู่เสมอเมื่อคุณเขียนโปรแกรม
Wildcard

1
นั่นยุติธรรมอย่างแน่นอน ฉันคิดว่าปัญหาคือคุณกำลังทำให้ง่ายขึ้น / เข้าใจผิดเซนของ Python เพียงเล็กน้อย ประเด็นทั้งหมดคือในที่สุดการตัดสินใจเหล่านั้นถูกกำหนดโดยรูปทรงของปัญหาของคุณและไม่ใช่ทางเลือกที่คุณสามารถทำได้อย่างอิสระ คุณอาจจะต้องไปผ่านมากของการทำซ้ำและ refactoring เพื่อหาหนึ่งวิธีที่จะทำมันได้วิธีหนึ่งที่ดีที่สุดที่เหมาะกับความต้องการของคุณสามารถอ่านได้กระชับ, สง่างามแม้กระทั่ง แต่สำหรับปัญหาใดก็ตามควรมีวิธีแก้ปัญหาที่เหมาะสมที่สุดและภาษาที่ได้รับการออกแบบมาอย่างดีจะนำคุณเข้าหามันอย่างอ่อนโยน นั่นคือความหมายของ Zen
Kevin

4
ถากถางอาจจะบอกว่า 'ในหลามมีเพียงหนึ่งวิธีที่จะทำ แต่ทุกรุ่นใหม่ของงูใหญ่นำไปใช้ 'และตอนนี้สำหรับสิ่งที่แตกต่างอย่างสิ้นเชิง' ฟังก์ชั่นวิธีการที่รุ่นก่อนหน้านี้ไม่ได้';)
alephzero

3
อ้างจาก PEP20: "ควรมีอย่างใดอย่างหนึ่ง - และดีกว่าเพียงคนเดียว - วิธีที่ชัดเจนที่จะทำแม้ว่าวิธีนั้นอาจจะไม่ชัดเจนในตอนแรกเว้นแต่ว่าคุณเป็นชาวดัตช์"
vaxquis

5

คุณกำลังถามเกี่ยวกับmyAnswerตัวแปรที่ดูเหมือนจะซ้ำซ้อนเท่านั้น คำตอบอื่น ๆ ได้อธิบายถึงสาเหตุและเมื่อมันเหมาะสมที่จะละเว้นหรือใช้มัน แต่นี่เป็นอีกหนึ่ง: วิธีการเกี่ยวกับเรื่องนี้?

Start
  output input * 2
Stop

หรือว่า

Start output input * 2 Stop

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


2
... (*2)หรือแม้เพียงแค่ ฉันจะคัดค้านว่าการแสดงอินพุตไม่สามารถแสดงอย่างปลอดภัยได้เพียงแค่เข้าถึงตัวแปร / ดำเนินการทางคณิตศาสตร์: มันสามารถมีผลข้างเคียงที่สังเกตได้
leftaroundabout

2

คุณสามารถทำทั้งสองรูปแบบ (ในกรณีง่าย ๆ นี้) แต่ตัวแปรแรกจะอ่านได้ง่ายขึ้นและมีโครงสร้างสำหรับกรณีที่ซับซ้อนมากขึ้น ตัวแปรแรกแสดงโมเดล IPO ที่มีหนึ่งบรรทัดสำหรับแต่ละขั้นตอน (สองรายการที่มีชื่อถูกต้องแล้ว):

Start
  input myNumber                       // Input
  set myAnswer = myNumber * 2          // Process
  output myAnswer                      // Output
Stop
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.