arr .__ len __ () เป็นวิธีที่ต้องการในการรับความยาวของอาร์เรย์ใน Python หรือไม่?


727

ในPythonต่อไปนี้เป็นวิธีเดียวที่จะได้รับจำนวนองค์ประกอบ?

arr.__len__()

ถ้าใช่ทำไมไวยากรณ์แปลก ๆ

คำตอบ:


1228
my_list = [1,2,3,4,5]
len(my_list)
# 5

งานเดียวกันสำหรับสิ่งอันดับ:

my_tuple = (1,2,3,4,5)
len(my_tuple)
# 5

และสตริงซึ่งเป็นเพียงอาร์เรย์ของตัวละคร:

my_string = 'hello world'
len(my_string)
# 11

มันถูกทำโดยเจตนาด้วยวิธีนี้เพื่อให้รายการ tuples และประเภทภาชนะอื่น ๆ หรือ iterables ไม่จำเป็นต้องทุกอย่างชัดเจนใช้ประชาชน.length()วิธีการแทนคุณก็สามารถตรวจสอบlen()อะไรที่ใช้ 'วิเศษ' __len__()วิธีการ

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

ลักษณะการทำงานของlen()ยังให้ยืมตัวเองดีกับรูปแบบการทำงานของการเขียนโปรแกรม

lengths = map(len, list_of_containers)

8
len () เป็นคำสั่งภาษา __len __ () เป็นวิธีการกับประเภทคอนเทนเนอร์
Soviut

33
len () เป็นฟังก์ชันระดับโลก __len __ () เป็นวิธีการที่วัตถุสามารถนำไปใช้ได้ len (foo) มักจะจบลงด้วยการเรียก foo .__ len __ ()
Tim Lesher

13
คุณพูดถึงว่าการจัดหา len () แต่ละคอนเทนเนอร์ไม่จำเป็นต้องใช้เมธอด. long () แต่จะแตกต่างกันอย่างไรถ้าแต่ละประเภทยังใช้เมธอด __len __ () ซึ่งถูกเรียกโดย len () ยังไง? ประเภทคอนเทนเนอร์ที่แตกต่างกันมีการจัดการแตกต่างกันโดย len () หรือไม่
ไซมอนเซ่นบี

10
@Simon: บิตเกี่ยวกับ "ไม่ทุกคนต้องใช้. long ()" กำลังสับสน ประเภทคอนเทนเนอร์ยังคงต้องใช้วิธีการคืนความยาว ประเด็นก็คือมันเป็นโปรโตคอลที่ได้มาตรฐานไม่ใช่วิธีการเฉพาะกิจที่คุณต้องค้นหาแต่ละประเภท เครื่องหมายขีดล่างคู่หมายถึงสิ่งนี้
Carl Meyer

16
ฉันเห็นด้วยกับคาร์ลเมเยอร์ - กล่าวว่า "ไม่จำเป็นต้องใช้อย่างชัดเจน" วิธีการสาธารณะ. long () สาธารณะทำให้เข้าใจผิดและความหมายหลักของมันไม่ถูกต้อง สิ่งใดก็ตามที่ยังคงต้องใช้งานlenและสามารถใช้วิธียาว ๆ ของตัวเองในชื่อสิ่งที่พวกเขาต้องการได้เสมอ - หลีกเลี่ยงการทำงานของ len ดังนั้นฉันจึงเห็นว่านี่เป็นความแปลกประหลาดที่เหมาะสมกับวิธีที่ Guido มองเห็นโลก มันอาจจะไม่เกี่ยวข้องกับเหตุผลสากลใด ๆ
BT

52

วิธีที่คุณใช้ความยาวของสิ่งใดก็ตามที่เหมาะสม (รายการ, พจนานุกรม, สิ่งอันดับ, สตริง, ... ) คือการโทรหาlenมัน

l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5

เหตุผลสำหรับไวยากรณ์ "แปลก" คือว่างูหลามภายในแปลลงในlen(object) object.__len__()สิ่งนี้ใช้กับวัตถุใด ๆ ดังนั้นหากคุณกำหนดคลาสบางคลาสและมีความยาวพอให้กำหนด__len__()เมธอดบนคลาสจากนั้นจึงเรียกlenใช้อินสแตนซ์เหล่านั้นได้


23

Python ใช้การพิมพ์เป็ด : มันไม่สนใจว่าวัตถุคืออะไรตราบใดที่มันมีส่วนต่อประสานที่เหมาะสมกับสถานการณ์ในมือ เมื่อคุณเรียกใช้ฟังก์ชัน built-in len () บนวัตถุคุณกำลังเรียกเมธอด __len__ ภายในของมัน วัตถุที่กำหนดเองสามารถใช้อินเทอร์เฟซนี้และ len () จะส่งคืนคำตอบแม้ว่าวัตถุนั้นจะไม่ได้เรียงตามแนวคิด

สำหรับรายการอินเตอร์เฟสทั้งหมดดูที่นี่: http://docs.python.org/reference/datamodel.html#basic-customization


23

วิธีที่ต้องการในการรับความยาวของวัตถุหลามใด ๆ คือการส่งผ่านมันเป็นอาร์กิวเมนต์ของlenฟังก์ชั่น ภายในไพ ธ อนจะพยายามเรียกใช้__len__วิธีพิเศษของวัตถุที่ถูกส่งผ่าน



10

คุณสามารถใช้len(arr) ตามคำแนะนำในคำตอบก่อนหน้าเพื่อรับความยาวของอาร์เรย์ ในกรณีที่คุณต้องการขนาดของอาเรย์ 2 มิติคุณสามารถใช้arr.shapeผลตอบแทนความสูงและความกว้าง


7

len(list_name)ฟังก์ชั่นใช้รายการเป็นพารามิเตอร์และมันเรียก__len__()ฟังก์ชั่นรายการ


1

Python แนะนำให้ผู้ใช้ใช้len()แทนความ__len__()มั่นคงเช่นเดียวกับที่คนอื่นพูด อย่างไรก็ตามมีประโยชน์อื่น ๆ :

สำหรับบางคนในตัวชนิดเช่นlist, str, bytearrayและอื่น ๆ , การดำเนินการของ Cython len()ต้องใช้ทางลัด โดยตรงจะส่งกลับในโครงสร้างซีซึ่งจะเร็วกว่าการโทรob_size__len__()

หากคุณสนใจรายละเอียดดังกล่าวคุณสามารถอ่านหนังสือที่ชื่อว่า "Fluent Python" โดย Luciano Ramalho มีรายละเอียดที่น่าสนใจมากมายและอาจช่วยให้คุณเข้าใจ Python ได้ลึกซึ้งยิ่งขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.