5 thủ thuật Python đơn giản giúp code ngắn gọn và hiệu quả hơn
- Home
- 5 thủ thuật Python đơn giản giúp code ngắn gọn và hiệu quả hơn
Python được yêu thích không chỉ vì cú pháp dễ học mà còn bởi ngôn ngữ này cung cấp rất nhiều tính năng giúp developer viết code ngắn gọn, rõ ràng và dễ bảo trì.
Một số thủ thuật Python tưởng như rất nhỏ nhưng có thể giúp bạn giảm đáng kể lượng code phải viết trong các dự án thực tế.
Trong bài viết này, chúng ta sẽ cùng tìm hiểu 5 thủ thuật Python đơn giản nhưng cực kỳ hữu ích mà developer nên biết.
Trong nhiều ngôn ngữ lập trình, khi muốn hoán đổi giá trị của hai biến, chúng ta thường phải sử dụng một biến trung gian.
Ví dụ:
a = 10
b = 20
temp = a
a = b
b = temp
print(a)
print(b)
Python cho phép thực hiện việc này đơn giản hơn rất nhiều:
a = 10
b = 20
a, b = b, a
print(a) # 20
print(b) # 10
Đây là một tính năng được gọi là multiple assignment.
Python sẽ tự xử lý việc đóng gói và unpacking các giá trị trong phép gán.
Nó đặc biệt tiện khi cần:
Ví dụ:
x = 100
y = 200
z = 300
x, y, z = z, x, y
print(x) # 300
print(y) # 100
print(z) # 200
Không cần một biến tạm nào.
inMột đoạn code thường gặp:
status = "pending"
if status == "pending" or status == "processing" or status == "completed":
print("Valid status")
Đoạn code này hoạt động, nhưng khá dài và khó đọc khi số lượng điều kiện tăng lên.
Python cung cấp toán tử in để giải quyết vấn đề này:
status = "pending"
if status in ("pending", "processing", "completed"):
print("Valid status")
Code ngắn hơn và thể hiện rõ ý nghĩa:
Kiểm tra xem
statuscó nằm trong danh sách các giá trị hợp lệ hay không.
set khi có nhiều giá trịNếu danh sách giá trị lớn và bạn thường xuyên kiểm tra sự tồn tại của phần tử, có thể sử dụng set:
valid_statuses = {
"pending",
"processing",
"completed",
"cancelled"
}
if status in valid_statuses:
print("Valid status")
set được thiết kế rất phù hợp cho các thao tác kiểm tra membership.
Giả sử API trả về trạng thái đơn hàng:
status = "shipped"
valid_statuses = {
"pending",
"processing",
"shipped",
"completed"
}
if status in valid_statuses:
print("Đơn hàng hợp lệ")
Cách viết này dễ đọc và dễ mở rộng hơn rất nhiều so với việc sử dụng hàng loạt toán tử or.
enumerate() thay cho range(len())Khi duyệt qua một danh sách và cần cả index lẫn giá trị, nhiều developer thường viết:
users = ["An", "Bình", "Chi"]
for i in range(len(users)):
print(i, users[i])
Code này không sai, nhưng Python cung cấp một cách viết tốt hơn với enumerate():
users = ["An", "Bình", "Chi"]
for i, user in enumerate(users):
print(i, user)
Kết quả:
0 An
1 Bình
2 Chi
Nếu muốn index bắt đầu từ 1:
for i, user in enumerate(users, start=1):
print(i, user)
Kết quả:
1 An
2 Bình
3 Chi
enumerate()?Cách viết này:
for i, user in enumerate(users):
thể hiện trực tiếp ý định của developer:
Tôi muốn duyệt qua danh sách và lấy cả vị trí lẫn giá trị.
Trong khi đó:
for i in range(len(users)):
buộc chúng ta phải truy cập thêm:
users[i]
Vì vậy, enumerate() thường giúp code Python dễ đọc và “Pythonic” hơn.
Hiển thị danh sách sản phẩm:
products = [
"Laptop",
"Keyboard",
"Mouse",
"Monitor"
]
for index, product in enumerate(products, start=1):
print(f"{index}. {product}")
Kết quả:
1. Laptop
2. Keyboard
3. Mouse
4. Monitor
Counter để đếm dữ liệuGiả sử bạn cần đếm số lần xuất hiện của từng phần tử trong một danh sách.
Cách thông thường:
words = [
"python",
"php",
"python",
"javascript",
"php",
"python"
]
counter = {}
for word in words:
counter[word] = counter.get(word, 0) + 1
print(counter)
Kết quả:
{
'python': 3,
'php': 2,
'javascript': 1
}
Python có sẵn Counter trong module collections, giúp công việc này đơn giản hơn:
from collections import Counter
words = [
"python",
"php",
"python",
"javascript",
"php",
"python"
]
counter = Counter(words)
print(counter)
Kết quả:
Counter({
'python': 3,
'php': 2,
'javascript': 1
})
Counter còn cho phép sử dụng most_common():
print(counter.most_common(2))
Kết quả:
[
('python', 3),
('php', 2)
]
Điều này rất hữu ích khi cần thống kê dữ liệu.
Counter có thể được sử dụng trong:
Ví dụ thống kê các HTTP status code:
from collections import Counter
status_codes = [
200,
200,
404,
200,
500,
404,
200,
301
]
counter = Counter(status_codes)
print(counter)
Kết quả:
Counter({
200: 4,
404: 2,
500: 1,
301: 1
})
Một trong những thao tác thường gặp khi xử lý dữ liệu là loại bỏ các phần tử bị trùng.
Ví dụ:
numbers = [
1, 2, 2, 3,
4, 4, 5,
5, 5
]
Nếu không quan tâm đến thứ tự, có thể sử dụng set:
unique_numbers = list(set(numbers))
print(unique_numbers)
Kết quả có thể là:
[1, 2, 3, 4, 5]
Tuy nhiên, khi xử lý dữ liệu thực tế, đôi khi chúng ta muốn vừa loại bỏ duplicate vừa giữ nguyên thứ tự xuất hiện ban đầu.
Có thể sử dụng:
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = list(dict.fromkeys(numbers))
print(unique_numbers)
Kết quả:
[1, 2, 3, 4, 5]
dict.fromkeys() hoạt động?Dictionary trong Python hiện đại duy trì thứ tự insertion của các key.
Khi sử dụng:
dict.fromkeys(numbers)
các phần tử trùng nhau sẽ trở thành cùng một key và chỉ được giữ lại một lần.
Sau đó chúng ta chuyển dictionary trở lại thành list:
list(dict.fromkeys(numbers))
Giả sử bạn lấy danh sách URL từ nhiều nguồn:
urls = [
"https://example.com/page-1",
"https://example.com/page-2",
"https://example.com/page-1",
"https://example.com/page-3",
"https://example.com/page-2"
]
Có thể loại bỏ URL trùng:
unique_urls = list(dict.fromkeys(urls))
for url in unique_urls:
print(url)
Kết quả:
https://example.com/page-1
https://example.com/page-2
https://example.com/page-3
Thủ thuật này đặc biệt hữu ích trong các chương trình scraping, crawling và xử lý dữ liệu.
Chỉ với một vài tính năng nhỏ, Python có thể giúp chúng ta giảm đáng kể lượng code phải viết.
Trong bài viết này, chúng ta đã tìm hiểu 5 thủ thuật:
a, b = b, a.in.enumerate().Counter.set hoặc dict.fromkeys().Điểm quan trọng không phải là cố gắng viết code ít dòng nhất có thể.
Một đoạn code tốt nên hướng tới ba yếu tố:
Dễ đọc – dễ hiểu – dễ bảo trì.
Đây cũng chính là một trong những điểm khiến Python trở thành lựa chọn phổ biến cho web development, automation, data processing, scraping và AI.
Trong các bài tiếp theo, chúng ta có thể tiếp tục khám phá những thủ thuật Python thực tế khác như zip(), any(), all(), list comprehension, unpacking, with, lambda, functools và asyncio.