คำถามติดแท็ก iterator

4
ทำไมตัววนซ้ำใน Python จึงทำให้เกิดข้อยกเว้น?
นี่คือไวยากรณ์สำหรับตัววนซ้ำใน Java (ค่อนข้างคล้ายไวยากรณ์ใน C #): Iterator it = sequence.iterator(); while (it.hasNext()) { System.out.println(it.next()); } ซึ่งทำให้รู้สึก นี่คือไวยากรณ์ที่เทียบเท่าใน Python: it = iter(sequence) while True: try: value = it.next() except StopIteration: break print(value) ฉันคิดว่ามีการใช้ข้อยกเว้นในกรณีพิเศษเท่านั้น ทำไมไพ ธ อนใช้ข้อยกเว้นเพื่อหยุดย้ำ?

6
ทำไมไพ ธ อนจึงทำสำเนาองค์ประกอบเฉพาะเมื่อทำซ้ำรายการ?
ฉันเพิ่งรู้ว่าในงูใหญ่ถ้ามีคนเขียน for i in a: i += 1 องค์ประกอบของรายการเดิมaจริงจะไม่ได้ส่งผลกระทบต่อที่ทุกคนตั้งแต่ตัวแปรจะออกมาเพียงแค่เป็นสำเนาขององค์ประกอบเดิมในia ในการปรับเปลี่ยนองค์ประกอบดั้งเดิม for index, i in enumerate(a): a[index] += 1 จะต้อง ฉันรู้สึกประหลาดใจจริงๆกับพฤติกรรมนี้ ดูเหมือนว่าจะเป็นแบบที่ใช้ง่ายมากดูเหมือนจะแตกต่างจากภาษาอื่นและทำให้เกิดข้อผิดพลาดในรหัสของฉันที่ฉันต้องแก้ไขในขณะนี้ ฉันเคยอ่าน Python Tutorial มาก่อน เพียงเพื่อให้แน่ใจว่าฉันตรวจสอบหนังสืออีกครั้งในขณะนี้และมันไม่ได้พูดถึงพฤติกรรมนี้เลย เหตุผลที่อยู่เบื้องหลังการออกแบบนี้คืออะไร? เป็นที่คาดหวังหรือไม่ว่าเป็นแบบฝึกหัดมาตรฐานในหลายภาษาเพื่อที่ผู้สอนจะเชื่อว่าผู้อ่านควรได้รับมันอย่างเป็นธรรมชาติหรือไม่? ในภาษาอื่นมีพฤติกรรมแบบเดียวกันในการทำซ้ำที่ฉันควรให้ความสนใจในอนาคตหรือไม่
31 python  list  iterator 

6
รูปแบบตัววนซ้ำ - ทำไมจึงเป็นเรื่องสำคัญที่จะไม่เปิดเผยการเป็นตัวแทนภายใน
ฉันอ่านC # ออกแบบ Essentials ฉันกำลังอ่านเกี่ยวกับรูปแบบตัววนซ้ำ ฉันเข้าใจวิธีการนำไปใช้อย่างสมบูรณ์ แต่ฉันไม่เข้าใจความสำคัญหรือดูกรณีการใช้งาน ในหนังสือจะมีตัวอย่างให้ในกรณีที่มีคนต้องการได้รับรายชื่อของวัตถุ พวกเขาจะได้ทำเช่นนี้โดยการเปิดเผยทรัพย์สินของประชาชนเช่นหรือIList<T>Array หนังสือเล่มนี้เขียน ปัญหาเกี่ยวกับเรื่องนี้คือการเป็นตัวแทนภายในในทั้งสองชั้นเรียนเหล่านี้ได้สัมผัสกับโครงการภายนอก การเป็นตัวแทนภายในคืออะไร? ความจริงมันเป็นarrayหรือIList<T>? ฉันไม่เข้าใจจริงๆว่าทำไมสิ่งนี้เป็นสิ่งที่ไม่ดีสำหรับผู้บริโภค (โปรแกรมเมอร์ที่เรียกสิ่งนี้) รู้ ... หนังสือบอกว่ารูปแบบนี้ใช้งานได้โดยเปิดเผยGetEnumeratorฟังก์ชั่นของมันเพื่อให้เราสามารถเรียกGetEnumerator()และเปิดเผย 'รายการ' ด้วยวิธีนี้ ฉันคิดว่ารูปแบบนี้มีสถานที่ (เหมือนทั้งหมด) ในบางสถานการณ์ แต่ฉันไม่เห็นว่าที่ไหนและเมื่อไหร่

1
การทดสอบหน่วย: การยืนยันที่ถูกเลื่อนออกไปด้วย Linq
ตกลงหรือไม่ที่จะเพิ่มการยืนยันที่ถูกเลื่อนออกไปเช่นนี้ var actualKittens = actualKittens.Select(kitten => { Assert.IsСute(kitten); return kitten }); ทำไม? ดังนั้นฉันสามารถทำซ้ำได้เพียงครั้งเดียวแม้จะมีข้อความที่คาดว่าจะเกิดการรวบรวมที่เป็นรูปธรรมเช่น: CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList()); และมันอาจจะไม่ใช่แค่เลือก แต่เป็นวิธีที่กำหนดตัววนซ้ำและมีการตรวจสอบและตรรกะจำนวนมาก (เช่นการนับและการกรอง) สิ่งที่สงสัยคือความซับซ้อนของการอ่านและการดีบักรหัสดังกล่าวในกรณีที่การทดสอบล้มเหลว

1
ฟังก์ชั่นเครื่องกำเนิดไฟฟ้านั้นใช้งานได้ในการเขียนโปรแกรมการทำงานหรือไม่
คำถามคือ: เครื่องปั่นไฟทำลายกระบวนทัศน์การเขียนโปรแกรมการทำงานหรือไม่? ทำไมหรือทำไมไม่? ถ้าใช่สามารถใช้เครื่องกำเนิดไฟฟ้าในการเขียนโปรแกรมเชิงหน้าที่ได้อย่างไร พิจารณาสิ่งต่อไปนี้: function * downCounter(maxValue) { yield maxValue; yield * downCounter(maxValue > 0 ? maxValue - 1 : 0); } let counter = downCounter(26); counter.next().value; // 26 counter.next().value; // 25 // ...etc downCounterวิธีการปรากฏไร้สัญชาติ เช่นกันการโทรdownCounterด้วยอินพุตเดียวกันก็จะส่งผลให้ออกเหมือนกัน อย่างไรก็ตามในเวลาเดียวกันการโทรnext()ไม่ได้ผลลัพธ์ที่สอดคล้องกัน ฉันไม่แน่ใจหรือไม่ว่าเครื่องปั่นไฟทำลายกระบวนทัศน์การเขียนโปรแกรมการทำงานเพราะในตัวอย่างนี้counterเป็นวัตถุกำเนิดไฟฟ้าและอื่น ๆ โทรจะก่อให้เกิดผลเช่นเดียวกับวัตถุกำเนิดอื่นที่สร้างขึ้นด้วยเดียวกันแน่นอนnext()maxValue เช่นกันการเรียกsomeCollection[3]ใช้อาร์เรย์จะส่งคืนองค์ประกอบที่สี่เสมอ ในทำนองเดียวกันการเรียกnext()สี่ครั้งบนวัตถุตัวสร้างจะส่งคืนองค์ประกอบที่สี่เสมอ สำหรับบริบทเพิ่มเติมคำถามเหล่านี้เพิ่มขึ้นในขณะที่ทำงานในการเขียนโปรแกรมกะตะ บุคคลที่ตอบคำถามตั้งคำถามว่าเครื่องปั่นไฟสามารถใช้ในการเขียนโปรแกรมการทำงานหรือไม่และพวกเขายังคงอยู่ในสถานะ

4
ตัววนซ้ำมีสัญญาโดยนัยแบบไม่ทำลายหรือไม่?
สมมติว่าฉันกำลังออกแบบโครงสร้างข้อมูลที่กำหนดเองเช่นสแต็กหรือคิว (ตัวอย่างเช่น - อาจเป็นคอลเลกชันที่สั่งโดยพลการอื่น ๆ ที่มีตรรกะเทียบเท่าpushและpopวิธีการ - นั่นคือวิธีการเข้าถึงแบบทำลายล้าง) หากคุณกำลังใช้ตัววนซ้ำ (ใน. NET โดยเฉพาะIEnumerable<T>) กับคอลเล็กชันนี้ที่ปรากฏในแต่ละการวนซ้ำนั่นจะเป็นการผิดIEnumerable<T>สัญญาโดยนัยหรือไม่? ไม่IEnumerable<T>ได้มีการทำสัญญานี้โดยนัย? เช่น: public IEnumerator<T> GetEnumerator() { if (this.list.Count > 0) yield return this.Pop(); else yield break; }

4
C ++ Iterator ทำไมไม่มีคลาสพื้นฐานของ Iterator ตัววนซ้ำทั้งหมดที่สืบทอดมา
ฉันกำลังเรียนเพื่อสอบและฉันมีคำถามที่ฉันต้องดิ้นรนเพื่อให้และตอบคำถาม ทำไมคลาสพื้นฐานของตัววนซ้ำไม่มีอยู่ตัววนซ้ำอื่น ๆ ทั้งหมดจึงสืบทอดมา? ฉันเดาว่าครูของฉันกำลังอ้างถึงโครงสร้างลำดับชั้นจากการอ้างอิง cpp " http://prntscr.com/mgj542 " และเราต้องให้เหตุผลอื่นนอกเหนือจากเหตุผลที่ควรทำ ฉันรู้ว่าตัววนซ้ำคืออะไรและใช้ในการทำงานกับคอนเทนเนอร์ จากสิ่งที่ฉันเข้าใจเนื่องจากโครงสร้างข้อมูลพื้นฐานที่เป็นไปได้ที่แตกต่างกันคอนเทนเนอร์ที่แตกต่างกันมีตัววนซ้ำที่แตกต่างกันเนื่องจากคุณสามารถสุ่มเลือกอาเรย์ได้ แต่ไม่ใช่รายการที่เชื่อมโยงและคอนเทนเนอร์ที่แตกต่างกัน พวกเขาอาจเป็นแม่แบบพิเศษขึ้นอยู่กับคอนเทนเนอร์ใช่ไหม?
11 c++  iterator 

2
อะไรที่ทำให้ Iterator เป็นรูปแบบการออกแบบ?
ฉันสงสัยว่ามันคืออะไรที่ทำให้ Iterator เป็นพิเศษเมื่อเทียบกับสิ่งก่อสร้างที่คล้ายกันอื่น ๆ และทำให้Gang of Fourแสดงว่าเป็นรูปแบบการออกแบบ Iterator ขึ้นอยู่กับความแตกต่าง (ลำดับชั้นของคอลเลกชันที่มีอินเตอร์เฟซทั่วไป) และการแยกข้อกังวล (การวนซ้ำในการรวบรวมควรเป็นอิสระจากวิธีการจัดโครงสร้างข้อมูล) แต่จะเกิดอะไรขึ้นถ้าเราแทนที่ลำดับชั้นของคอลเลกชันด้วยเช่นลำดับชั้นของวัตถุทางคณิตศาสตร์ (จำนวนเต็ม, ลอย, ซับซ้อน, เมทริกซ์ ฯลฯ ) และตัววนซ้ำโดยคลาสที่แสดงถึงการดำเนินการบางอย่างที่เกี่ยวข้องกับวัตถุเหล่านี้ แผนภาพคลาสจะเหมือนกัน เราอาจพบตัวอย่างที่คล้ายกันอื่น ๆ อีกมากมายเช่น Writer, Painter, Encoder และคนที่ดีกว่าซึ่งทำงานในลักษณะเดียวกัน อย่างไรก็ตามฉันไม่เคยได้ยินชื่อเหล่านี้เรียกว่ารูปแบบการออกแบบ แล้วอะไรที่ทำให้ Iterator มีความพิเศษ? ความจริงที่ว่ามันซับซ้อนกว่าเพราะต้องมีสถานะที่ไม่แน่นอนในการจัดเก็บตำแหน่งปัจจุบันภายในคอลเลกชันหรือไม่? แต่แล้วรัฐที่ไม่แน่นอนมักจะไม่ได้รับการพิจารณาว่าเป็นที่น่าพอใจ เพื่อชี้แจงประเด็นของฉันให้ฉันยกตัวอย่างรายละเอียดเพิ่มเติม นี่คือปัญหาการออกแบบของเรา: สมมติว่าเรามีลำดับชั้นของชั้นเรียนและการดำเนินการที่กำหนดไว้ในวัตถุของชั้นเรียนเหล่านี้ อินเทอร์เฟซของการดำเนินการนี้จะเหมือนกันสำหรับแต่ละคลาส แต่การใช้งานอาจแตกต่างกันโดยสิ้นเชิง นอกจากนี้ยังสันนิษฐานว่ามันสมเหตุสมผลที่จะใช้การดำเนินการหลายครั้งบนวัตถุเดียวกันพูดด้วยพารามิเตอร์ที่แตกต่างกัน นี่คือทางออกที่สมเหตุสมผลสำหรับปัญหาการออกแบบของเรา (ในทางปฏิบัติทั่วไปของรูปแบบตัววนซ้ำ): สำหรับการแยกความกังวลการใช้งานของการดำเนินการไม่ควรเพิ่มเป็นฟังก์ชั่นไปยังลำดับชั้นของระดับเดิม (วัตถุตัวถูกดำเนินการ) เนื่องจากเราต้องการที่จะใช้การดำเนินการหลายครั้งในตัวถูกดำเนินการเดียวกันมันควรจะเป็นตัวแทนของวัตถุที่มีการอ้างอิงถึงตัวถูกดำเนินการไม่เพียงแค่ฟังก์ชั่น ดังนั้นวัตถุตัวถูกดำเนินการควรให้ฟังก์ชั่นที่ส่งกลับวัตถุที่เป็นตัวแทนของการดำเนินการ วัตถุนี้มีฟังก์ชั่นที่ดำเนินการตามจริง ตัวอย่าง: มีชั้นฐานหรืออินเตอร์เฟซที่เป็นMathObject(ชื่อโง่ฉันรู้ว่าอาจจะมีคนที่มีความคิดที่ดี.) กับการเรียนมาและMyInteger …

1
ทำไม Iterator ของ Java และ ListIterator ชี้ไปที่องค์ประกอบต่าง ๆ
Javadoc สำหรับ ListIteratorพูดว่า: A ListIteratorไม่มีองค์ประกอบปัจจุบัน ตำแหน่งเคอร์เซอร์เสมออยู่ระหว่างองค์ประกอบที่จะถูกส่งกลับโดยเรียกร้องให้และองค์ประกอบที่จะถูกส่งกลับโดยเรียกร้องให้previous()next() เหตุใด Java จึงถูกListIteratorนำไปใช้เพื่อชี้ให้เห็นองค์ประกอบระหว่างองค์ประกอบแทนที่จะเป็นองค์ประกอบปัจจุบัน มันดูเหมือนว่านี้จะทำให้รหัสลูกค้าสามารถอ่านได้น้อยลงเมื่อจะมีการเรียกซ้ำ ๆgetNext(), getPrevious()ดังนั้นผมถือว่าต้องมีเหตุผลที่ดีสำหรับการเลือก ตามบันทึกข้างฉันเพียงแค่เขียนห้องสมุดเล็ก ๆ ที่เรียก peekable-arraylistที่ขยายArrayList, IteratorและListIteratorที่ให้peekAtNext()และpeekAtPrevious()วิธีการดำเนินการที่ชอบ: @Override public synchronized T peekAtNext() { T t = next(); previous(); return t; }
9 java  iterator 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.