ข้ามไปยังเนื้อหา

Control Flow

Control flow ของ TypeScript ย้ายมา Python ได้แทบจะคำต่อคำ จุดต่างที่ใหญ่ที่สุดล้วนเป็นเรื่องผิวเผิน คือไม่มีปีกกา (การย่อหน้าคือโครงสร้าง) ใช้ elif แทน else if และใช้ match/case แทน switch

อีกจุดที่ต้องปรับคือ ลูป for ของ Python เป็น for ... in เสมอ ไม่มีลูปสไตล์ C แบบ for (let i = 0; ...) ให้เขียน

TypeScript
// TypeScript
const score: number = 85;
let grade: string;
if (score >= 90) {
grade = "A";
} else if (score >= 80) {
grade = "B";
} else if (score >= 70) {
grade = "C";
} else {
grade = "F";
}
console.log(`Grade: ${grade}`); // Grade: B
Python
# Python
score: int = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "F"
print(f"Grade: {grade}") # Grade: B

for ของ Python วนบน iterable เสมอ จะเป็น list, string, dict หรือ range ก็ได้ ไม่มีลูปแบบไล่ index สไตล์ C ให้ใช้ ถ้าต้องการ index ด้วยให้เรียก enumerate()

TypeScript
// TypeScript
// Indexed loop
for (let i = 0; i < 5; i++) {
console.log(i);
}
// for...of over array
const fruits = ["apple", "banana", "cherry"];
for (const fruit of fruits) {
console.log(fruit);
}
// Index + value
fruits.forEach((fruit, i) => console.log(i, fruit));
Python
# Python
# range() replaces the C-style for loop
for i in range(5): # 0, 1, 2, 3, 4
print(i)
# Iterate over any iterable directly
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
# Index + value with enumerate()
for i, fruit in enumerate(fruits):
print(i, fruit)

range(start, stop, step) เทียบกับรูปแบบฝั่ง TypeScript ได้ตรง ๆ:

TypeScriptPython
for (let i = 0; i < 10; i++)for i in range(10)
for (let i = 1; i <= 10; i++)for i in range(1, 11)
for (let i = 0; i < 10; i += 2)for i in range(0, 10, 2)
for (let i = 10; i > 0; i--)for i in range(10, 0, -1)

while ทำงานเหมือนกันทุกอย่าง คือวนไปจนกว่าเงื่อนไขจะเป็น false

TypeScript
// TypeScript
let n: number = 1;
while (n <= 5) {
console.log(n);
n++;
}
Python
# Python
n: int = 1
while n <= 5:
print(n)
n += 1 # no ++ operator in Python

สังเกตว่า Python ไม่มี operator ++ หรือ -- ต้องใช้ += 1 และ -= 1 แทน

Python 3.10 เพิ่ม match/case เข้ามา ซึ่งทำได้มากกว่า switch ของ TypeScript เพราะรองรับทั้ง OR pattern ด้วย |, wildcard _ และ structural pattern matching คือ match ตามรูปร่างของ object ได้เลย

TypeScript
// TypeScript switch
const command: string = "quit";
switch (command) {
case "start":
console.log("Starting...");
break;
case "stop":
case "quit":
console.log("Stopping");
break;
default:
console.log(`Unknown: ${command}`);
}
Python
# Python match/case (Python 3.10+)
command: str = "quit"
match command:
case "start":
print("Starting...")
case "stop" | "quit": # OR pattern — no fallthrough needed
print("Stopping")
case _: # wildcard — like default
print(f"Unknown: {command}")

ต่างจาก switch ตรงที่ match ไม่ fall through จึงไม่ต้องเขียน break เลยสักที่ ถ้าอยากรวมหลาย case เข้าด้วยกันก็ใช้ | คั่นใน case เดียว

if/elif/else
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "F"
print(f"Grade: {grade}")
# for + range
print("Counting:")
for i in range(1, 6):
print(f" {i}")
# for + enumerate
fruits = ["apple", "banana", "cherry"]
print("Fruits:")
for i, fruit in enumerate(fruits):
print(f" {i}: {fruit}")
# match/case
for cmd in ["start", "quit", "help"]:
match cmd:
case "start":
result = "Starting..."
case "stop" | "quit":
result = "Stopping"
case _:
result = f"Unknown: {cmd}"
print(result)
อะไรคือสิ่งที่เทียบเท่า `else if` ของ TypeScript ใน Python?
ข้อใดต่อไปนี้คือสิ่งที่เทียบเท่า `for (let i = 1; i <= 5; i++)` ใน Python อย่างถูกต้อง?
ใน `match`/`case` ของ Python เกิดอะไรขึ้นหลังรัน case ที่ตรงเงื่อนไขจบ?
จะเอาทั้ง index และ value พร้อมกันขณะวน list ใน Python ได้อย่างไร?