Jose: สวัสดีและยินดีต้อนรับกลับมา
ในวิดีโอนี้ เรากำลังดู iterables ใน Python
ในวิดีโอที่แล้ว เราดูที่ตัววนซ้ำ
แล้วอะไรที่ทำซ้ำได้
iterable คืออ็อบเจ็กต์ที่มีเมธอด
__iter__() หรือเมธอด __iter__()
เลยได้อะไรประมาณนี้
เมื่อคุณกำหนดเมธอดนี้ในอ็อบเจกต์ใดๆ ก็ตาม
ตอนนี้มันเป็นแบบวนซ้ำได้
ลองนิยามบางสิ่งที่นี่
มากำหนด FirstHundredIterable กัน
FirstHundredIterable นี้กำลังจะกำหนดวิธีการ
__iter__() หรือ __iter() นี้ และเมธอด __iter__() นี้จะบอก
Python ว่าคุณต้องการให้สามารถวนซ้ำผ่าน iterable
ได้ เช่น ใน for loop หรือคุณต้องการทำ บางส่วนหรือคุณต้องการเปลี่ยนเป็นรายการ
มันต้องคืนอะไร?
มันต้องส่งคืนตัววนซ้ำ
ดังนั้นให้ส่งคืน FirstHundredGenerator()
ตอนนี้คุณสามารถทำอะไรบางอย่างเช่นพิมพ์ผลรวมของ
FirstHundredIterable และมันจะชอบมันและมันจะบอกคุณ
4950
คุณยังสามารถวนซ้ำโดยใช้
for loop และมันจะใช้ได้
มันจะให้ตัวเลขทั้งหมดแก่คุณด้วย
นั่นคือสิ่งที่ทำให้การวนซ้ำได้
ไม่มีอะไรวิเศษ ไม่ต้องทำอะไรเลย
สำหรับ Python เพื่อให้เป็น iterable ได้ สิ่งที่คุณต้องทำคือกำหนดเมธอดนี้
และวิธีการนั้นต้องคืนค่าบางอย่างที่คุณสามารถเรียกใช้ __next__() ได้
มันต้องส่งคืนตัววนซ้ำ
เครื่องกำเนิดไฟฟ้าทั้งหมดเป็นตัววนซ้ำ
ดังนั้นแน่นอนว่าเครื่องนี้สามารถเป็นตัวสร้างได้
ตอนนี้ ถ้าคุณต้องการทำให้สิ่งนี้ง่ายขึ้นเล็กน้อย
ซึ่งคุณสามารถทำได้
แทนที่จะให้คลาสแยกส่งคืน FirstHundredIterator
คุณสามารถถามตัวเองว่า ...
มีเมธอด __iter__()
ที่ส่งคืนอ็อบเจ็กต์ประเภทนี้
FirstHundredGenerator() คืออะไรในบริบทของคลาสนี้
นี่เป็นคำถามที่คลุมเครือสวย แต่ฉันจะบอกว่ามันเป็นตัวเอง
ตัวเองเป็นวัตถุปัจจุบันเสมอ
และสิ่งที่คุณทำที่นี่คือการส่งคืนวัตถุ
ดังนั้นคุณทำได้แน่นอน
ตอนนี้คุณไม่ต้องการ FirstHundredIterable อีกต่อไปแล้ว
และคุณสามารถส่งคืน FirstHundredGenerator() ได้ที่นี่ และมันจะยังคงเหมือนเดิมในตอนนี้
ตอนนี้ตัวสร้างของคุณสับสนขึ้นเล็กน้อยเพราะเป็นทั้งตัววนซ้ำและตัววนซ้ำได้
และนั่นอาจทำให้สับสนได้ในบางกรณี แต่อาจมีประโยชน์สำหรับตัวอื่นๆ เพราะมันสั้นกว่าการมีคลาสแยกต่างหากเพื่อทำสิ่งนั้นให้คุณ
อีกครั้ง iterable ส่งคืนตัววนซ้ำโดยใช้เมธอด
__iter__() นี้
ดังนั้น คุณสามารถทำได้จากตัววนซ้ำเองเช่นกัน
เนื่องจาก self เป็นตัววนซ้ำเสมอ เพราะ self เป็นวัตถุที่มีเมธอด
dunder __next__() นี้
ดังนั้นฉันจึงกล่าวถึงก่อนหน้านี้ในหลักสูตรบางอย่างเกี่ยวกับ
for loops และวิธีที่เราต้องการวัตถุที่มี dunder __len__()
และ dunder __getitem__() กำหนดไว้
แล้วมันเกี่ยวกับอะไร?
มานิยาม iterable อื่นกันเถอะ
และมันจะมี __len__(), len(self.php)
รถยนต์) และฉันจะเริ่มต้นรถยนต์บนนี้
สมมุติว่าเรามีความเป็นตัวของตัวเอง รถยนต์มีค่าเท่ากับรายการสององค์ประกอบนี้
จากนั้นเรากำหนดเมธอด dunder __len__() ซึ่งจะคืนค่าความยาวของรายการ และเรายังกำหนดเมธอด
__getitem__() ซึ่งรับดัชนีที่เราต้องการดึงข้อมูล และเพิ่งส่งคืน ตัวเอง.
รถยนต์[i].
ก่อนหน้านี้ในหลักสูตร เราดูสิ่งนี้แล้วและผมบอกว่าเมื่อคุณมีวัตถุที่มีลักษณะเช่นนี้ที่มี
__len__() และเมธอด __getitem__() คุณสามารถใช้
for วนซ้ำได้
และแน่นอน ถ้าเราทำสำหรับรถยนต์ใน AnotherIterable()
คุณจะเห็นว่าสิ่งนี้พิมพ์รถ Fiesta และ Focus
ดังนั้นนี่คือ iterable ด้วยหรือไม่?
ไม่มีเมธอด __iter__()
มันไม่ส่งคืนเครื่องกำเนิดใด ๆ
และคำตอบก็คือใช่
ใน Python คุณสามารถกำหนด iterables ของคุณด้วยวิธี
__iter__() ที่ส่งคืน iterable หรือคุณสามารถมีวัตถุที่มีความยาวและ
getitem
ทั้งสองนี้เป็น iterables และคุณสามารถใช้สำหรับลูปได้ คุณสามารถใช้
__sum__() คุณสามารถใช้ __len__() ในพวกมัน ...
ขออภัย ไม่ใช่ __len__() คุณสามารถใช้ __list__() ได้
ดังนั้นทั้งสองสิ่งนี้จึงทำซ้ำได้
ตอนนี้ โอเค?
และตอนนี้ เราได้เรียนรู้เล็กน้อยเกี่ยวกับ
iterables ว่า iterables แตกต่างจาก iterator
อย่างไร แต่ปกติแล้วพวกมันจะทำงานร่วมกันแบบจับมือกัน
ตัววนซ้ำจะใช้เพื่อรับค่าถัดไป และตัววนซ้ำจะใช้เพื่อดูค่าทั้งหมดของตัววนซ้ำ
ดังนั้นการจัดเรียงแบบ iterator ช่วยให้คุณดำเนินการได้ทีละขั้น
ในกรณีที่คุณต้องการทำเช่นนั้น โดยการเรียก __next__()
และ iterable จะช่วยให้คุณดูองค์ประกอบทั้งหมดได้
เท่านี้ก็เรียบร้อยสำหรับวิดีโอนี้
หากไม่สมเหตุสมผลและคุณสงสัยว่า "ทำไมฉันถึงต้องการสิ่งนี้
"
ไม่ต้องกังวล.
ในอีกไม่กี่ตอน คุณจะแบบ "โอ้
พระเจ้า นี่มันสมเหตุสมผลมาก" เมื่อเราเรียนรู้เกี่ยวกับ
Python แบบอะซิงโครนัส
เพียงแค่ให้คำแนะนำไม่กี่ที่นี่
และเมื่อคุณต้องการใช้หรือดูรายการที่ยาวกว่านั้นเล็กน้อย
คุณสามารถใช้ตัวสร้างเพื่อทำเช่นนั้นได้
ตอนนี้ ให้ฉันบอกด้วยว่าตอนนี้เราอยู่ที่นี่แล้ว
แทนที่จะมี my_numbers = [x สำหรับ x ใน [1,
2, 3, 4, 5]] ตัวอย่างเช่น นี่คือการทำความเข้าใจรายการ
my_numbers_gen() คุณสามารถทำความเข้าใจตัวสร้างได้
อินสแตนซ์นี้ไม่มีประโยชน์มากนัก แต่ตอนนี้ก็เป็นวัตถุตัวสร้างเช่นกัน
ซึ่งเป็นเพียงชวเลขสำหรับการวนซ้ำลำดับ
คุณสามารถทำต่อไป (my_numbers_gen)
คุณสามารถพิมพ์ออกมา
ดังนั้น ความเข้าใจในเครื่องมือสร้าง
เป็นสิ่งที่นิยมทำเช่นกัน และไม่ได้พิมพ์ออกมาที่นั่น
เลยอยากจะพูดถึงว่า
นี่ไม่ใช่ความเข้าใจทูเพิล นี่คือความเข้าใจของเครื่องกำเนิด
และเราสามารถใช้มันเพื่อสร้างอ็อบเจ็กต์ตัวสร้างได้ทันที
ให้เราเรียก __next__() ในไวยากรณ์นี้ด้วย
อีกครั้งที่ทำได้คือดูรายการนี้และให้แต่ละหมายเลขเมื่อคุณโทร
__next__()
ดังนั้นจึงไม่คัดลอกรายการทั้งหมด ซึ่งไม่คัดลอก
นี่เป็นการคัดลอกรายการและมอบสำเนาให้คุณอีกชุดหนึ่ง
ให้คุณดำเนินการทีละรายการโดยไม่ต้องคัดลอกรายการทั้งหมด
แน่นอนว่าตัวอย่างนี้ไม่ค่อยดีนัก
คุณสามารถวนซ้ำรายการนี้ได้เนื่องจากคุณมีมันอยู่แล้ว
แต่อาจมีประโยชน์ในกรณีอื่นๆ เช่น เมื่อคุณวนซ้ำผ่านตัวสร้างอื่น และคุณต้องการทำการเปลี่ยนแปลงบางอย่างในทันที
ดังนั้นจึงมีประโยชน์ในบางกรณี
เราจะพบตัวอย่างเพิ่มเติมในภายหลัง
ฉันแค่อยากจะอธิบายไวยากรณ์ให้คุณฟังสักหน่อย
ยังไงก็ตาม สำหรับวิดีโอนี้
ไม่อยากรั้งคุณไว้อีกต่อไป
เจอกันใหม่ตอนหน้าค่ะ