Whitespace ที่มีความหมาย
การย่อหน้าคือ syntax ไม่ใช่แค่ลวดลาย
หัวข้อที่มีชื่อว่า “การย่อหน้าคือ syntax ไม่ใช่แค่ลวดลาย”ใน TypeScript การย่อหน้าเป็นแค่เรื่องหน้าตา linter บังคับไว้เพื่อให้อ่านง่าย แต่ compiler ไม่สนใจเลย ต่อให้ไม่ย่อหน้าหรือย่อมั่ว โค้ดก็ยังทำงานเหมือนเดิม
ส่วนใน Python การย่อหน้าเป็นส่วนหนึ่งของ grammar เพราะ interpreter ใช้ตัดสินว่า block เริ่มตรงไหนและจบตรงไหน ไม่มี curly brace และไม่มีคำสั่ง end ให้ยึด
นี่ไม่ใช่ความแปลกประหลาด แต่เป็นการตัดสินใจออกแบบโดยเจตนา เพื่อบังคับให้ code อ่านง่ายโดยอัตโนมัติ
บล็อก if, for และ function
หัวข้อที่มีชื่อว่า “บล็อก if, for และ function”// TypeScript: braces delimit every blockfunction classify(n: number): string { if (n > 0) { return "positive"; } else if (n < 0) { return "negative"; } else { return "zero"; }}
for (let i = 0; i < 3; i++) { if (i % 2 === 0) { console.log(`${i} is even`); }}# Python: indentation delimits every blockdef classify(n: int) -> str: if n > 0: return "positive" elif n < 0: return "negative" else: return "zero"
for i in range(3): if i % 2 == 0: print(f"${i} is even")ข้อแตกต่างด้าน syntax ที่ควรสังเกต:
- คำว่า
functionกลายเป็นdefตามด้วยชื่อฟังก์ชันและเครื่องหมายโคลอน else ifใน TypeScript กลายเป็นelifใน Python (ไม่มีelse ifแยกต่างหาก)- ทุกบรรทัดที่เปิด block ต้องลงท้ายด้วยเครื่องหมายโคลอน (
:) - มาตรฐานการย่อหน้าคือ 4 ช่องว่าง การใช้ tab ได้แต่การผสม tab กับ space จะทำให้เกิด
TabError
IndentationError: error ที่ผู้เริ่มต้นเจอบ่อยที่สุด
หัวข้อที่มีชื่อว่า “IndentationError: error ที่ผู้เริ่มต้นเจอบ่อยที่สุด”ถ้าย่อหน้าผิด Python จะ raise IndentationError ก่อนที่ code จะรันด้วยซ้ำ นี่คือเทียบเท่ากับ error “unexpected token” ของ TypeScript ตอน compile
// TypeScript: this still runs (just ugly style)function add(a: number, b: number) {return a + b; // no indent — TS doesn't care}# Python: this raises IndentationErrordef add(a: int, b: int) -> int:return a + b # missing indent — SyntaxError at parse time
# Correct version:def add(a: int, b: int) -> int: return a + b # 4 spacesบล็อกซ้อนกัน
หัวข้อที่มีชื่อว่า “บล็อกซ้อนกัน”การซ้อนบล็อกทำได้โดยเพิ่มระดับการย่อหน้าสำหรับแต่ละบล็อก Python parser ติดตามระดับการย่อหน้า จึงไม่มีขีดจำกัดในการซ้อน แต่ Zen of Python แนะนำให้รักษาระดับความลึกให้น้อยที่สุด
// TypeScript nested blocksfunction processMatrix(matrix: number[][]): void { for (const row of matrix) { for (const cell of row) { if (cell > 0) { console.log(`positive: ${cell}`); } } }}# Python nested blocksdef process_matrix(matrix: list[list[int]]) -> None: for row in matrix: for cell in row: if cell > 0: print(f"positive: ${cell}")ลองด้วยตัวเอง
หัวข้อที่มีชื่อว่า “ลองด้วยตัวเอง”# Python uses indentation — no curly braces neededdef greet(name): if name: print(f"Hello, {name}!") else: print("Hello, stranger!")
greet("Alice")greet("")
for i in range(3): if i % 2 == 0: print(f"{i} is even") else: print(f"{i} is odd")Loading Python runtime (first run only)…