Ngôn ngữ 'keo' của server: script chạy ra sao, dữ liệu mà nó giữ, và các mẫu hình bạn sẽ nhận ra trong mọi dòng code phía sau.
← / → để chuyển slide · chuyển EN/VI bên dưới
Mọi thứ phía sau frontend — ứng dụng, công cụ, script — thường là Python. Bạn sẽ đọc nó, đánh giá nó, và dẫn dắt AI viết nó.
Flask — framework mà khóa học dùng — là một thư viện Python. Mọi trang mà app bạn trả về đều do code Python quyết định.
Python nối các mảnh lại: nhận request web, đọc dữ liệu, gọi công cụ khác, ghi file. Nó là chất kết nối của hệ thống phía sau.
Python nằm trong nhóm ngôn ngữ AI viết giỏi nhất. Bạn không thuộc lòng — bạn hỏi, nhận code, và kiểm tra.
Bộ slide này cho bạn mô hình tư duy: mỗi cấu trúc dùng để làm gì. Nhờ đó bạn xem được code do AI viết và điều chỉnh đúng hướng.
AI viết Python. Kỹ năng của bạn là ba bước khiến code từ AI đáng tin cậy.
Bạn không gõ từ bộ nhớ. Bạn nhìn code — của bạn hay của AI — và biết mỗi khối dùng để làm gì: một hàm, một vòng lặp, một lần đọc dữ liệu.
Dòng nào chưa nhận ra → dán cho AI: 'dòng này làm gì?' Giải thích là miễn phí; nhận ra mới là kỹ năng.
Kiểm tra tốt nhất là chạy thử: in ra thứ bạn mong đợi, đọc kết quả, so sánh. Output là sự thật — không phải code, không phải sự tự tin của AI.
Hai cánh cửa vào ngôn ngữ — và chuyện gì xảy ra khi có sự cố.
Biến giữ giá trị trong các 'ô' có nhãn; print() hiển thị chúng. Đó là toàn bộ vốn từ của script cho người mới.
# hi.py — a comment: Python ignores it, humans read it
name = "shipper" # a variable: a labelled box
print("Hello, " + name) # send text to the screen
print("Ready to build.")
Đó là một chương trình hoàn chỉnh: một biến và hai câu print. Không cần thêm gì để bắt đầu.
Biến là một tên trỏ đến một giá trị. Tên là nhãn; giá trị (và kiểu của nó) có thể thay đổi.
score = 82 — tên score giờ trỏ đến giá trị 82. Đọc là 'score đang giữ 82'.
score = 90 sau đó chỉ là chuyển nhãn sang giá trị mới. Ô không cố định — thứ di chuyển là nhãn.
Không cần khai báo kiểu. 82 là int, "An" là str, True là bool — Python biết từ chính giá trị.
Một lệnh chạy cả file; cùng lệnh không file thì mở REPL (Read-Eval-Print Loop) — playground trực tiếp để thử từng dòng.
Mỗi lỗi Python đều kết thúc bằng một traceback: ngăn xếp các vị trí bạn từng ở, và vấn đề thật ở dòng cuối cùng.
Bạn sẽ dán những thứ này cho AI liên tục. Biết ba phần giúp bạn làm việc nhanh hơn.
File "hi.py", line 4 nói chính xác chỗ cần nhìn. Đó là con trỏ để bạn chỉ đích danh khi chỉnh.
NameError (sai chính tả / chưa định nghĩa), KeyError (thiếu key trong dict), TypeError (sai kiểu). Tên lỗi là phân loại, không phải phán quyết.
Copy nguyên cả traceback, không chỉ dòng cuối. Phần ngăn xếp phía trên cho thấy con đường dẫn đến lỗi.
Chương trình chủ yếu là dữ liệu đang chuyển động. Năm kiểu nhỏ đáp ứng gần như mọi thứ — và hai trong số đó (list, dict) là ngôi sao.
Bạn sẽ gặp các kiểu này trong mọi backend. str/int/float/bool là nguyên tử; list & dict là cách dữ liệu được tổ chức thực sự.
| Kiểu | Ví dụ | Dùng để |
|---|---|---|
| str | "hello" | Chữ: tên, tin nhắn, URL |
| int | 42 | Số nguyên: đếm, id, cổng |
| float | 3.14 | Số thập phân: giá, điểm |
| bool | True / False | Công tắc đúng/sai: is_active, is_admin |
| list | ["a", "b"] | Tập hợp có thứ tự — tác vụ, kết quả, người dùng |
| dict | {"name": "An"} | Cặp nhãn → giá trị — một bản ghi: người dùng, request, config |
Mọi phản hồi API, file config và dòng từ CSDL đều đến dưới dạng JSON. List và dict của Python đọc nó ngay — không cần lớp phiên dịch.
# A list: ordered things
tasks = ["design", "code", "test", "ship"]
# A dict: labelled values (a record)
user = {
"name": "An",
"role": "designer",
"active": True,
}
Đã từng xem JSON thì bạn đã biết thứ này: dict = object JSON {…}, list = array JSON […].
Một bên là động từ, bên kia là câu hỏi. Nhầm lẫn giữa chúng là lỗi hay bắt gặp nhất trong code của AI (và của người).
Đặt giá trị vào ô: name = "An". Vế bên phải được tính trước, rồi lưu vào. Nó làm thay đổi trạng thái.
Đặt câu hỏi: name == "An" → True hoặc False. Nó không thay đổi gì — chỉ trả lời, và câu trả lời là một bool.
Chuỗi là dữ liệu phổ biến nhất trong web app. Vài thao tác đáp ứng phần lớn việc hằng ngày.
len("hello") → 5. Đếm số ký tự.
"ell" in "hello" → True. Kiểm tra chuỗi con; dùng được cả với list (slide kế tiếp).
"An".upper() → "AN". Đổi hoa thường để so khớp và hiển thị.
"a b c".split() → ["a", "b", "c"]. Text vào, list ra — cầu nối từ chữ sang dữ liệu.
Dữ liệu không chỉ được tạo ra — bạn còn chạm vào nó. Ba thao tác này xuất hiện trong gần như mọi vòng lặp bạn đọc.
tasks = ["design", "code", "ship"]
print(len(tasks)) # 3
print(tasks[0]) # design — counting starts at 0
print("design" in tasks) # True
age = 29
print(age > 18) # True ← a comparison makes a bool
print(age == 30) # False
Đếm bắt đầu từ 0, nên phần tử đầu là index 0 và phần tử cuối là len − 1. Phép so (> , <, ==) không thay đổi gì — chúng sinh ra True/False.
Giữa giá trị và lỗi, Python có một trạng thái thứ ba: sự vắng mặt hợp lệ.
Từ mà Python dùng cho 'không có gì ở đây'. Hàm không return cho None; .get() thiếu key cho None.
Nó thành thật: 'tôi đã tìm, không có gì.' Tốt hơn crash, tốt hơn giả một giá trị như 0 hay "".
if value is None: — cách chuẩn để hỏi 'có lấy được gì không?' trước khi dùng.
Python quyết định và lặp lại ra sao — những hình dạng bạn sẽ nhận ra trong mọi đoạn code AI đưa.
Không cần học thuộc cú pháp — chỉ cần nhận ra hình dạng: một điều kiện, một dấu hai chấm, một khối thụt vào.
score = 82
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
else:
grade = "C"
print(grade) # B
Python kiểm tra từ trên xuống và chạy nhánh đầu tiên có điều kiện đúng. else bắt tất cả phần còn lại. Khoảng thụt là nhóm lệnh — không cần ngoặc.
Vòng lặp chính: cho nó bất kỳ tập dữ liệu nào, nó đưa bạn từng phần tử một.
for task in ["design", "code", "ship"]:
print(task)
for i in range(3): # range(3) → 0, 1, 2
print(i)
for đi qua bất kỳ tập dữ liệu nào, lần lượt từng phần tử — một list, hoặc tập range(n) 'đếm từ 0'. Đa số vòng lặp trong code thật là for.
Vòng lặp bạn phải kiểm soát: nó chạy chừng nào điều kiện còn đúng.
retries = 3
while retries > 0:
print("retrying...")
retries = retries - 1 # runs 3 times
Bạn phải làm điều kiện tiến về sai ở bên trong vòng lặp. Quên mất — vòng lặp vô hạn, server ngừng trả lời. for lo phần lớn việc; while là vòng lặp cần cẩn thận.
Điều kiện thật hiếm khi chỉ là một phép so. Ba từ ghép chúng thành câu kiểm tra gần như tiếng Anh.
age >= 18 and active — cả hai vế đúng thì cả câu mới đúng. Nghĩa là 'và'.
role == "admin" or role == "owner" — ít nhất một bên đúng. Nghĩa là 'hoặc'.
not banned — đúng khi banned sai. Nghĩa là 'không'. Bạn sẽ thấy ba từ này trong gần như mọi if mà bạn xem.
Hàm, chuỗi, thao tác dữ liệu, file, import — bộ công cụ hằng ngày của backend.
Hàm đóng gói một tác vụ: đặt tên, cho nó input, nhận kết quả về. Gọi nó bao nhiêu lần cũng được.
def greet(name): # define: a reusable recipe
return f"Hello, {name}!"
print(greet("An")) # Hello, An! ← call it
print(greet("You")) # Hello, You! ← call again
def đặt tên công thức, tham số (name) là input, return trả về kết quả. Chuỗi f"…" bên trong sẽ nói ở slide tiếp theo.
Hai cấu trúc nhỏ nhất nhưng dễ thấy nhất — bạn sẽ thấy chúng ở dòng đầu của gần như mọi file.
f"Hi {name}, còn {n} tác vụ" — giá trị nhét thẳng vào chữ. Cách số 1 để ghép tin nhắn.
f"{2 + 3}" cho ra "5". Hàm cũng được: f"{len(tasks)}".
Python bỏ qua mọi thứ sau #. AI cũng đọc chú thích — một dòng comment tốt là bánh lái cho AI bảo trì code của bạn.
Ba thao tác đáp ứng phần lớn việc hằng ngày: thêm vào list, đọc dict an toàn, và lặp qua dữ liệu.
tasks = ["design", "code"]
tasks.append("ship") # grow the list
user = {"name": "An", "role": "designer"}
print(user["name"]) # An
print(user.get("email")) # None — safe if missing
for t in tasks: # loop over items
print(t)
d["key"] sẽ lỗi nếu thiếu key; d.get("key") trả về None bình thản. Nên dùng .get() khi key không chắc chắn — đa số bug do AI gây ra là từ key bị thiếu.
Sáu thao tác đáp ứng việc hằng ngày. Tất cả đều là method: dữ_liệu.method().
| Thao tác | Nó làm gì |
|---|---|
| len(x) | Độ dài của list, dict hay chuỗi. |
| x in data | Kiểm tra thành viên — phần tử hay giá trị này có bên trong không? → True/False. |
| data.append(v) | Thêm v vào cuối list. Làm list dài thêm. |
| d.get(k) | Đọc giá trị dict; trả None thay vì crash nếu thiếu key. |
| d.keys() | Danh sách các nhãn của dict. Cách bạn lặp qua một bản ghi. |
| d.items() | Cặp nhãn + giá trị, để lặp cả hai cùng lúc. |
File là cách chương trình nhớ chuyện giữa các lần chạy — config, dữ liệu, log. Hình dạng bên dưới xuất hiện trong gần như mọi backend bạn đụng tới.
with open("tasks.txt") as f: # open, and close for you
for line in f: # a file is a list of lines
print(line.strip()) # remove the newline
open() đưa cho bạn handle của file; with đảm bảo nó được đóng. Từng dòng một, file chỉ là list các chuỗi.
Cùng hình dạng open/with như khi đọc; khác duy nhất một chữ cái: mode.
with open("out.txt", "w") as f: # w = write, erases first
f.write("task: design\n")
with open("out.txt", "a") as f: # a = append, keeps existing
f.write("task: ship\n")
w bắt đầu mới, a nối thêm. Đây chính là cách app ghi log và lưu dữ liệu — cùng hình dạng bạn vừa học để đọc.
Bạn không tự xây mọi thứ. Một dòng kéo vào cả bộ công cụ — Python đi kèm một thư viện chuẩn khổng lồ.
import json cho bạn công cụ JSON; import math cho bạn công cụ toán. Một dòng, cả bộ công cụ — đứng đầu gần như mọi file.
json.loads biến chuỗi JSON thành dict/list; json.dumps làm ngược lại. Đây là cách app của bạn nói chuyện với web.
from flask import Flask — ngay cả 'dùng Flask' cũng chỉ là một import. Mọi backend bạn đọc đều bắt đầu bằng imports.
Dữ liệu thật lộn xộn: thiếu key, file rỗng, input sai. Chương trình biết xử lý sẽ tiếp tục chạy.
try:
value = user["email"]
except KeyError:
value = "no email"
print(value)
try: thử phần rủi ro; except: nếu thất bại thì làm cái này. Chương trình suy giảm nhẹ nhàng thay vì crash — bạn sẽ thấy nó quanh mọi lần đọc dữ liệu.
Không có gì mới — chỉ là các mảnh của deck ghép lại một chỗ. Đọc từ trên xuống; bạn đã biết việc của từng dòng.
import json
def summary(raw):
users = json.loads(raw) # JSON string -> list of dicts
active = 0
for u in users:
if u.get("active"):
active = active + 1
return f"{active} of {len(users)} active"
raw = '[{"name": "An", "active": True}]'
print(summary(raw)) # 1 of 1 active
import, def, json.loads, for, if, .get, len, f-string — toàn bộ vốn từ của deck, làm việc thật trong mười hai dòng.
Mọi thứ là bước chuẩn bị cho phần này: app Flask, công cụ, script — tất cả là những mảnh bạn vừa học.
Giờ nhìn app của chính khóa học: một file .py với hàm, dict, file và JSON. Mọi mảnh trên slide này đều có trong app đó.
"GET /slides/python-basics" → Python gọi một hàm → hàm trả về trang web. def + return, chính hệt slide greet().
Mỗi request web đến dưới dạng túi có nhãn: query, form, header. Bạn đọc bằng d.get("key") — slide thao tác hằng ngày.
App đọc dữ liệu (file, CSDL), xếp thành dict và list, gửi về trình duyệt dưới dạng JSON — chính list/dict ở Phần 2.
Cấu hình và dữ liệu đến từ file — hình dạng open/with ở Phần 4. Python là chất kết nối giữa web và đĩa.
Vòng lặp hằng ngày của khóa học: bạn và AI, từng khối code một.
Trước khi hỏi, hãy tìm các mẫu hình: def, for, if, dict, open. Bạn đã biết mỗi thứ dùng để làm gì.
Dán một khối và hỏi 'giải thích đơn giản đoạn này.' So sánh câu trả lời của AI với cách bạn hiểu — chỗ chênh lệch ấy là nơi bạn học.
Chỉnh sửa hiệu quả nhất khi có đích: 'thay đổi hàm này để kiểm tra thêm key email.' Vào cụ thể, ra cụ thể.
Sau mỗi thay đổi, chạy và nhìn kết quả in ra/trả về. Output đúng → hình dạng đúng. Output sai → dán lại cho AI và lặp.
Bạn không cần viết Python bằng tay. Bạn cần nhận ra nó, đánh giá nó, và dẫn dắt AI viết nó.
Tiếp theo: route Flask đầu tiên của bạn — cùng Python đó, giờ trả lời cho web. Hãy nhờ AI giải thích bất kỳ dòng nào bạn chưa nhận ra.