สร้างความสับสนให้กับเพื่อนๆ pythoneer ด้วยคำถามเหล่านี้
ลิงก์สำหรับตอนที่ 1 ของเรื่องนี้ —
1.) ทุกอย่างเป็นวัตถุใน Python! 🤨
คาดเดาผลลัพธ์หรือไม่
print(isinstance(object, type)) print(isinstance(type, object)) print(isinstance(type, type)) print(isinstance(object, object))
คำตอบ: จริง จริง จริง จริง
นี่เป็นเพราะว่าทุกอย่างเป็นวัตถุในหลาม ทุกประเภท เช่น int, str และ objectเป็นอินสแตนซ์ของคลาส type ซึ่งเป็นอ็อบเจ็กต์ เนื่องจาก ทุกอย่างเป็นอ็อบเจ็กต์ใน python
2.) ฟังก์ชันผลรวม() 😨
เดาผลลัพธ์ในกรณีนี้หรือไม่?
print(sum(“”)) print(sum(“”, [])) print(sum(“”, {}))
คำตอบ: 0, [], {}
เพื่อให้เข้าใจสิ่งนี้ มาดูกันว่า sum() ทำงานอย่างไร-
ผลรวม(ทำซ้ำได้ /, start=0)
ผลรวมเริ่มต้นและรายการที่สามารถทำซ้ำได้จากซ้ายไปขวาและส่งกลับผลรวม โดยปกติแล้วรายการของ iterable จะเป็นตัวเลข และค่าเริ่มต้นไม่ได้รับอนุญาตให้เป็นสตริง ดังนั้นในทุกกรณีข้างต้น “” จะถือเป็นลำดับว่าง ดังนั้น sum จะส่งกลับอาร์กิวเมนต์ start เป็นผลลัพธ์ทั้งหมด
3.) Python ขี้เกียจ! 😪
เดาผลลัพธ์ในกรณีนี้หรือไม่?
class follow: def func(self): return follow() a = follow() follow = int print(a.func())
คำตอบ: 0
สิ่งนี้เกิดขึ้นเนื่องจากโค้ดภายในฟังก์ชัน python ดำเนินการเมื่อมีการเรียกใช้เท่านั้น ซึ่งหมายความว่า NameErrors ทั้งหมดจะถูกยกขึ้นและตัวแปรจะถูกเชื่อมโยงเมื่อเราเรียกใช้เมธอดจริงเท่านั้น ดังนั้นในกรณีของเรา ในระหว่างการกำหนดวิธีการ Python ช่วยให้เราสามารถอ้างอิงคลาสที่ยังไม่ได้กำหนดได้ แต่ในระหว่างการดำเนินการ Python จะผูกชื่อ follow จากขอบเขตภายนอก ซึ่งหมายความว่าเมธอด function จะส่งคืน ที่สร้างขึ้นใหม่ int อินสแตนซ์
สับสนเล็กน้อยใช่ไหม? 😅
4.) ข้อผิดพลาดด้านแอตทริบิวต์? 😏
เดาผลลัพธ์ในกรณีนี้หรือไม่?
print(sum([a.imag for a in [ 0, 5, 10e9, float(‘inf’), float(‘nan’) ] ]))
คำตอบ: 0.0
คุณต้องคิดว่านี่จะทำให้เกิดข้อผิดพลาดใช่ไหม? มันจะไม่. เนื่องจากประเภทตัวเลขทั้งหมดใน Python เช่น int, float ฯลฯ; ได้รับการสืบทอดมาจากคลาสฐาน object และทั้งหมดส่งคืนส่วนจริงและจินตภาพซึ่งรวมถึง Infinityและ NaNเช่นกัน
5.) ที่ซึ่งคณิตศาสตร์ใช้ไม่ได้อีกต่อไป! 😵
เดาผลลัพธ์ในกรณีนี้หรือไม่?
a=(1 << 53)+1 print(a+1.0 > a)
คำตอบ: เท็จ
ตอนนี้คำอธิบายนี้คงจะยาวมาก อดทนหน่อยนะ :)
ประการแรก เนื่องจากพฤติกรรมต่อต้านสัญชาตญาณของเลขคณิตที่มีความแม่นยำตามอำเภอใจ(เลขคณิตแบบยาว) Python รองรับจำนวนเต็มขนาดใหญ่มากประเภท long แต่ขีดจำกัดของความแม่นยำลอยตัวใน Python นั้นมีจำกัด
ตัวเลขคือ 2⁵³+ 1 = 9007199254740993
ประการที่สองคือ ขีดจำกัดความแม่นยำของการลอย ซึ่งหมายความว่าไม่สามารถแสดงได้อย่างสมบูรณ์เป็น Python float และด้วยเหตุนี้ในการดำเนินการ x + 1.0 python จะส่ง aไปที่ float โดยปัดเศษเป็น 9007199254740992.0ซึ่ง Python สามารถแสดงได้อย่างง่ายดาย จากนั้นจึงเพิ่ม 1.0เข้าไป แต่เนื่องจากข้อจำกัดในการแสดงเดียวกัน จึงตั้งค่ากลับเป็น 9007199254740992.0
ประการที่สามเกิดจากกฎการเปรียบเทียบ Python ต่างจากภาษาอื่นตรงที่ไม่มีข้อผิดพลาดในการเปรียบเทียบ float กับ int และไม่ได้พยายามส่งตัวถูกดำเนินการทั้งสองตัวไปเป็นประเภทเดียวกัน แต่จะเปรียบเทียบค่าตัวเลขจริงแทน และเนื่องจาก 9007199254740992.0 ต่ำกว่า 9007199254740993 จึงพิมพ์ False
ว้าวววว! 😵💫
ความคิดสุดท้าย
คราวนี้คุณเดาได้กี่ผลลัพธ์? ตรงส่วนความคิดเห็น!
หากคุณยังไม่ได้อ่านตอนที่ 1 ของบทความนี้ โปรดอย่าเกลียดฉันเลย ถ้าคุณไม่ชอบ Python ในตอนนี้😂 ยังมี “ข้อผิดพลาด” เช่นนี้อีกมากใน python แต่ฉันคิดว่ามันดีมากเพราะมันจะช่วยให้คุณเข้าใจโครงสร้างภาษาภายในและยังหลีกเลี่ยงกรณีการใช้งานดังกล่าวในโปรเจ็กต์ของคุณที่อาจนำไปสู่ข้อผิดพลาดที่ไม่คาดคิด ลิงก์สำหรับตอนที่ 1 ของบทความนี้ถูกแชร์ไปแล้วในตอนแรก ลองเข้าไปดูสิ และแบ่งปันบทความที่ยอดเยี่ยมนี้กับเพื่อน Pythoneer ของคุณ 😄
แล้วพบกันใหม่ในบทความหน้าของฉัน…