สร้างความสับสนให้กับเพื่อนๆ 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 ของคุณ 😄

แล้วพบกันใหม่ในบทความหน้าของฉัน…