1. Chạy và gỡ lỗi chương trình Python
1.1 Tham số dòng lệnh
Khi thực thi từ terminal:
python script.py arg1 arg2 arg3
sys.argvlà danh sách chứa tất cả tham số truyền vào.len(sys.argv)trả về tổng số tham số (bao gồm tên file).
1.2 Gỡ lỗi tương tác với pdb
Chèn điểm ngắt tại vị trí cần kiểm tra:
import pdb
pdb.set_trace() # Dừng tại đây, dòng tiếp theo chưa được thực thi
Các lệnh điều khiển phổ biến:
n: Thực hiện dòng kế tiếp.c: Tiếp tục chạy đếnpdb.set_trace()tiếp theo hoặc kết thúc.var_name: Hiển thị giá trị biến.qhoặcexit: Thoát khỏi trình gỡ lỗi.
Khởi động trực tiếp qua CLI:
python -m pdb script.py
1.3 Thiết lập biến môi trường
Biến PYTHONPATH định nghĩa các thư mục mà trình thông dịch tìm kiếm module khi dùng import. Kiểm tra bằng:
import sys
print(sys.path)
Nếu bị sai lệch, đặt lại bằng lệnh shell: unset PYTHONPATH.
2. Quy ước cú pháp và mã hóa
2.1 Định dạng cơ bản
- Thụt lề: Không dùng dấu ngoặc, chỉ dựa vào thụt lề thống nhất — khuyến khích 4 khoảng trắng.
- Tách dòng: Dùng ký tự
\để nối câu lệnh; không cần nếu nằm trong[], {}, (). - Chuỗi: Hỗ trợ đơn nháy (
'), kép (") và ba nháy ('''hoặc"""). Ba nháy cho phép chuỗi đa dòng, thường dùng làm docstring. - Ghi chú: Một dòng bắt đầu bằng
#; nhiều dòng dùng khối ba nháy.
2.2 Xử lý Unicode và mã hóa
Python 2.7 mặc định sử dụng ASCII → phải khai báo mã hóa rõ ràng:
# -*- coding: utf-8 -*-
data = u"Xin chào thế giới"
print(data.encode('utf-8'))
Với chuỗi Unicode dạng escape như r'\u65e5\u672c', chuyển sang UTF-8 bằng:
s = r'\u65e5\u672c'
decoded = s.decode('unicode_escape')
3. Nhập – xuất dữ liệu
3.1 Nhập liệu
raw_input(): Đọc một dòng dưới dạng chuỗi (không đánh giá biểu thức).input(): Đọc và đánh giá biểu thức Python — tiềm ẩn rủi ro bảo mật.getpass.getpass(): Nhập mật khẩu ẩn.
3.2 Xuất liệu
Dùng print để hiển thị:
count = 42
print("Giá trị:", count)
print("Hello " + "World!")
3.3 Làm việc với tệp tin
Sử dụng khối with đảm bảo đóng tệp đúng cách:
# Đọc từng dòng
lines = []
with open("input.txt", "r") as f:
for line in f:
lines.append(line.strip())
# Ghi dữ liệu dạng bảng
with open("output.txt", "w") as f:
for a, b in zip(lines[0].split(), lines[1].split()):
f.write(f"{a}\t{b}\n")
Các chế độ mở tệp phổ biến:
| Chế độ | Mô tả | Hành vi khi tệp không tồn tại | Hành vi ghi |
|---|---|---|---|
r | Chỉ đọc | Lỗi | - |
w | Ghi mới | Tạo mới | Ghi đè |
a | Ghi nối | Tạo mới | Nối cuối |
r+ | Đọc & ghi | Lỗi | Ghi đè từ đầu |
4. Thư viện chuẩn thiết yếu
4.1 Xử lý hệ thống tập tin (os)
import os
# Kiểm tra tồn tại
if os.path.exists("config.ini"):
print("Tệp cấu hình đã có")
# Duyệt cây thư mục
for root, dirs, files in os.walk("/home/user/docs"):
for name in files:
if name.endswith(".log"):
print(os.path.join(root, name))
# Đường dẫn tuyệt đối
abs_path = os.path.abspath("data.csv")
parent_dir = os.path.dirname(abs_path)
4.2 Phân tích XML với xml.etree.ElementTree
import xml.etree.ElementTree as ET
# Tạo cây XML
root = ET.Element("catalog")
book = ET.SubElement(root, "book", id="101")
title = ET.SubElement(book, "title")
title.text = "Lập trình Python"
tree = ET.ElementTree(root)
tree.write("catalog.xml", encoding="utf-8", xml_declaration=True)
# Đọc và trích xuất
tree = ET.parse("catalog.xml")
for book in tree.findall("book"):
print(book.get("id"), book.find("title").text)
5. Các kiểu dữ liệu cơ bản
5.1 Chuỗi (str)
text = "Python Programming"
print(text[0]) # 'P'
print(text[-1]) # 'g'
print(text[7:18]) # 'Programming'
print(text.replace("P", "p")) # 'python Programming'
5.2 Danh sách (list) và bộ (tuple)
fruits = ["apple", "banana", "cherry"]
fruits.append("date")
fruits.sort()
coords = (10.5, 20.3) # Không thể thay đổi sau khi tạo
x, y = coords # Giải nén tự động
5.3 Từ điển (dict)
user = {"name": "Alice", "age": 30}
user["city"] = "Hanoi"
print(user.keys()) # ['name', 'age', 'city']
print(user.values()) # ['Alice', 30, 'Hanoi']
# Truy cập an toàn
email = user.get("email", "N/A")
6. Cấu trúc điều khiển
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
else:
grade = "C"
# Vòng lặp với else
for i in range(3):
print(i)
else:
print("Hoàn tất vòng lặp") # Chỉ chạy nếu không có break
# Dừng sớm
for item in items:
if item == "STOP":
break
process(item)
7. Hàm và xử lý ngoại lệ
7.1 Định nghĩa hàm
def calculate_tax(amount, rate=0.1):
"""Tính thuế theo tỷ lệ mặc định 10%"""
return amount * rate
# Gọi với tham số tùy chọn
total = calculate_tax(1000, rate=0.15)
7.2 Bắt ngoại lệ
try:
with open("missing.txt") as f:
content = f.read()
except IOError as e:
print(f"Lỗi I/O: {e}")
except Exception as e:
print(f"Lỗi chung: {e}")
else:
print("Đọc thành công!")
finally:
print("Dọn dẹp hoàn tất.")
8. Lập trình hướng đối tượng
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.__balance = balance # Thuộc tính riêng tư
def deposit(self, amount):
if amount > 0:
self.__balance += amount
def get_balance(self):
return self.__balance
# Sử dụng
acc = BankAccount("Nguyen Van A", 500)
acc.deposit(200)
print(acc.get_balance()) # 700
9. Kết nối dịch vụ bên ngoài
9.1 PostgreSQL với psycopg2
import psycopg2
conn = psycopg2.connect(
dbname="testdb",
user="admin",
password="secret",
host="localhost"
)
cur = conn.cursor()
cur.execute("SELECT * FROM users WHERE active = %s", (True,))
results = cur.fetchall()
cur.close()
conn.close()
9.2 Redis với redis-py
import redis
pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
r = redis.Redis(connection_pool=pool)
r.set("user:1001", "John Doe", ex=3600)
name = r.get("user:1001")
10. Giao tiếp mạng và API
import requests
# GET với tham số
resp = requests.get("https://httpbin.org/get", params={"q": "python"})
# POST với JSON
payload = {"username": "test", "role": "admin"}
resp = requests.post("https://httpbin.org/post", json=payload)
# Xử lý phản hồi
if resp.status_code == 200:
data = resp.json()
print(data["json"]["username"])
11. Làm việc với JSON
import json
# Mã hóa
data = {"users": [{"id": 1, "name": "An"}], "total": 1}
json_str = json.dumps(data, indent=2, ensure_ascii=False)
# Giải mã
parsed = json.loads(json_str)
print(parsed["users"][0]["name"]) # "An"
# Đọc/ghi tệp
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, ensure_ascii=False)
with open("data.json", "r", encoding="utf-8") as f:
loaded = json.load(f)