Professional Documents
Culture Documents
Hãy nói về Python
Hãy nói về Python
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Hoan nghênh
Đừng lo lắng, hãy nghỉ ngơi, hãy làm lại chương này. Chỉ
cần đừng bỏ cuộc.
Mắc sai lầm. Bạn không học được gì khi mọi thứ diễn
ra hoàn hảo. Chỉ có cách để học là phạm sai lầm. Đừng
sợ sai lầm. Hãy thử nghiệm code, hãy thay đổi mọi thứ,
cứ nhận thông báo lỗi và đọc chúng. Hãy tìm kiếm thông
báo lỗi trên Internet và khám phá hàng nghìn người
khác cũng mắc lỗi tương tự. Hãy tìm hiểu cách họ sửa
lỗi như thế nào và tự sửa cho chính mình. Hãy tiến về
phía trước và đừng bỏ cuộc.
Hỏi các câu hỏi. Hãy hỏi bạn bè, hỏi ông bà cha mẹ, hỏi
Internet. Hãy giải thích vấn đề của bạn cho ai đó – đôi
khi như vậy là đủ để tự bạn tìm ra câu trả lời. Không có
cái thứ gọi là “câu hỏi ngu ngốc”, bạn đừng ngại. Hãy đặt
câu hỏi và đừng bỏ cuộc.
Đi xa hơn. Sửa đổi ứng dụng bạn tạo ra bằng cuốn sách
này. Hãy thay đổi điều gì đó để làm cho nó trông giống
ứng dụng của riêng bạn hơn. Hãy suy nghĩ về các ứng
dụng khác mà bạn có thể làm được. Hãy quan sát xung
quanh bạn: những gì có thể được tự động hóa đây? Bạn
có thể tạo một ứng dụng tương tự như ứng dụng hoặc
trang web mà bạn đã biết không? Hãy nói với bạn bè về
ý tưởng của bạn – có thể các bạn sẽ cùng nhau tạo ra thứ
gì đó? Lập trình thực là vui, đừng bỏ cuộc.
Nói ra. Vui lòng cho tôi biết suy nghĩ của bạn trong
liveBook Discussion forum về những gì đã được viết cho
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
đến nay và những gì bạn muốn thấy trong phần còn lại
của cuốn sách. Phản hồi của bạn sẽ là vô giá trong việc
cải thiện Let's Talk Python
—Pavel Anni
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Mục lục
PHỤ LỤC
A Ý tưởng cho ứng dụng đầu tiên của bạn
B Cách cài đặt Mu Editor và môi trường Python
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Tất cả bắt đầu vào một ngày hè đầy nắng. Erik về nhà
với một ý tưởng: cậu muốn chuẩn bị cà phê và đồ uống
cho bạn bè. Liệu có ai biết rằng cậu ta muốn tạo ứng
dụng trực tuyến cá nhân không nhỉ?
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
tưởng tượng tới cửa hàng trực tuyến cá nhân với tấm
biển lớn ở trên đề: "Quán cà phê Erik."
"Đúng rồi, tất nhiên là thế. Em đã biết một chút về
Python từ khóa học trực tuyến trước đây, đúng chưa?"
"Vâng, nhưng em không nhớ nhiều lắm. Bọn em có làm
một ít bài tập... Em nghĩ sẽ xương xẩu đây – phải làm nó
hệt như một cửa hàng trực tuyến thực sự."
“Đừng lo,” Simon nói. "Chúng ta sẽ làm từng bước một.
Anh đã thực hiện một số dự án như thế này cho đội
robot ở trường."
LƯU Ý: Đừng lo lắng nếu trước đây bạn chưa có kinh
nghiệm lập trình gì. Bạn Erik cũng chả nhớ được
mấy từ chương trình từng học, nào chúng ta bắt đầu
thôi.
Simon đang học năm cuối trung học. Anh đã học Python
vài năm trước và sử dụng kiến thức này trong câu lạc
bộ Khoa học Máy tính của trường và gần đây là trong
đội Người máy.
"Thế có nghĩa là, anh đang nói là chúng ta có thể xây
dựng một ứng dụng trực tuyến thực sự phải không?"
Erik vẫn chưa bị thuyết phục hoàn toàn.
"Phải, chắc chắn thế rồi. Nếu em không bỏ ngang lớp
học của anh," Simon mỉm cười nói, "Em sẽ xây dựng nó
trong một vài tuần. Sau đó, khách hàng của em sẽ được
chọn bất kỳ đồ uống nào họ muốn, trộn thêm hương
vị…”
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Và đây sẽ là danh sách các đơn đặt hàng của em."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Hãy bắt đầu với một số điều đơn giản. Chả mấy mà em
sẽ nhớ Python thôi. Em đã cài đặt nó trên máy tính xách
tay cá nhân chưa?" Simon hỏi.
"Chưa, em chưa từng nghĩ tới việc này."
"Đây là một trình soạn thảo editor Python tuyệt vời,
được thiết kế dành riêng cho những người mới bắt đầu
như em. Nó có tên là Mu Editor. Hãy thử tìm nó và cài
đặt đi. Em sẽ làm được, anh tin điều ấy."
Erik đã tìm thấy trang web: https://codewith.mu/ để tải
phần mềm
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Liệu còn trình soạn thảo nào khác cho Python không
ạ?" Erik không muốn chỉ làm theo hướng dẫn của ông
anh trai.
"Có, tất nhiên là nhiều lắm. Một lựa chọn tốt khác cho
người mới bắt đầu là Thonny. Hãy xem tại đây:
https://thonny.org/ "
"Nhìn trông hay hay!" Erik mỉm cười. "Cái tên khá là
buồn cười."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Tất nhiên còn có những trình soạn thảo code khác hoạt
động trên mọi nền tảng:
- Code VS (htpps://code.visualstudio.com),
- Sulime Text ( http://www.sublimete).
"Tất cả chúng đều hoạt động hoàn hảo với Python.
Ngay cả những trình soạn thảo rất cũ như Vim
(https://www.vim.org/) và Emacs
(https://www.gnu.org/software/emacs/) cũng hỗ trợ
Python, nhưng em phải là một lập trình viên rất
chuyên nghiệp mới sử dụng được chúng," Simon nháy
mắt với em trai mình. "Mu Editor và Thonny," Simon
tiếp tục, "Cả hai đều đã có sẵn Python khi cài đặt. Để sử
dụng Python với các trình soạn thảo khác, em phải cài
đặt nó trước. Trên một số Hệ điều hành như Linux và
macOS, Python đã có sẵn trước rồi. Với Windows, em
nên cài đặt nó. Anh có thể chỉ cho em sau nếu em
muốn."
LƯỢT CỦA BẠN : Hãy cài đặt môi trường Python
Bây giờ đến lượt bạn. Mở máy tính xách tay hoặc
máy tính để bàn ra và cài đặt Mu Editor. Bạn có thể
tìm hướng dẫn đầy đủ cho các nền tảng hệ điều
hành khác nhau trong Phụ lục B (nó khả dụng trên
Windows, macOS, Linux).
Nếu bạn thích một số trình editor khác, cứ thoải mái
cài đặt nó thay cho Mu. Đừng ngại thử nghiệm!
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Erik bấm nút, rồi đột nhiên một cửa sổ khác nhảy ra hỏi
cậu có muốn lưu chương trình không. Điều này thật dễ
dàng. Erik gõ tên file: "coffeeshop" và sẵn sàng nhấn
ENTER để lưu tệp bỗng Simon hô:
"Đợi đã, đợi đã... Đừng quên thêm đuôi .py vào tên file.
Em phải cho trình soạn thảo editor biết rằng đó là một
chương trình Python. Trình soạn thảo Mu sẽ tự động
thêm đuôi của tệp, nhưng các trình soạn thảo khác thì
không. Vì vậy, hãy đảm bảo tất cả các tệp Python của em
được đặt thêm đuôi .py."
Erik viết thêm .py vào tên file và save lại. Ngay sau đó,
cậu nhận thấy có một cửa sổ khác ở cuối cửa sổ của
trình soạn thảo. Chính là là lời chào của quán cà phê –
đúng hệt như cậu muốn!
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Trong trường hợp của chúng ta," Simon tiếp tục, "Hãy
bắt đầu với một hộp tên là ‘answer’ - answer và lưu trữ
bất cứ thứ gì em nghe từ khách hàng vào trong hộp đó.
Ví dụ em hỏi tên của khách hàng và họ trả lời 'Alex'. Em
đặt câu trả lời này vào hộp có tên ‘answer’ và giữ nó tại
đây. Khi nào khách hàng muốn in ra, em nói với Python:
'vui lòng in bất cứ thứ gì hiện có trong hộp có tên
‘answer’. Tên khách hàng tiếp theo là Emily, bây giờ thì
em điền 'Emily' vào ô. Và lần tới, Python sẽ in ‘Emily'
không phải 'Alex' bởi vì đó là nội dung trong ô ‘answer’.
Bây giờ hãy viết code vào đây."
"Làm luôn ở đây, trong cùng một tệp này ạ?" Erik hỏi.
"Chắc chắn rồi, hãy tiếp tục trong cùng một tệp. Để lấy
nội dung nào đó từ khách hàng, ta sử dụng hàm có tên
là input(). Khi em gọi hàm này, nó sẽ đợi người dùng
nhập nội dung vào. Người dùng nhập nội dung trên bàn
phím và nhấn ENTER. Sau đó hàm trả về - returns nội
dung là những gì người dùng đã nhập”.
“Đợi đã,” Erik ngăn Simon lại. "Trả về có nghĩa là gì? Mà
này, anh đang nói về hàm. Tất nhiên, em biết chúng là
gì, nhưng anh nói cho em biết 'hàm' có ý nghĩa là gì đi?"
Erik không muốn thể hiện rằng cậu hầu như chẳng còn
nhớ gì về các hàm từ khóa học cũ trước đó.
"Hàm là một đoạn code để làm một việc gì đó. Hầu như
bất kỳ đoạn mã nào cũng để làm một việc gì đó, nhưng
một số đoạn mã chúng ta sử dụng nhiều lần hơn những
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Cửa hàng hoa? Cửa hàng thú cưng? Hay cửa hàng đồ
chơi?
Thử chạy chương trình của bạn xem. Liệu nó có
làm giống bạn mong đợi không? Nếu chương trình
chạy chưa mượt, hãy copy nó từ trong sách hoặc
từ trang web của chúng tôi:
https://github.com/pavelanni/lets-talk-python-book và
chạy lại. Đó chính là việc bạn nên làm.
"Tuyệt vời, nó đã hoạt động rồi" Simon nói, "Nhưng hãy
làm cho chương trình thân thiện với người dùng hơn.
Có phải là em cảm thấy bối rối khi máy không nói gì mà
chỉ hiện mỗi câu 'Chào mừng' đúng không? Em nên nói
cho người dùng biết em mong đợi từ họ cái gì. Thêm
nữa, thay vì chỉ in 'Erik', em có thể thêm một cái gì đó
kiểu như 'Đây là đặt hàng của bạn, Erik'."
"Em có thể truyền chuỗi này tới hàm input() làm đối số.
Chúng ta gọi nó là chuỗi khai báo. Nó giải thích những
gì chúng ta mong đợi từ người dùng. Và trong hàm
print(), em có thể thêm chuỗi em muốn in trước biến
answer. Để anh gõ cho."
Simon đã giúp Erik thêm các chuỗi đó vào code và đây
là màn hình sau đó:
print(“Welcome to Erik’s Shop!”)
answer = input(“Please enter your name: ”)
print(“Here is your order, “, answer)
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Bây giờ," Simon tiếp tục, "Chúng ta phải hỏi khách hàng
của em về đơn đặt hàng của họ. Em nói em có cà phê và
sô cô la. Còn em cũng đã nói điều gì đó về hương vị
flavor và lớp topping phải không?"
“Vâng,” Erik nói, “Em muốn hỏi họ muốn loại topping và
hương vị nào.”
"Chà, hãy tiếp tục và hỏi họ. Em chỉ cần lặp lại cùng một
code - nhưng đừng quên thay đổi câu nhắc nhở. Và anh
nghĩ em nên in toàn bộ thứ tự ở cuối chứ không phải
sau mỗi câu hỏi. Hãy làm đi nào."
Erik đã viết code này và dừng lại ở dòng cuối cùng.
print(“Welcome to Erik’s Shop!”)
answer = input(“Please enter your name: ”)
answer = input(“Please enter your drink: ”)
answer = input(“Please enter your flavor: ”)
answer = input(“Please enter your topping: ”)
print(“Here is your order: “, answer)
"Anh bảo em đặt câu trả lời vào biến answer. Nhưng làm
sao em biết bây giờ đâu là câu trả lời cho hương vị flavor
đâu là câu trả lời cho topping?" Erik bối rối.
"Đúng anh đã bảo em đặt câu trả lời vào biến, ví dụ gọi
là 'answer'," Simon đáp. Ở đây chúng ta đến với một
trong những vấn đề khó khăn nhất trong khoa học máy
tính: đặt tên cho các biến", Anh mỉm cười. "Tất nhiên,
em không lưu trữ tất cả các câu trả lời trong biến được
gọi là answer được. Hãy sử dụng các biến khác nhau cho
các câu trả lời khác nhau và đặt cho chúng những cái tên
có ý nghĩa. Đối với tên của khách hàng, chúng ta sẽ sử
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
dụng một biến gọi là name – đặt tên dễ dàng lắm. Nếu em
hỏi về đồ uống chính, hãy đặt câu trả lời trong biến là
drink hoặc product. Đối với các câu trả lời về hương vị
flavor và topping, hãy sử dụng các biến flavor và
topping."
"Cuối cùng," Simon tiếp tục nói, "In mỗi biến trên một
dòng riêng biệt, sử dụng vài hàm print(). Cố lên nào. Anh
sẽ giúp em nếu cần thiết."
Erik gõ một loạt code và cuối cùng tạo ra như hình bên
dưới:
Listing 1.1 coffeeshop.py
print(“Welcome to Erik’s Shop!”)
name = input(“Please enter your name: ”)
drink = input(“Please enter your drink: ”)
flavor = input(“Please enter your flavor: ”)
topping = input(“Please enter your topping: ”)
print(“Here is your order: “, name)
print(“Main product: “, drink)
print(“Flavor: “, flavor)
print(“Topping: “, topping)
print(“Thanks for your order! “)
Erik kích Click Run và chương trình của anh ấy bắt đầu
chạy. Erik đã trả lời tất cả các câu hỏi và nhận được một
kết quả tốt đẹp:
Welcome to Erik’s Shop!
Please enter your name: Erik
Please enter your drink: coffee
Please enter your flavore: caramel
Please enter your topping: chocolate
Here is your order, Erik
Main product: coffee
Flavor: caramel
Topping: chocolate
Thank for your order!
>>>
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Simon chú ý đến dòng cuối cùng và khen ngợi sáng kiến
của Erik: "Thật tuyệt vời khi cảm ơn khách hàng."
“Đúng rồi, em đã thấy điều đó trên một số hóa đơn ở
quán cà phê,” Erik đáp. Cậu ta đang vui vì cậu đã làm
một cái gì đó của riêng mình ngoài những gì anh trai đã
chỉ cho.
LƯỢT CỦA BẠN Thêm nhiều lựa chọn hơn cho file.
Hãy sử dụng các biến.
Chỉnh sửa chương trình trước đó của bạn và thêm
các dòng khác vào chương trình. Một lần nữa, vui
lòng thay đổi lời nhắc và chuỗi bạn in thành thứ gì
đó phù hợp hơn với dự án cá nhân.
Thay hiển thị in ra ở đầu ra. Hãy xem đơn đặt hàng
từ những nơi bạn từng ghé thăm (quán cà phê, nhà
hàng, cửa hàng tạp hóa, cửa hàng khác). Cố gắng làm
cho hiển thị in ra ở đầu ra của bạn trông tương tự.
Sử dụng thêm các ký hiệu như |, _, =, +, và các ký hiệu
khác ở đầu ra để trông thêm thú vị.
Simon quyết định đã đến lúc kết thúc ngày hôm nay.
"Anh nghĩ rằng đó là một khởi đầu tốt cho ngày hôm
nay," Anh nói. "Hãy xem những gì chúng ta đã làm ngày
hôm nay đi. Đầu tiên, chúng ta đã cài đặt môi trường lập
trình."
“Vâng,” Erik nói. "Em thích chương trình Mu Editor này.
Nó sử dụng màu sắc để hiển thị cho các phần khác nhau
của chương trình. Và nó cũng hiển thị chuỗi của em màu
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Đầu vào không phải lúc nào cũng đến từ người dùng,"
Simon tiếp tục giảng giải. "Đôi khi không phải là tương
tác với người dùng mà chương trình lấy dữ liệu từ một
nơi khác. Ví dụ, lấy từ Internet, như kết quả thể thao
chẳng hạn. Đôi khi từ các cảm biến, như trong robot,
hoặc từ các tài liệu và hình ảnh."
"Thông thường, đầu ra không chỉ là thông tin in ra.
Trong nhóm người máy của anh, bọn anh nhận thông
tin đầu vào từ các cảm biến, rồi xử lý chúng trong bộ vi
điều khiển và đầu ra của chúng là các tín hiệu tới các
động cơ như: 'rẽ trái, tiến về phía trước.' Nhưng cấu trúc
thì giống nhau cả: đầu vào → xửlý → đa• u ra."
“Lý thuyết thế đủ rồi,” Simon nói. "Ngày mai chúng ta sẽ
làm việc để cải thiện chương trình của em."
"Nâng cấp ạ?" Erik ngạc nhiên. "Nhưng nó hoạt động tốt
rồi, đúng thế mà?"
"Điều gì sẽ xảy ra nếu người dùng của em nhập thứ gì
đó mà em không có trong cửa hàng của mình?" Simon
hỏi. "Giống như là 'xi-rô cây phong'? Em sẽ làm gì? Em
nên nói với người dùng những gì em có trong quán cà
phê và những gì họ có thể đặt hàng. Vì vậy, ngày mai
chúng ta sẽ làm việc trên menu. Ngoài ra, chúng ta sẽ
xem có việc gì cần làm trong trường hợp menu lỗi."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
● Biến
Một nơi (hộp), nơi chúng ta có thể lưu trữ một số giá trị.
Ví dụ, chúng ta có thể lưu trữ định dạng số, ký tự, chuỗi.
Một biến chỉ có thể chứa một thứ ở tại một thời điểm.
● Hàm
Một đoạn code thực hiện điều gì đó và chúng ta muốn
làm đi làm lại điều đó.
● Đối số của hàm
Thông tin mà hàm cần để thực hiện công việc.
● Để gọi một hàm
Hãy viết tên của hàm với dấu ngoặc đơn và đối số giữa
dấu ngoặc
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Họ có một thực đơn với danh sách các sản phẩm mà họ
có."
"Đúng!" Simon nói. "Một menu! Đây là những gì chúng
ta sẽ tạo hôm nay. Menu sẽ trông như thế nào cho một
quán cà phê?"
"Đó là một danh sách. Một danh sách các đồ uống chính
như cà phê, sô cô la, decaf (đồ uống khử caffein). Và một
danh sách các hương vị flavor ta có thể thêm vào. Như
là caramel, bạc hà, và những thứ khác. Và một danh sách
toppings."
"Đúng, danh sách!" Simon rất vui vì Erik đã dùng đúng
từ. "Như thế này phải không?" Rồi chả mấy chốc anh ấy
đã soạn thảo một cái gì đó trông giống một thực đơn.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Hãy tạo danh sách cho thực đơn của em. Em chỉ cần đặt
tên cho danh sách - chẳng hạn như flavor, và sau đó liệt
kê các loại hương vị của em trong ngoặc vuông. Làm
tương tự cho toppings và đồ uống chính. Đừng quên
rằng flavor, topping, đồ uống của em là chuỗi nên chúng
phải được đặt trong dấu ngoặc vuông. Em có thể bắt đầu
một tệp mới trong trình editor và gọi nó là menu.py
chẳng hạn."
Erik mở trình soạn thảo và bắt đầu gõ. Đây là kết quả
cậu làm trong vài phút.
drinks = [“chocolate”, “coffee”, “decaf”]
flavors = [“caramel”, “vanilla”, “peppermint”, “raspberry”, “plain”]
toppings = [“chocolate”, “cinnamon”, “caramel”]
“Rất tốt,” Simon nói. "Bây giờ hãy in chúng dưới dạng
menu nào."
"Chỉ là print(drinks) phải không ạ?" Erik hỏi.
"Em làm đi, nhưng nó sẽ không đẹp đâu. Thử biết liền."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Hãy viết một vòng lặp for đơn giản," Simon nói tiếp.
"Để anh viết vòng lặp đầu tiên cho em." Simon lấy bàn
phím của Erik và thêm một vài dòng vào code của cậu
ấy.
drinks = [“chocolate”, “coffee”, “decaf”]
flavors = [“caramel”, “vanilla”, “peppermint”, “raspberry”, “plain”]
toppings = [“chocolate”, “cinnamon”, “caramel”]
for d in drinks:
print(d)
Simon kích [Run] và hai anh em nhìn kết quả:
chocolate
coffee
decaf
>>>
"Bây giờ đến lượt em," Simon bảo. "Viết code giống thế
cho hai danh sách còn lại. Lưu ý rằng anh đã sử dụng
một biến khác để in các item trong danh sách.
Danh sách được gọi là đồ uống - drinks. Anh chỉ sử dụng
một chữ d cho mỗi đồ uống trong danh sách. Đây là cái
cách thông thường để đặt tên có liên quan cho biến,
chẳng hạn như drinks cho danh sách đồ uống. Nhưng mà
một biến sẽ chỉ được sử dụng cho một vòng lặp để duyệt
một danh sách, nó nên ngắn thôi, có thể chỉ một hoặc
hai ký tự. Đây không phải là quy tắc, chỉ là gõ nhanh hơn
thôi."
"Một điều quan trọng nữa," Simon tiếp tục, "Trong
Python dấu cách - space có ý nghĩa rất lớn. Em có thấy
lệnh gọi hàm print() bị dịch sang phải bốn dấu cách
không? Đây là cách chúng ta nói với Python cái gì sẽ
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
được lặp lại trong vòng lặp. Phần được dịch chuyển
được gọi là một khối. Mọi thứ em đặt trong khối này sẽ
được lặp lại cho mỗi mục – item trong danh sách. Bây
giờ chỉ gọi có một hàm, nhưng chúng ta sẽ thêm các thứ
đó sau.
"Em chắc cũng thấy rằng anh không gõ bốn dấu cách
trên bàn phím. Trình editor đã tự động làm giúp rồi. Tất
cả các chương trình editor mà em sử dụng cho Python
đều có tính năng này. Khi máy nhìn thấy dấu hai chấm
(:) chúng sẽ tự động dịch khối ở dòng tiếp theo. Nó được
gọi là 'bắt đầu một khối mới’. Bây giờ hãy tiếp tục viết
các vòng lặp."
Erik tạo thêm hai vòng lặp để in hai danh sách còn lại.
Cậu ta thích ý tưởng sử dụng biến ngắn hơn tên (đỡ phải
gõ nhiều!). Cậu cũng nhận thấy rằng trình soạn thảo đã
tự động dịch khối sau dấu hai chấm. Có ích thật!
Đây là đoạn code cậu ta đã có.
drinks = [“chocolate”, “coffee”, “decaf”]
flavors = [“caramel”, “vanilla”, “peppermint”, “raspberry”, “plain”]
toppings = [“chocolate”, “cinnamon”, “caramel”]
for d in drinks:
print(d)
for f in flavors:
print(f)
for t in toppings:
print(t)
Erik lưu chương trình lại rồi bấm nút Run.
LƯỢT CỦA BẠN: Tạo danh sách sản phẩm rồi in ra.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
i=1
for d in drinks:
print(i, d)
i=i+1
for f in flavors:
print(f)
for t in toppings:
print(t)
Anh chạy chương trình và họ nhìn thấy như hình dưới:
1 chocolate
2 coffee
3 decaf
caramel
vanilla
pepermint
raspberry
plain
chocolate
cinnamon
caramel
>>>
"Em thấy đấy: Anh đã thêm biến i. Bây giờ, đối với mỗi
item trong list, anh không chỉ in giá trị của nó mà còn cả
số của nó ra nữa. Sau đó, anh cộng một vào con số để
chuyển từ 1 sang 2, rồi từ 2 lên 3, v.v. ngay bây giờ hãy
làm đi và sửa phần còn lại," Simon nói.
Erik đã thực hiện các thay đổi:
drinks = [“chocolate”, “coffee”, “decaf”]
flavors = [“caramel”, “vanilla”, “peppermint”, “raspberry”, “plain”]
toppings = [“chocolate”, “cinnamon”, “caramel”]
i=1
for d in drinks:
print(i, d)
i=i+1
for f in flavors:
print(i, f)
i=i+1
for t in toppings:
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
print i, (t)
i=i+1
Khi cậu chạy chương trình, đầu ra hiển thị như hình:
1 chocolate
2 coffee
3 decaf
4 caramel
5 vanilla
6 pepermint
7 raspberry
8 plain
9 chocolate
10 cinnamon
11 caramel
>>>
"Đây không phải là điều em muốn!" Erik thốt lên. "Em
nghĩ nó nên là: một, hai, ba cho đồ uống, sau đó trở lại
là một, hai, ba cho phần flavor, rồi một, hai ba cho phần
toppings một lần nữa."
"Đúng rồi!" Simon đồng ý. "Em sẽ làm điều này như thế
nào?"
"Ta sử dụng một biến khác được không ạ?"
"Được, hoàn toàn làm thế được. Nhưng em vẫn có thể
sử dụng cùng một biến i. Điều quan trọng là thiết lập giá
trị nó trước mỗi vòng lặp. Ta gọi đó là xác định giá trị
ban đầu của biến."
Erik đã thêm i = 1 trước mỗi vòng lặp:
drinks = [“chocolate”, “coffee”, “decaf”]
flavors = [“caramel”, “vanilla”, “peppermint”, “raspberry”, “plain”]
toppings = [“chocolate”, “cinnamon”, “caramel”]
i=1
for d in drinks:
print(i, d)
i=i+1
i=1
for f in flavors:
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
print(i, f)
i=i+1
i=1
for t in toppings:
print(i, t)
i=i+1
LƯỢT CỦA BẠN: In ba (hoặc nhiều hơn) menu có
đánh số
Sửa đổi chương trình trước đó của bạn để đánh số
cho các mục – item trong menu.
Sử dụng vòng lặp. Đừng quên đặt lại bộ đếm vật
phẩm với mỗi danh sách mới.
Erik bấm Run và nhận được kết quả:
1 chocolate
2 coffee
3 decaf
1 caramel
2 vanilla
3 pepermint
4 raspberry
5 plain
1 chocolate
2 cinnamon
3 caramel
>>>
“Bây giờ chúng ta cùng làm cho nó đẹp hơn một chút
nhé,” Simon nói. "Thêm tiêu đề 'Đồ uống của chúng ta'
trước mỗi danh sách. Em cần nhớ, chúng ta nên cho
người dùng hiểu họ đang thấy gì và họ nên làm gì."
Erik viết thêm các tiêu đề. Thậm chí cậu còn thêm một
dòng phụ nữa dưới mỗi tiêu đề. Cậu chắc chắn rằng bản
thân sẽ làm được một thực đơn trông giống như thực
sự.
drinks = [“chocolate”, “coffee”, “decaf”]
flavors = [“caramel”, “vanilla”, “peppermint”, “raspberry”, “plain”]
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Vì vậy sau khi em biết con số, em có thể tìm thấy mục -
item trong danh sách. Và em có thể in 'Đây là đơn đặt
hàng của bạn' như em đã làm ngày hôm qua, còn bây giờ
em lấy những item đó từ menu đi. Thử làm xem nào, anh
sẽ giúp em khi cần thiết."
Nó khó hơn một tý rồi. Erik nhìn vào chương trình ngày
hôm qua và sao chép các dòng rồi đặt xuống cuối
chương trình. Tiếp theo, cậu sửa các biến như drink
thành cấu trúc lệnh như Simon đã hướng dẫn.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Vậy em nên làm gì bây giờ?" Erik hỏi. Cậu nghĩ rằng
mình đã hiểu lời giải thích của Simon, nhưng cậu ta vẫn
khó chịu vì sự bất tiện này.
"Anh thấy rằng em đang khó chịu," Simon nói. "Đừng lo
lắng, chả mấy rồi em sẽ quen với nó thôi. Rồi em sẽ,
giống như tất cả các lập trình viên thực thụ khác, bắt
đầu đếm mọi thứ từ con số không," Simon mỉm cười.
"Bây giờ em chỉ cần trừ 1 ở mỗi index trong ngoặc
vuông. Nhưng hãy cẩn thận: em phải thêm - 1 sau khi
em chuyển đổi đầu vào của mình thành số nguyên, chứ
không phải để nguyên định dạng như trước đó. Giống
thế này nhé: drinks [int(drink)-1]."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Erik đã sửa code của mình và bây giờ nó trông như hình
sau:
drinks = [“chocolate”, “coffee”, “decaf”]
flavors = [“caramel”, “vanilla”, “peppermint”, “raspberry”, “plain”]
toppings = [“chocolate”, “cinnamon”, “caramel”]
print(“Erik’s Coffee Shop drinks”)
print(“----------------------”)
i=1
for d in drinks:
print(i, d)
i=i+1
drink = input(“Choose your drink: ”)
print(“Erik’s Coffee Shop flavors”)
print(“-----------------------”)
i=1
for f in flavors:
print(i, f)
i=i+1
flavor = input(“Choose your flavor: ”)
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
list - chỉ mục danh sách bắt đầu bằng 0, nhớ đấy
nhé?
Erik chạy chương trình, nhập 2, 1, 1 và cuối cùng đã có
được thứ mình muốn:
Here is your order:
Main product: chocolate
Flavor: caramel
Topping: chocolate
Thank for your order!
>>>
"Tuyệt vời! Nó hoạt động rồi!" Erik chắc chắn đang rất
vui. "Em yêu chương trình quán cà phê rồi đấy! Chúng
ta đã xong nó chưa ạ?"
“Gần xong rồi” Simon trả lời. "Ta nhìn lại xem nào, em
đã viết gần như chính xác cùng một đoạn code những
ba lần."
"Liệu có gì sai ở đó không ạ?"
"Thử tưởng tượng thế này, tự dưng em muốn thay đổi
điều gì đó trong đoạn code của mình. Ví dụ: thay đổi
cách in các item trong menu. Em sẽ phải thay đổi nó ở
cả ba chỗ. Hoặc thậm chí ở nhiều chỗ hơn nữa nếu em
quyết định thêm list menu khác. Giả sử em muốn thêm
món tráng miệng - desserts vào quán cà phê của mình
đi. Điều đó có nghĩa là em sẽ phải sao chép đoạn code
này một lần nữa. Liệu điều gì sẽ xảy ra nếu em mắc lỗi
trong mã? Lập trình viên gọi chúng là bọ - bug (anh sẽ
cho em biết lý do sau). Thế là, em sẽ phải sửa lỗi đó ở
bốn chỗ, tự làm lặp đi lặp lại. Các lập trình viên tôn thờ
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
nguyên tắc DRY: Đừng lặp lại chính mình [Viết tắt của
cụm từ này Don’t Repeat Yourself]."
“Nhưng em không hiểu sẽ phải làm thế nào,” Erik thấy
bối rối. "Em có ba danh sách - list menu, em phải in ba
lần. Và em phải yêu cầu người dùng nhập dữ liệu ba
lần."
"Chúng ta có thể sử dụng một hàm ở đây," Simon giải
thích. "Em còn nhớ khi chúng ta bắt đầu sử dụng hàm
print(), anh đã nói rằng đối với các thao tác mà chúng ta
phải lặp đi lặp lại, chúng ta sẽ sử dụng hàm. Bấy đến giờ
chúng ta toàn dùng hàm người ta viết. Giờ thì chúng ta
sẽ tạo hàm của riêng mình rồi dùng ngay nó."
"Điều này hay đấy, em thích nó" Erik nói.
"Được rồi, hãy làm việc đó vào ngày mai. Anh nghĩ hôm
nay chúng ta đã làm đủ rồi. Em làm tốt lắm, Erik," Simon
thực sự vui mừng vì em trai mình đang tiến bộ. "Hãy
tóm tắt lại những gì chúng ta đã học hôm nay. Điều đầu
tiên là gì?"
“Đầu tiên, chúng ta tạo danh sách,” Erik đáp."Chúng ta
đưa tất cả drink, flavor and toppings vào danh sách."
"Tốt, tiếp theo là gì?"
"Sau đó, chúng ta in các danh sách bằng cách sử dụng
các vòng lặp. Rồi chúng ta in các con số thứ tự bên cạnh
mỗi đồ uống drink hoặc hương vị flavor."
"Đúng, chính xác" Simon xác nhận. "Tiếp đi em, sau đó
là cái gì?"
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Hôm qua chúng ta dừng ở đâu nhỉ?" Simon hỏi Erik vào
ngày hôm sau.
"Anh nói rằng em không nên lặp lại. Và anh cũng nói
rằng chúng ta sẽ viết hàm riêng trong ngày hôm nay."
"Phải! Trước tiên, hãy cho anh biết những gì em biết về
hàm cho đến giờ này."
“Chúng ta đã sử dụng một vài hàm rồi,” Erik bắt đầu trả
lời. "Chúng ta dùng print() và intput() . Anh đã nói rằng
ai đó đã viết chúng để chúng ta sử dụng. Chúng ta có thể
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
sử dụng đối số với hàm. Chúng ta chỉ cần đặt chúng vào
giữa dấu ngoặc đơn và hàm sẽ làm điều gì đó với các đối
số, như là in chúng ra."
"Mọi thứ đều đúng! Em là một học sinh tuyệt vời!"
Simon mỉm cười. “Điều quan trọng về hàm là chúng có
thể làm điều tương tự cho các đối số khác nhau. Bởi thế
mà, nếu em thấy rằng một thứ đang cần làm đi làm lại
nhiều lần, em nên xem xét liệu nó có thể biến thành một
hàm không. Để quyết định, em cần xem mã code lặp của
mình và tự hỏi bản thân phần nào là giống nhau và phần
nào khác nhau. Đoạn code của em ngày hôm qua đâu
rồi?"
“Đây ạ,” Erik mở tập tin menu.py trong trình editor.
drinks = [“chocolate”, “coffee”, “decaf”]
flavors = [“caramel”, “vanilla”, “peppermint”, “raspberry”, “plain”]
toppings = [“chocolate”, “cinnamon”, “caramel”]
print(“Erik’s Coffee Shop drinks”)
print(“----------------------”)
i=1
for d in drinks:
print(i, d)
i=i+1
drink = input(“Choose your drink: ”)
print(“Erik’s Coffee Shop flavors”)
print(“-----------------------”)
i=1
for f in flavors:
print(i, f)
i=i+1
flavor = input(“Choose your flavor: ”)
i=i+1
topping = input(“Choose your topping: ”)
print(“Here is your order: “)
print(“Main product: “, drinks[int(drink)-1])
print(“Flavor: “, flavors[int(flavor)-1])
print(“Topping: “, toppings[int(topping)-1])
print(“Thanks for your order! “)
"Hãy nhìn nè: điều gì đang lặp lại ở đây?" Simon hỏi và
bắt đầu vẽ sơ đồ các dòng code của Erik.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Các hàm trong Python bắt đầu bằng từ def theo sau là
tên của hàm,” Simon tiếp tục. "Hãy mở hàm menu của
chúng ta. Sau đó, em mở dấu ngoặc đơn và liệt kê các
đối số của mình."
Erik gõ def menu (và không chắc phải làm gì tiếp theo).
Simon ra tay giúp đỡ: "Chúng ta vừa nhắc tới những đối
số argument. Anh biết em đang nghĩ cách đặt tên cho
chúng. Hãy nhớ rằng, đặt tên biến và đối số là một trong
những vấn đề khó khăn nhất trong khoa học máy tính?
Em không cô đơn đâu. Hãy đặt tên cho chúng: choices,
title và prompt (lựa chọn, tiêu đề và dòng nhắc nhập
liệu.) Chỉ cần nhập chúng vào giữa các dấu ngoặc đơn và
đặt dấu hai chấm sau dấu đóng ngoặc."
Erik gõ như sau:
def menu(choices, title, prompt):
Cậu nhận thấy rằng sau khi nhấn ENTER, con trỏ di
chuyển đến dòng tiếp theo, thụt vào bên phải bốn dấu
cách space. "Em có nên viết ở đây không?" Cậu hỏi
Simon.
"Hoàn toàn được!" Simon đáp. "Em thấy đấy: trình biên
tập đang giúp em viết hàm! Bây giờ nhìn vào code ngày
hôm qua của em và bắt đầu sao chép những gì em muốn
đưa vào hàm. Nhìn nè: đầu tiên chúng ta in tiêu đề. Nào
chúng ta cùng làm điều đó ở đây, nhưng thay vì chuỗi
thực tế, chúng ta chỉ in đối số có tên là tiêu đề. Kể cả em
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
có đặt một đống dấu gạch ngang sau nó, giống như em
đã làm trước đây cũng được."
Erik gõ:
def menu(choices, title, prompt):
print(title)
print(“--------------------")
"Bây giờ hãy viết vòng lặp đi" Simon hướng dẫn.
"Nhưng thay vì đồ uống hoặc hương vị, danh sách của
em hiện được gọi là choices. Và em có thể sử dụng biến
c trong vòng lặp, là chữ cái đầu tiên của 'lựa chọn' ấy."
Erik đã sao chép vòng lặp từ đoạn code đã viết trước đó.
Cậu ấy đã có ý tưởng rồi, cậu thêm hàm input() với lời
nhắc prompt mà không cần hỏi anh trai mình.
def menu(choices, title, prompt):
print(title)
print(“--------------------")
i=1
for c in choices:
print (i, c)
i = i+1
choice=input(prompt)
"Tuyệt quá!" Simon nói khi nhìn thấy code của Erik.
“Bây giờ chúng ta phải trả về choice."
"Có phải chúng ta không thể in biến choice trong chương
trình chính ạ?" Erik hỏi.
"Không được! Đây cũng là một điều rất quan trọng về
hàm," Simon rất vui vì Erik đã hỏi câu này.
"Các biến em có bên trong hàm chỉ thấy được trong hàm
thôi. Nhìn kỹ đi nè, anh sẽ vẽ một bức tranh."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
dài của nó. Anh chắc rằng bây giờ em đã biết cách thực
hiện thế nào rồi."
Erik gõ vào cửa sổ REPL và nhận được kết quả:
In[4]: s = ‘hello’
In[5]: len(s)
Out[5]: 5
“Tốt,” Simon nói. "Chắc giờ em đã hiểu nếu em có một
sợi dây, em luôn biết được độ dài của nó. Hơn nữa, em
có thể lấy độ dài của danh sách theo cách này. Tạo một
danh sách các số: 1, 2, 3 và lấy chiều dài. Gọi nó là n
chẳng hạn."
Erik gõ:
In[6]: n = [1, 2, 3]
In[7]: len(n)
Out[7]: 3
“Chúng ta sẽ sử dụng nó sau, còn bây giờ để anh chỉ cho
em một mẹo,” Simon tiếp tục giảng giải. "Python sẽ cho
ta cái gì nếu em yêu cầu nó lấy số 2 và nhân nó với 2?"
"4?" Erik không chắc đó có phải là một câu hỏi mẹo hay
không. Câu hỏi đơn giản quá.
"Phải. Python sẽ cho em cái gì nếu em lấy một chữ cái
'A' và nhân nó với 2?"
"Em không biết? 2A, có lẽ vậy chăng?
"Làm đi nào và thử với Python interactive xem sao!"
Simon gợi ý.
Erik gõ và nhận được kết quả:
In[8]: 2*’A’
Out[8]: ‘AA’
"Hấp dẫn thật đấy!" Erik ngạc nhiên.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Bây giờ nếu em lấy dấu gạch ngang thay vì 'A' và nhân
với 10 thì sao?"
Erik bắt đầu phỏng đoán xem Simon đang dẫn mình đến
đâu và cậu gõ:
In[9]: 10*’-’
Out[9]: ‘----------'
"Và bây giờ hãy thay thế số 10 bằng độ dài của chuỗi
'hello'."
Erik đã hiểu được ý của Simon và cậu gõ máy:
In[10]: len(‘hello’)*’-’
Out[10]: ‘-----’
LƯỢT CỦA BẠN: Sử dụng REPL và thử nghiệm với
hàm len()
Bắt đầu REPL bằng cách kích vào biểu tượng của nó
trong Editor. Lặp lại tất cả các thử nghiệm của Erik.
Thử nhân một số với một chuỗi gồm hai hoặc ba chữ
cái. Liệu bạn có đoán đầu ra sẽ là gì không?
"Em thấy rõ rồi chứ!" Anh hỏi. "Chúng ta lấy đối số là
title, chúng ta tính toán độ dài của nó và chúng ta in
dòng gạch ngang có cùng kích thước y hệt!"
"Liệu bây giờ em có sửa hàm được không?" Simon hỏi.
"Vâng, chắc chắn được, em biết phải làm gì rồi!" Erik bắt
đầu gõ lệnh. Cậu ấy chỉ thay đổi dòng thứ ba (tìm nhãn
1) và bây giờ hàm trông như hình bên dưới:
def menu(choices, title, prompt):
print(title)
print(len(title)*’-‘)
i=1
for c in choices:
print (i, c)
i = i+1
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
choice=input(prompt)
answer=choices[int(choice)-1]
return answer
LƯỢT CỦA BẠN: Sửa hàm để in đúng độ dài của
dòng gạch ngang
Thực hiện chỉnh sửa trong chương trình để in đúng
số dấu gạch ngang, giống hệt với những gì Erik vừa
làm. Hãy thử dùng một ký hiệu khác (dấu bằng =
hoặc dấu gạch dưới _ hoặc ký hiệu khác).
Cậu ấy đã thử nghiệm chương trình chính và bây giờ tất
cả các dòng gạch ngang đều có cùng kích thước với tiêu
đề.
Simon nhận xét, "Bây giờ em thấy rằng không chỉ kết
quả hàm của em trả về phụ thuộc vào các đối số, mà
ngay cả những gì nó in ra cũng phụ thuộc như thế."
"Phân tích các đối số mà em nhận được trong hàm luôn
là một ý kiến hay," Simon tiếp tục. "Trong trường hợp
này, chúng ta đã kiểm tra độ dài của tiêu đề. Hàm của
em sẽ làm gì nếu nhận được một chuỗi rỗng có độ dài
bằng 0?"
“Em không biết,” Erik trả lời. "Em nghĩ nó sẽ in ra một
chuỗi rỗng, chuỗi không có gì."
“Đúng thế” Simon đáp. "Có lẽ chúng ta vẫn nên in ra một
cái gì đó hợp lý, ngay cả khi tiêu đề là là rỗng. Có thể chỉ
là một từ 'Menu' và một dòng gạch ngang. Đối với những
trường hợp như vậy trong Python, chúng ta có các giá
trị mặc định cho các đối số của hàm. Trong hàm của em,
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
anh sẽ thay đổi dòng đầu tiên thành thế này," Simon
chỉnh sửa tệp của Erik:
def menu(choices, title=”Erik’s Menu”, prompt=”Choose your item: ”):
"Trong trường hợp này, chúng ta nói với Python, title
nhận giá trị nếu có đối số. Còn nếu em không sử dụng
đối số khi gọi hàm ra, thì hãy sử dụng giá trị mặc định,
chỉ cần gán là 'Menu' cũng được. Chương trình thường
khuyến nghị đặt giá trị mặc định. Em có thể thay đổi
chúng thành cái khác khi em gọi hàm."
"Hãy test nó đi" Simon gợi ý. "Lần gọi đồ uống đầu tiên,
hãy xóa cả tiêu đề và lời nhắc hướng dẫn. Chỉ để lại đồ
uống là một đối số duy nhất." Erik làm theo gợi ý của
Simon và bây giờ lời gọi hàm lần đầu tiên trông như thế
này:
drink = menu(drinks)
Cậu chạy lại chương trình và nhìn thấy menu đầu tiên:
Erik’s Menu
----------
1 chocolate
2 coffee
3 decaf
Choose your item:
Đây là chương trình đầy đủ của Erik.
Listing 3.1 menu_function.py
def menu(choices, title=”Erik’s Menu”, prompt=”Choose your item: ”):
print(title)
print(len(title)*“-")
i=1
for c in choices:
print (i, c)
i = i+1
choice=input(prompt)
answer=choices[int(choice)-1]
return answer
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
giờ - hãy nghỉ ngơi một chút! Hôm nay, em thực hiện tốt
rồi!
● Hàm
Là một đoạn code lập trình được sử dụng (được gọi)
nhiều lần. Một hàm hoặc do bạn hoặc do người khác
viết. Nếu nó được viết bởi người khác thì nó thường là
một phần của thư viện hoặc một modules trong Python.
● Đối số
Là các biến mà chúng ta truyền vào hàm khi chúng ta
gọi nó. Hàm lấy các đối số và sử dụng chúng để chuẩn bị
đầu ra. Đầu ra có thể được in hoặc trả về chương trình
chính.
● REPL
Là Read-Eval-Print-Loop, một cách để chạy Python
tương tác. Nó rất hữu ích để kiểm tra nhanh một hàm.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
4
Lỗi người dùng: Ai cũng có thể mắc lỗi
“Hôm qua em làm tốt lắm, Erik ạ” Simon tiếp tục hướng
dẫn vào ngày hôm sau. "Em đã viết một hàm hữu ích,
em đã thêm các đối số mặc định, em đã test thử."
“Vâng,” Erik trả lời. "Em nghĩ đó là một chương trình
hay. Em muốn cho bạn bè xem!"
“Từ từ đã” Simon nói. "Anh nghĩ nó chưa sẵn sàng để sử
dụng đâu."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Anh làm cái gì đấy???" Erik đã rất tức giận. "Anh phải
nhập số chứ đừng nhập chữ!"
"Nhưng em đưa cho anh một danh sách và hỏi anh
muốn gì mà. Anh muốn cà phê nên anh đã nhập 'cà phê'.
Làm sao vậy?" Simon cố tỏ ra ngây thơ nhưng anh
không thể giấu được nụ cười của mình.
"Haizz, đối với những người dùng ngu ngốc như vậy, em
sẽ viết IN HOA bảo rằng nên nhập MỘT CON SỐ!" Erik
càu nhàu.
"Được, được, để anh thử lại," Simon hỏi. Anh ấy bắt đầu
lại chương trình và ở menu đầu tiên anh gõ: "42".
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Lại nữa?? Anh tính tạo lỗi à??" Erik đã sẵn sàng đập vào
tay Simon trên bàn phím. "Anh không thấy rằng chỉ có
ba sự lựa chọn sao? Tại sao anh nhập 42??"
"Thứ nhất, vì 42 là con số yêu thích của anh. Thứ hai,
đúng vậy, anh biết đó là lỗi của anh. Em biết mà – một
người dùng mắc lỗi. Nghiêm túc mà nói, anh muốn cho
em thấy rằng chương trình của em cần sẵn sàng cho sai
lầm. Em có thể in bất cứ thứ gì em muốn, viết hoa toàn
bộ, nhưng vẫn sẽ có những người dùng không đọc nó.
Vẫn có những người dùng mắc sai lầm."
"Trường hợp này em nên làm gì?" Erik vẫn còn tức giận
với anh trai mình, nhưng cậu ấy có xu hướng đồng ý với
ông anh. Chính cậu tạo nên một chương trình có lỗi.
"Em nên kiểm tra những gì người dùng nhập vào và
thông báo cho họ nếu thông tin nhập sai. Hãy nghĩ xem
chúng ta có thể làm gì chỗ này.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
nhặt lấy item trong list lựa chọn. Nếu không phải vậy,
chúng ta cần nói với người dùng rằng có gì đó không
đúng ở đây."
"Vâng, em nhớ rồi, chúng ta có thể sử dụng if-else trong
Python," Erik đề xuất.
"Được rồi, thử chút đi," Simon nói. "Em sẽ làm điều đó
như thế nào? Hãy giải thích cho anh coi như anh chưa
biết gì về if-else nhé.”
"Em sẽ thêm vào chức năng thế này: 'Nếu lựa chọn của
người dùng là 1, hoặc 2 hoặc 3, thì hãy tiếp tục và sử
dụng nó. Nếu không (else), hãy in ra thông báo người
dùng nên nhập một trong những số trên'."
"Được, cùng nhau soạn code nào" Simon nói.
Erik mở trình soạn thảo lên và thay đổi hàm (bốn dòng
ngay trước return):
def menu(choices, title=”Erik’s Menu”, prompt=”Choose your item: ”):
print(title)
print(len(title)*’-‘)
i=1
for c in choices:
print (i, c)
i = i+1
choice=input(prompt)
if choice==’1’ or choice==’2’ or choice==’3’:
answer=choices[int(choice)-1]
else:
print(“Enter number 1, 2 or 3!”)
return answer
"Bây giờ hãy test nó," Simon nói.
Erik bắt đầu chương trình và tại menu đầu tiên cậu gõ:
"2".
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
for c in choices:
print (i, c)
i = i+1
choice=input(prompt)
if choice==’1’ or choice==’2’ or choice==’3’:
answer=choices[int(choice)-1]
else:
print(“Enter number 1, 2 or 3!”)
answer=’’
return answer
LƯỢT CỦA BẠN: Kiểm tra answer của người dùng
Ở trong hàm menu của bạn, hãy thêm code mà Erik
vừa thêm vào. Kiểm tra xem nó đã thực kiểm tra câu
trả lời của bạn hay chưa.
Cậu ấy đã test lại chương trình và lần này nó không báo
lỗi nữa. Nó in thông báo Hãy nhập số 1,2 hoặc 3! và
chuyển sang menu tiếp theo.
"Em có nghĩ rằng chương trình đã làm đúng chưa?"
Simon hỏi.
“Nó đã in câu bạn nên nhập 1, 2 hoặc 3” Erik trả lời. “Em
nghĩ đúng rồi”
"Mà em chưa nhận được lựa chọn đồ uống của người
dùng. Nếu họ nhập sai số, em nên cho họ cơ hội nhập
đúng. Đây không phải là một bài kiểm tra như ở trường
mà em chỉ có một cơ hội để trả lời. Em nên tiếp tục hỏi
người dùng cho đến khi em nhận được một trong những
câu trả lời đúng."
"Có cách nào làm được như thế ạ?" Erik hỏi.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
điều kiện. Nếu không thì vòng lặp sẽ tiếp tục mãi mãi và
chúng ta không muốn điều đó.”
"Sau khi hoàn thành 'điều gì đó', chúng ta quay lại đầu
vòng lặp và kiểm tra lại điều kiện. Nếu điều kiện vẫn
đúng, chúng ta lặp lại 'điều gì đó'. Nếu không, đó là phần
cuối của vòng lặp và chúng ta nhảy ra ngoài đó để tiếp
tục chương trình.”
"Hãy xem ví dụ đơn giản này: chúng ta muốn đếm
ngược từ năm đến không. Đầu tiên, chúng ta đặt biến n
bằng năm và khi bắt đầu vòng lặp, chúng ta kiểm tra
xem nó có lớn hơn 0 không. Rồi, nó lớn hơn, vậy chúng
ta bắt đầu vòng lặp. Nhớ là điều kiện phải thay đổi tại
một chỗ nào đó, nếu không thì vòng lặp sẽ không bao
giờ kết thúc. Trong ví dụ này, chúng ta trừ 1 cho mỗi lần
đi qua vòng lặp. Cuối cùng biến n sẽ bằng 0 và vòng lặp
sẽ dừng lại.
"Điều quan trọng là trong trường hợp này, trước khi
chúng ta bắt đầu vòng lặp, chúng ta đã biết giá trị của
biến và chúng ta biết rằng nó lớn hơn 0.
"Điều gì sẽ xảy ra nếu chúng ta không biết những gì
trong biến hoặc thậm chí không tồn tại cả biến nữa?
Như trong trường hợp này: chúng ta chỉ có thể kiểm tra
câu trả lời của người dùng sau khi chúng ta yêu cầu
chọn một trong các item từ menu. Vì vậy, chúng ta phải
làm thế này" Rồi Simon vẽ ra một sơ đồ khác.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Simon tiếp tục giải thích: "Ở đây chúng ta bắt đầu vòng
lặp mà không cần kiểm tra bất kỳ điều kiện nào. Chúng
ta làm điều gì đó trước và sau đó chúng ta mới kiểm tra
điều kiện. Đôi khi vòng lặp này được gọi là 'do-until', có
nghĩa là 'làm điều gì đó cho đến khi điều kiện là true'.
Khi điều kiện là đúng, thoát khỏi vòng lặp và tiếp tục với
phần còn lại của chương trình.
Trong ví dụ ở đây, anh đã sử dụng tình huống của em
với input(). Em yêu cầu đầu vào, sau đó em kiểm tra đầu
vào đó. Đây là điều kiện của em: nếu đầu vào hợp lệ, em
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Erik làm theo gợi ý của anh trai và thấy điều này:
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Nút Kiểm tra - Check hiển thị biểu tượng ngón tay
cái màu xanh lá cây hiện lên lúc này khiến Erik biết là
đã ổn rồi. Cậu bấm Run để chạy thử chương trình. Ở
menu đầu tiên, cậu nhập '42' giống như Simon đã làm
lần trước. Chương trình thông báo cậu nên chọn một số
1, 2 hoặc 3 và quay lại dấu nhắc lệnh một lần nữa! Nó
không tiêu tùng mà đã hoạt động rồi!
"Mỗi lỗi nữa mà anh Simon đã làm với chương trình
mình là gì nhỉ?" Erik cố nhớ lại. "Đúng rồi, anh ấy đã
từng nhập từ 'cà phê'! Nào thử nào."
Cậu ấy nhập từ 'cà phê' và chương trình đã phản hồi như
mong đợi! Cuối cùng Erik gõ '2' và menu tiếp theo hiện
ra. Đây là những gì cậu ấy nhìn thấy trong cửa sổ soạn
thảo (Chúng ta đánh dấu đầu vào của Erik bằng chữ in
đậm):
Erik’s Menu
----------
1 chocolate
2 coffee
3 decaf
Choose your item: 42
Enter number 1, 2 or 3!
Choose your item: coffee
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Enter number 1, 2 or 3!
Choose your item: 2
Erik’s flavor
-----------
Ở menu tiếp theo, anh ấy gõ 4 chọn Raspberry và nhận
được thông báo tương tự:
Erik’s flavor
-----------
1 caramel
2 vanilla
3 pepermint
4 raspberry
5 plain
Choose your flavor: 4
Enter number 1, 2 or 3!
Choose your flavor:
"Tại sao lại thế?" Cậu hỏi anh Simon.
"Chương trình của em hoạt động chính xác như em đã
viết." Simon đáp. Tất nhiên, anh biết vấn đề nằm ở đâu.
"Em đã viết điều kiện của em như thế nào?" anh ấy hỏi.
Erik nói: "Nếu đáp án là 1, 2 hoặc 3. A ha, hiểu rồi! Mình
nhập '4' nên chương trình tưởng có sai lầm! Cần sửa thế
nào bây giờ ạ?"
“Có vẻ như chúng ta cần một danh sách các câu trả lời
hợp lệ cho mỗi danh sách thực đơn,” Simon nói. "Em có
thể chuyển nó sang đối số khác. Nhưng anh cho là em
đã đủ hiểu biết để cho một giải pháp tốt hơn."
"Cái gì ạ?" Erik hỏi lại. "Lại là vòng lặp một cái gì đó phải
không ạ?"
“Không chỉ vậy thôi đâu” Simon trả lời. "Chúng ta cũng
sẽ học điều gì đó mới về danh sách - list. Ừm, anh thấy
rằng em đã chán ngấy những bài giảng này rồi, nào hãy
cùng nhau kết thúc luôn trong hôm nay. Nó sẽ lại giúp
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Chỗ này cần giải thích một chút" anh nói. "Nhìn nè,
người dùng nhập một chuỗi có thể là '1' cũng có thể là
'42'. Chúng ta kiểm tra xem chuỗi này có nằm trong
danh sách các câu trả lời được phép hay không, tức là 1,
2, 3. Nếu nó không có trong danh sách, thì chúng ta in
thông báo lỗi và tiếp tục với vòng lặp. Nếu nó nằm trong
danh sách các câu trả lời được phép, thì chúng ta chuyển
đổi nó và chọn item đó từ danh sách menu."
“Vâng, em hiểu rồi” Erik nói. "Thế còn lỗi ở menu thứ
hai mà em gặp thì xử lý sao? Nó không cho em chọn số
4 vì nó không có trong điều kiện if của em. Với cách sửa
của anh vừa xong, em vẫn gặp vấn đề tương tự. Em có
năm flavor, vì vậy em cần một list danh sách các câu trả
lời khác ở đây, có phải thế không ạ?"
"Câu hỏi hay lắm!" Simon đáp. "Anh vừa định tự đưa ra
câu hỏi đấy. Đúng, em nói đúng. Mỗi danh sách thực đơn
nên có danh sách các câu trả lời được phép của riêng nó.
Chẳng phải là vấn đề lớn đâu; luôn xây dựng được một
list trả lời khi chúng ta biết danh sách thực đơn của
mình có gì. Để anh viết nó trước rồi sẽ giải thích từng
bước một." Simon đã thêm ngay các dòng vào trước
khối if mà anh ấy gõ trước đó:
…
while True:
choice=input(prompt)
allowed_answers=[]
for a in range(1, len(choices)+1) :
allowed_answers.append(str(a))
if choice in allowed_answers :
answer=choices[int(choice)-1]
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
break
else:
print(“Enter number 1, 2 or 3!”)
answer=’’
…
"Đầu tiên (xem nhãn 1), chúng ta tạo một list trống cho
các câu trả lời được phép. Sau đó (nhãn 2), chúng ta đo
độ dài của danh sách menu bằng hàm len(). Kết quả với
đồ uống sẽ là ba và với hương vị sẽ là năm. Sau đó,
chúng ta sử dụng hàm range() để tạo một dãy số từ 1
đến số chiều dài của menu. Đối với đồ uống, chuỗi sẽ là
1, 2, 3. Đối với hương vị sẽ là 1, 2 , 3, 4, 5. Em hiểu chưa.
Chỉ cần lưu ý rằng trong hàm range() chúng ta không
đếm được phần tử cuối cùng, coi như phần tử cuối cùng
không được bao gồm trong dãy. Đó là lý do tại sao chúng
ta phải thêm một vào độ dài của menu như thế này:"
len(choices)+1
"Và cuối cùng trong vòng lặp này (nhãn 3), chúng ta
chuyển đổi từng số trong dãy thành chuỗi và thêm số
đó vào vị trí cuối của list tên là allowed_answers. Hàm
này được gọi là append()." Simon giải thích một hồi rồi
lại nói thêm: "Ừm, lần đầu tiên nó hơi phức tạp, mà hãy
gắng tự mình đọc code Python đoạn này rồi em sẽ hiểu
nó như thể nó là tiếng Anh bình thường thôi."
"Bây giờ chúng ta phải thay đổi danh sách lấy giá trị sẵn
với 1, 2, 3 thành danh sách các câu trả lời được phép
allowed_answers vừa được tạo ra"
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Simon sửa code xong. Anh ngắm nghía đoạn code rồi vỗ
trán: "Ồ, mình biết ngay mà!"
"Gì thế anh?" Erik nghĩ rằng công việc đã hoàn thành rồi,
mà có vẻ như lại có một cái gì đó khác xảy ra.
“Chúng ta cũng cần thay đổi dòng thông báo nữa,”
Simon nói. "Vì hiện giờ hàm của chúng ta có thể chấp
nhận danh sách menu có độ dài bất kỳ, nên chúng ta nên
nói với người dùng những điều như: 'Hãy nhập số từ 1
đến 6' hoặc 'từ 1 đến 12', theo độ dài của menu. Hãy nhớ
cách chúng ta lấy độ dài của một danh sách?"
"Dùng hàm len() ạ?" Erik hỏi.
"Đúng rồi!" Simon đáp, rồi thực hiện thay đổi cuối cùng
trong hàm. Bây giờ nó trông như thế này:
def menu(choices, title=”Erik’s Menu”, prompt=”Choose your item: ”):
print(title)
print(len(title)*’-‘)
i=1
for c in choices:
print (i, c)
i = i+1
while True:
choice=input(prompt)
allowed_answers=[]
for a in range(1, len(choices)+1) :
allowed_answers.append(str(a))
if choice in allowed_answers :
answer=choices[int(choice)-1]
break
else:
print(“Enter number from 1 to”, len(choices)”)
answer=’’
return answer
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
thấy rằng bằng cách này nó không phải là một phần của
vòng lặp."
Đây là phiên bản mới cho hàm menu của Erik:
def menu(choices, title=”Erik’s Menu”, prompt=”Choose your item: ”):
print(title)
print(len(title)*’-‘)
i=1
for c in choices:
print (i, c)
i = i+1
while True:
choice=input(prompt)
allowed_answers=[]
for a in range(1, len(choices)+1) :
allowed_answers.append(str(a))
allowed_answers.append(‘X’)
if choice in allowed_answers :
answer=choices[int(choice)-1]
break
else:
print(“Enter number from 1 to”, len(choices)”)
answer=’’
return answer
“Đẹp rồi” Simon nói. "Anh thêm luôn một chữ 'x'
thường, bởi vì hầu hết mọi người sẽ gõ như thế. Nếu
người dùng gõ 'x' tất chúng ta nên làm gì bây giờ?"
"Có phải là sẽ thoát khỏi vòng lặp menu?" Erik nói.
"Đúng rồi! Nhưng chúng ta sẽ trả về cái gì cho chương
trình chính? Thông thường, chúng ta trả về lựa chọn của
người dùng từ menu: cà phê hoặc sô cô la hoặc cái gì đó.
Nếu người dùng gõ 'x' tất thì sao? Chúng ta nên trả lại
cái gì?"
"Không có gì cả phải không ạ?" Erik đề xuất.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
1 chocolate
2 cinnamon
3 caramel
Choose your topping: x
Here is your order:
Main product:
Flavor:
Topping:
Thank for your order!
"Một đơn đặt hàng rỗng tuếch!" Cậu thốt lên.
"Phải, chính xác là nó phải thế," Simon xác nhận. "Anh
thích chương trình của em" Anh nói tiếp. "Nó hoạt động
rồi—đó là phần đầu tiên và cũng là phần quan trọng
nhất. Chương trình thân thiện với người dùng, nó đưa
hướng dẫn cho người dùng về những việc cần làm—đó
là phần thứ hai. Chương trình kiểm tra đầu vào và
không cho phép người dùng nhập sai giá trị— đó là
phần thứ ba."
"Hãy cùng nhau tóm tắt ngắn gọn những gì em đã học
ngày hôm nay xem nào" Simon nói. "Cái đầu tiên là gì?"
"Đầu tiên là, anh tiếp tục phá hoại chương trình của
em!" Erik đáp lại như vậy. Lần này cậu không tức giận
lắm, vì cậu biết rằng cùng với Simon, họ đã sửa xong
chương trình. "Rồi anh nói với em rằng em phải luôn
nghĩ tới người dùng có thể sử dụng chương trình theo
cái cách tệ hại như thế nào."
“Phải rồi, đối phó với những người dùng cứng đầu
không muốn làm theo hướng dẫn là một phần công việc
của lập trình viên” Simon mỉm cười.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
vừa nhận được một thành phần hương vị flavor mới cho
thức uống cà phê. Rồi em muốn thêm flavor đó vào thực
đơn. Ồ, cũng thêm đôi ba loại toppings mới nữa. Em sẽ
làm gì?"
“Em sẽ thêm những thứ đó vào danh sách topping,
không có gì to tát cả” Erik đáp.
"Đúng rồi, giả sử em chỉ là người quản lý chứ không phải
lập trình viên thì sao? Em không biết gì về lập trình, em
không biết Python, nhưng em muốn thêm mấy thứ
hương vị và topping đó vào thực đơn. Em, với tư cách là
một lập trình viên, cần cung cấp cho nhà quản lý biện
pháp thêm thứ gì đó vào menu một cách dễ dàng."
"Anh gợi ý cách làm đi?" Erik hỏi. Cậu ấy biết rằng
Simon đã có câu trả lời trong đầu rồi.
"Anh nghĩ chúng ta nên đặt thực đơn trong các tệp file
và đọc list danh sách từ các tệp file đó."
"Như kiểu tệp file Word phải không ạ?" Erik hỏi.
“Ừ, gần giống như vậy” Simon trả lời. "Chương trình của
em sẽ mở và đọc các tệp đó. Anh nghĩ cách dễ nhất là
mỗi menu có một tệp file. Một tệp file sẽ có tên tất cả đồ
uống, một tệp khác - là tên tất cả hương vị và tệp kia -
tất cả các loại topping. Sau đó, nhà quản lý sẽ chỉ chỉnh
sửa những tệp đó thay vì chỉnh sửa mã code Python.
Nghe có thấy thú vị không?"
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
“Vâng, thú vị thật” Erik trả lời. Cậu tự hỏi làm thế nào để
chương trình Python có thể mở các tệp giống như cách
mà Word thực hiện.
“Tuyệt vời” Simon thốt lên. "Đây là những gì chúng ta sẽ
làm vào ngày mai. Giờ thì hãy nghỉ ngơi đã."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
LƯỢT CỦA BẠN: Tạo tập tin menu của cá nhân bạn
Tạo các file text đặt các item vào menu như Erik vừa
làm. Hãy chắc chắn rằng chúng là các file text thuần
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
phải tìm chỗ lưu trữ kết quả. Đố em phương thức read()
này sẽ trả về kết quả gì khi em gọi nó ra?"
“Em nghĩ là nội dung bên trong tập tin” Erik trả lời.
"Chuẩn luôn!" Simon nói. "Lưu nó trong một biến có tên
là drinks rồi thử in nó ra xem nào."
Erik gõ lệnh như sau:
f = open(“drinks.txt”)
drinks = f.read()
print(drinks)
"Bây giờ hãy thử chạy nó đi" Simon gợi ý.
Erik kích Run và nhận được đầu ra.
coffee
chocolate
decaf
>>>
LƯỢT CỦA BẠN: Đọc file [Đặt file txt cùng địa chỉ với
file python]
Viết một chương trình ngắn giống thế và thử đọc từ
tệp 'drinks.txt'. Hãy chắc chắn rằng bạn sẽ in được
toàn bộ nội dung của tệp.
"Nó hoạt động rồi!" Erik rất vui mừng. Chương trình
Python của cậu đã mở một tệp, đọc nó và in nó ra! "Giờ
thì em đã biết cách in các menu từ Python! Hãy để em
viết tương tự cho hai tệp còn lại!"
“Ừ” Simon nói. "Nhưng đó không phải chính xác những
gì chúng ta muốn."
"Sao cơ?" Erik không hiểu.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
hơn nhưng khó hiểu hơn. Nào thì dùng cách dễ đọc và
dễ làm trước đã. Thực ra đây là một quy tắc tốt trong
lập trình: khi cần lựa chọn giữa các cách làm khác nhau,
hãy luôn chọn cách dễ đọc và dễ làm theo. Nếu ai đó
đang đọc code của em, họ sẽ cảm ơn thái độ của em.
Thậm chí là cả chính em nữa - nếu em đọc lại code của
bản thân sau chỉ khoảng ba tháng thôi."
Anh nhanh chóng vẽ sơ đồ.
f = open(“drinks.txt”)
temp = f.readlines()
drinks = []
for item in temp:
new_item = item.strip()
drinks.append(new_item)
print(drinks)
Anh ấy click Run và kết quả như sau:
[‘coffee’, ‘chocolate’, ‘decaf’]
>>>
LƯỢT CỦA BẠN: Xóa các ký tự xuống dòng
Xóa các ký tự xuống dòng ra khỏi các item trong
menu bằng phương thức strip().
[Lời người dịch: Sự khác nhau giữa Method – phương
thức và Function - hàm trong Python:
Cả Method và Function đều khá giống
nhau trong cách hoạt động.
Điểm khác nhau chính giữa Method và
Function chính là khái niệm Class và Object.
Function có thể được gọi bởi
tên trong khi method phải gọi thông qua class
hoặc đối tượng.]
"Có vẻ tốt hơn rồi nhỉ?" Anh hỏi Erik. "Bây giờ hãy tiếp
tục và làm điều tương tự cho các tệp menu khác."
Erik bắt tay vào gõ lệnh và khi cậu ấy gần như đã hoàn
thành xong với tệp flavor.txt, cậu hét lên, "Thong thả
nào! Em đang lặp lại chính mình kìa! Anh đã nói rằng
không nên lặp lại chính mình mà."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Simon mỉm cười. Anh rất vui vì cậu em nắm bắt khái
niệm này nhanh chóng. "Chúng ta phải làm gì để không
lặp lại?" Anh hỏi.
"Viết hàm ạ?" Erik hỏi
"Đúng, đúng cực kỳ! Hãy nhìn vào đoạn code này: cái gì
giống nhau và cái gì đang thay đổi? Đối số là cái nào và
hàm này sẽ trả về cái gì?"
Erik buột miệng nói suy nghĩ thành tiếng “Em mở các
tệp khác nhau, vì vậy tên file phải là một đối số, có phải
không ạ?"
"Chuẩn!" Simon xác nhận. "Em muốn trả về cái gì?"
"Em nghĩ rằng sẽ trả về danh sách với các lựa chọn trong
menu. Tất nhiên là sau khi chúng ta xóa các ký tự xuống
dòng. Nhưng em nên gọi danh sách này như thế nào ạ?"
"Em có thể gọi nó theo bất kỳ cách nào em muốn vì nó
không thể nhìn thấy từ bên ngoài. Gọi nó là kết quả -
result chẳng hạn. Sau đó, em viết return result ở cuối
hàm. Khi em gọi hàm danh sách list đã được gán cho
biến result của chương trình, giống hệt như drinks hoặc
flavors phụ thuộc vào file em đọc. Bên trong hàm, biến
sẽ luôn được gọi là result, nhưng trong chương trình
chính bên ngoài hàm, em có thể gán kết quả cho bất kỳ
biến nào."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Tiếp tục viết hàm nào!" Simon khuyến khích cậu em.
“Còn nhớ cách làm không em? Bắt đầu với def. Ta đặt
một cái tên cho hàm như là read_menu chẳng hạn;
chuyển filename làm đối số; rồi sao chép code chúng ta
vừa viết được."
"Được rồi, để em làm xem nào" Erik nói và bắt đầu viết
hàm Python cá nhân thứ hai.
Simon đã giúp cậu em một tay và đây là những gì cả hai
anh em đã viết cùng nhau.
Listing 5.4 file.py
def read_menu(filename):
f = open(filename)
temp = f.readlines()
result = []
for item in temp:
new_item = item.strip()
result.append(new_item)
return result
drinks = read_menu(“drinks.txt”)
print(drinks)
flavors = read_menu(“flavors.txt”)
print(flavors)
toppings = read_menu(“toppings.txt”)
print(toppings)
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Erik lưu tệp và kích Run. Tất nhiên, cậu nhận được ngay
kết quả như mong đợi.
[‘coffee’, ‘chocolate’, ‘decaf’]
[‘caramel’, ‘vanilla’, ‘peppermint’, ‘raspberry’, ‘plain’]
[‘chocolate’, ‘cinnamon’, ‘caramel’]
>>>
LƯỢT CỦA BẠN: Tạo hàm read_menu
Tạo hàm read_menu giống như vừa rồi Erik đã làm.
Bạn hãy chắc chắn rằng không có lỗi đánh máy phần
tên file. Bạn nhầm tên file thì điều gì sẽ xảy ra? Hãy
thử thay đổi tên file và xem Python gây ra lỗi gì cho
bạn. Đừng quên sửa tên file để chương trình của
bạn hoạt động trở lại.
"Đó là hàm thứ hai của em và nó hoạt động ngon rồi!"
Cậu tự hào nói với anh trai.
"Đúng, em đang xây dựng thư viện hàm của riêng mình
đấy, thật tuyệt vời!" Simon nói. "Bây giờ, hãy sao chép
hàm mới của em vào chương trình chính. Đừng sao chép
các dòng print() - chúng ta chỉ sử dụng chúng để thử
nghiệm mà thôi. Anh nghĩ cái tệp này ta đặt cho nó cái
tên là menu_function.py, được không em?"
“Vâng,” Erik đáp. "Mà em nên đặt hàm ở đâu trong tệp?
Nên trên đầu hay xuống cuối ạ?"
"Quy tắc trong Python là em nên xác định hàm của mình
trước khi bắt đầu sử dụng. Vì vậy mà thông thường tất
cả các hàm đều được đặt ở đầu file, trước chương trình
chính. Em đặt nó ngay sau hàm đầu tiên cũng được."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
“Xong phim,” Cậu Erik mồm nói tay làm. Đây là đoạn
chương trình vừa xong:
Listing 5.5 file.py
def menu(choices, title=”Erik’s Menu”, prompt=”Choose your item: ”):
...
# this function didn’t change
...
return result
def read_menu(filename):
f = open(filename)
temp = f.readlines()
result = []
for item in temp:
new_item = item.strip()
result.append(new_item)
return result
drinks = read_menu(“drinks.txt”)
flavors = read_menu(“flavors.txt”)
toppings = read_menu(“toppings.txt”)
drink = menu(drinks)
flavor = menu(flavors, “Erik’s flavors”, “Choose your flavor: “)
topping = menu(toppings, “Erik’s toppings”, “Choose your topping: “)
print(“Here is your order: “)
print(“Main product: “, drink)
print(“Flavor: “, flavor)
print(“Topping: “, topping)
print(“Thanks for your order!“)
LƯỢT CỦA BẠN: Hãy sao chép hàm vừa làm xong
vào chương trình chính.
Sao chép hàm read_menu() mới vào chương trình
chính và dùng thử ngay.
Cậu ấy đã thử nghiệm chương trình và nó hoạt động
chính xác như trước đây!
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
“Cái này tốt đấy,” Simon nhận xét. "Bây giờ hãy thử
thêm thứ gì đó vào tệp toppings chẳng hạn. Rồi ta xem
nó có thay đổi menu không."
Erik mở tệp toppings.txt và thêm 'vanilla powder' vào
cuối tệp, xong rồi lưu lại. Cậu chạy lại chương trình và
thực sự có dòng bổ sung ở menu cuối cùng: 4 vanilla
powder!
LƯỢT CỦA BẠN: Thêm item nữa
Thêm một item mới vào một trong các menu. Thay
đổi một trong các item. Đừng quên lưu các tệp menu
sau khi đã thay đổi chúng. Hãy kiểm tra xem
chương trình của bạn có in các menu được cập nhật
vừa xong hay không.
"Chương trình tốt rồi, em thích lắm!" Cậu thốt lên. "Bây
giờ bất kỳ ai biết chỉnh sửa file text đều có thể thay đổi
menu! Từ từ nào..." Cậu nảy ra một ý tưởng. "Này, em sẽ
đặt bất cứ thứ gì vào những thực đơn này! Kem, bánh
mì sandwich hoặc... ngon rồi! Em phải nói với bạn Alex
về cái này mới được – Bạn ấy thích những khối LEGO
nho nhỏ. Có lẽ nó có thể dùng chương trình này để trao
đổi hình ảnh với bạn bè!"
"Được đấy!" Simon nói. "Anh rất vui vì em có nhiều ý
tưởng về cách sử dụng chương trình, điều này vui lắm
đấy! Anh cũng có một số ý tưởng nhưng tốt hơn ngày
mai chúng ta mới bàn tới chủ đề này. Thêm nữa, ngày
mai chúng ta sẽ tạo menu chính."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
● Thứ trả về từ một hàm được gán cho một biến trong
chương trình chính
Bạn đã biết rằng biến bên trong hàm không hiển thị
trong chương trình chính. Để truyền giá trị của nó,
chúng ta phải trả về biến từ hàm và gán giá trị của nó
cho một biến khác trong chương trình chính.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Em còn nhớ chúng ta đã quyết định cần phải tạo menu
chính không?" Simon hỏi Erik.
"Đương nhiên nhớ chứ ạ, anh nói nếu em muốn sử dụng
chương trình này để phục vụ nhiều khách hàng, em phải
quay lại thực đơn cho từng khách hàng. Hỏi tên và hỏi
từng người muốn gọi món gì."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
“Việc đầu tiên chúng ta cần làm ở đây là nhận đơn đặt
hàng,” Simon bắt đầu giải thích. "Em thấy đấy, anh đặt
nó ở đây là 'Nhận đặt hàng' – Get order."
"Thế tất cả các thực đơn với flavor and toppings của
chúng ta ở đâu? Tại sao anh không đặt chúng ở đây?"
Erik hỏi.
“Anh quyết định sử dụng một khối có tên 'Nhận đơn đặt
hàng' chứa tất cả các menu. Cách suy nghĩ phổ biến là
cho các khối lớn trước rồi sau đó làm việc chi tiết riêng
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
biệt cho từng khối một. Tiện thể nói tới thì đây là một lý
do nữa khiến các lập trình viên sử dụng các hàm. Đầu
tiên họ nghĩ về chương trình theo các khối lớn và sau đó
mô tả từng khối trong một sơ đồ riêng. Hãy tưởng
tượng giả sử chúng ta gộp các chi tiết nhỏ vào một sơ
đồ duy nhất thì sao. Nếu thế thì thật không thể hiểu nổi
thuật toán chính!"
"Chúng ta tiếp tục nào” Simon cổ vũ. "Thế là chúng ta
nhận đơn đặt hàng và yêu cầu khách hàng xác nhận. Họ
có thể hủy rồi chúng ta quay lại menu đầu tiên: 'Chào
mừng đến với Tiệm cà phê của Erik', đại loại như thế."
"Trường hợp khách hàng xác nhận đơn đặt hàng,"
Simon nói, "thì chúng ta lưu lại và in đơn."
“Được rồi, em hiểu rằng chúng ta nên in đơn để pha chế
đồ uống,” Erik lên tiếng. "Thế tại sao chúng ta phải lưu
nhỉ? Lưu đơn đặt hàng có ý nghĩa gì?"
"Đầu tiên, em không thấy thật là tốt nếu biết được cả
ngày quán cà phê em đã phục vụ bao nhiêu người à?"
“Em biết trước rồi mà,” Erik đáp. "Hôm đó em chuẩn bị
năm ly."
" Đừng quên rằng chúng ta đang nói về một quán cà phê
thực sự. Mọi người làm việc cả ngày và phục vụ hàng
chục đến hàng trăm khách hàng. Một vài người bạn của
anh từng làm việc ở mấy quán cà phê và anh có thể đảm
bảo với em rằng họ biết rất rõ họ phục vụ bao nhiêu
khách hàng mỗi ngày."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Trả về đơn đặt hàng phải không ạ?" Erik hỏi. "Em thấy
rằng chúng ta chưa làm điều đó, nhưng em không biết
nó có nghĩa là gì ở đây."
"Hãy nhìn vào phía bên phải của sơ đồ. Đơn đặt hàng
của em giống như này, đồng ý chứ?"
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Hãy thử với REPL đi" Simon gợi ý. "Kích REPL để đến
phiên tương tác."
Erik kích vào biểu tượng REPL và chuyển sang cửa sổ
tương tác. Cửa sổ hiện ra như thế này (phiên bản của
bạn có thể khác với ví dụ bên dưới—không sao cả đâu):
"Chúng ta bắt đầu với việc tạo một từ điển trống có tên
là order. Để tạo một từ điển trong Python, chúng ta sử
dụng dấu ngoặc nhọn {} để làm cho chúng trông khác
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
với danh sách - sử dụng dấu ngoặc vuông []. Nhập order
= {} rồi ENTER. Đơn đặt hàng của em kiểu này."
Erik gõ:
In[1]: order = {}
In[2]:
"Bây giờ chúng ta có thể thêm các item vào order. Chúng
ta hãy bắt đầu với name. Nhập order['name'] ='Erik'. Sau
đó thử in đơn hàng bằng một hàm print() đơn giản."
Erik gõ:
In[2]: order[‘name’] = ‘Erik’
In[3]: print(order)
{‘name’: ‘Erik’}
In[4]:
"Ơ, anh nói từ điển sử dụng dấu ngoặc nhọn. Thế tại sao
chúng ta lại sử dụng dấu ngoặc vuông ở đây?" Erik hỏi.
"Câu hỏi hay" Simon đã quá quen thuộc với tính năng
này của Python nên anh không thể tìm ra cách đơn giản
để giải thích nó ngay lập tức. Anh bắt đầu câu trả lời thế
này "À, chúng ta sử dụng dấu ngoặc nhọn để tạo từ điển.
Nhưng chúng ta sử dụng dấu ngoặc vuông để truy cập
từ điển, tức là khi chúng ta muốn lấy một item từ đó.
Theo nghĩa này, nó tương tự như danh sách—khi em
muốn lấy một item trong list em sử dụng dấu ngoặc
vuông. Sự khác biệt là với danh sách em sử dụng các
index là số nguyên. Với từ điển, em sử dụng các key
thường là chuỗi. Nếu em có một từ điển thông thường
để nhận nghĩa hoặc dịch một từ và em sử dụng index
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
dùng nhập vào. Em nghĩ xem chúng ta nên kiểm tra điều
gì ở đây? Gợi ý: những thời điểm phải đưa ra quyết định
sẽ thường được vẽ dưới dạng hình thoi trên sơ đồ."
"Em thấy nó rồi!" Erik thốt lên. "Đó là chỗ chúng ta hỏi
người dùng xem họ muốn xác nhận hay hủy đơn đặt
hàng."
"Được rồi, chúng ta hãy bắt đầu viết đi thôi" Simon nói.
Erik gõ một hồi:
def main_menu() :
while True :
"Tiếp theo là gì ạ?" Cậu hỏi.
“Hãy xem sơ đồ” Simon trả lời.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
“Em hiểu rồi,” Erik nói. "Giống như trong rạp chiếu
phim: nhân viên thu ngân in vé và đưa cho anh. Anh cầm
vé, tới lối vào anh đưa vé cho người đứng lối vào để
kiểm tra."
"Chính xác, suy luận tốt đấy, Erik! Tiếp tục làm với nhau
nào: chúng ta vừa nhận được câu trả lời cho câu hỏi liệu
khách hàng có muốn xác nhận đơn đặt hàng hay không.
Bây giờ, như em vừa nói, chúng ta phải kiểm tra câu trả
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
lời và quyết định xem nên làm gì tiếp theo. Giống hệt
như ở rạp chiếu phim: họ kiểm tra vé nếu vé em đúng
thì mới quyết định cho phép vào hay không. Nào thêm
những dòng này đi. Nhìn sơ đồ xem nếu người dùng trả
lời 'Có', chúng ta sẽ làm gì?"
“Save order và print order,” Erik trả lời khi nhìn vào sơ
đồ của ông anh.
"Được rồi, thế lỡ người dùng muốn hủy và trả lời
'Không'?"
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Chúng ta không làm gì cả, chỉ cần quay lại Start. Nhưng
em không biết làm thế nào cả. Em chỉ có một mũi tên ở
đây."
"Có một từ đơn giản cho mũi tên này trong Python và từ
này là continue. Nó có nghĩa là 'không thực hiện phần còn
lại của vòng lặp và tiếp tục vòng lặp từ đầu'. Dễ lắm phải
không?" Thế rồi Simon gõ thêm những dòng sau vào
hàm.
def main_menu() :
while True :
order = get_order()
print(“Check your order:”)
print_order(order)
confirm = input(“Confirm? Press Y to confirm, N to cancel:”)
if confirm == “Y” or confirm == “y”:
save_order(order)
print(“Thanks for your order:”)
print_order(order)
else:
continue
“Em thấy rằng anh đã thêm hai hàm nữa: save_order() và
print_order(),” Erik nói. “Thế nhưng chúng ta không có
chúng ở đây…”
"Nào viết chúng luôn thôi!" Simon hô lên. "Bây giờ
chúng ta sẽ viết các hàm rất đơn giản. Chúng sẽ không
làm gì cả, chúng sẽ chỉ in một cái gì đó như 'saving
order…' để chúng ta thấy rằng chúng đã được gọi. Sau
này, chúng ta sẽ cải thiện hàm để làm những việc hữu
ích hơn ."
Simon đã thêm các hàm bên dưới hàm main_menu():
def get_order() :
return{}
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
def print_order(order) :
print(order)
return
def save_order(order) :
print(“Saving order …”)
return
Anh giải thích cho Erik: "Hàm get_order() là cái em đã
viết rồi. Chúng ta sẽ chuyển code của em vào đây, nhưng
bây giờ nó không làm gì cả. Không có menu, không có
hội thoại, nhưng nó phải trả về order. Hãy nhớ rằng,
order là một từ điển có các khóa như 'name', 'drink' và
các từ khác. Trong trường hợp này, hàm chỉ trả về một
từ điển trống, chính là một cặp dấu ngoặc nhọn. Chỗ này
giờ vẫn ổn phải không?"
“Vâng,” Erik trả lời. "Vậy ý anh là chúng ta sẽ sao chép
các hàm trước đây của em từ tệp trước đó sang tệp này,
có phải không ạ?"
“Chính xác,” Simon đáp. "Có những lúc, khi một chương
trình trở nên lớn, ý tưởng hay là nhóm các hàm vào các
tệp riêng biệt. Nhưng trong trường hợp của chúng ta,
việc giữ mọi thứ trong một tệp sẽ dễ dàng hơn."
"Cái hàm print_order()," Simon tiếp tục nói, "chỉ in thứ
tự mà nó nhận được thông qua đối số. Trong trường
hợp này, ta sử dụng hàm print() tiêu chuẩn của Python,
nhưng chúng ta sẽ làm cho nó đẹp hơn sau này. Em đã
làm rồi đó, có nhớ không?"
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Nhớ lắm anh!" Erik nói. "Em nghĩ chúng ta có thể làm
cho nó trông giống như một hóa đơn quán cà phê thực
thụ."
“Ý kiến hay đấy,” Simon nói. "Hàm save_order() không
làm gì khác ngoài việc in 'Đang lưu đơn hàng...' Giờ thì
ổn rồi, chúng ta sẽ viết nó sau. Lúc này, chúng ta đã sẵn
sàng gọi hàm main_menu() và kiểm tra thuật toán. Hãy
tiếp tục làm và thêm lệnh gọi cho main_menu() ở cuối
và chạy nó đi. Chương trình chính của em sẽ chỉ bao
gồm lệnh gọi hàm này thôi."
Erik gõ thêm lời gọi hàm để toàn bộ chương trình, hiện
giờ nó trông như sau:
Listing 6.1 main_menu.py
def main_menu() :
while True :
order = get_order()
print(“Check your order:”)
print_order(order)
confirm = input(“Confirm? Press Y to confirm, N to cancel:”)
if confirm == “Y” or confirm == “y”:
save_order(order)
print(“Thanks for your order:”)
print_order(order)
else:
continue
def get_order() :
return{}
def print_order(order) :
print(order)
return
def save_order(order) :
print(“Saving order …”)
return
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
main_menu()
LƯỢT CỦA BẠN: Tạo main menu
Viết hàm main menu tương tự như hàm mà Erik
vừa tạo. Vui lòng thay đổi các câu đối thoại.
Cậu bấm Run và chương trình ra kết quả:
Check your order:
{}
Confirm? Press Y to confirm, N to cancel:
Rồi cậu gõ "y" và nhận được dòng này:
Saving order …
Thanks for your order:
{}
Check your order:
{}
Confirm? Press Y to confirm, N to cancel:
"Tại sao nó bảo em 'Kiểm tra đơn đặt hàng'?" Erik hỏi.
"Bởi vì nó là một vòng lặp!" Simon nói. "Sau khi em trả
lời 'y' cho câu hỏi xác nhận, nó sẽ quay lại phần đầu của
vòng lặp. Và trong lúc chúng ta chưa thêm hộp thoại
menu, nó sẽ in đơn hàng trống. Mọi thứ hoạt động đúng
như mong đợi. Bây giờ hãy thử trả lời ' n' cho câu hỏi."
Erik gõ 'n' và nhận được kết quả.
Confirm? Press Y to confirm, N to cancel: n
Check your order:
{}
Confirm? Press Y to confirm, N to cancel:
"Em có thấy sự khác biệt không?" Simon hỏi.
"Em thấy rằng lần này nó không in 'Saving order … -
Đang lưu đơn hàng ...'. Điều đó có nghĩa là nó nằm trên
mũi tên ngắn ở bên phải sơ đồ của anh."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Xuất sắc!" Simon rất vui khi thấy Erik thực sự hiểu sơ
đồ thuật toán.
"Anh nghĩ hôm nay chúng ta đã tiến bộ tốt: main menu
của chúng ta hoạt động rồi. Ngày mai chúng ta sẽ viết
các hàm thực tế sẽ làm những gì chúng ta muốn. Giờ thì
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
“Đến lúc nghỉ ngơi rồi,” Simon nói tiếp. "Ngày mai chúng
ta sẽ làm việc với các hàm đã được sử dụng trong main
menu."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
tạo các hàm trống chỉ để kiểm tra menu chính. Bây giờ
là lúc để chúng làm điều gì đó thực tế. Hãy mở tệp
Python đã tạo các menu từ file ra đi. Nó tên là menu_files.
py."
Erik mở file ra và bây giờ cậu ấy có hai tab trong trình
chỉnh sửa: một tab là file main_menu.py và tab kia chứa
file menu_files.py.
“Chuyển sang file main_menu.py và xem chúng ta phải viết
hàm nào ở đây,” Simon nói. "Em nhìn này, ba hàm:
get_order(), print_order() và save_order(). Chúng ta hãy
bắt đầu với get_order(). Sơ đồ của chúng ta ở đâu rồi?"
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
def get_order():
order = {}
order[‘name’] = input(“What’s your name:”)
return order
Lại Run lại một lần nữa. Lần này cậu ta có:
What’s your name: Erik
Check your order:
{‘name’: ‘Erik’}
Confirm? Press Y to confirm, N to cancel:
"Hay quá, nó in tên em luôn này!"
"Xin chúc mừng!" Simon nói. "Bây giờ em đã biết cách
làm việc với từ điển rồi đó!
LƯỢT CỦA BẠN: Tạo hàm get_order()
Bắt đầu viết hàm get_order() cá nhân trong tệp
main_menu.py. Thêm thông tin đầu vào đầu tiên để có
tên của khách hàng. Kiểm tra nó bằng cách chạy
chương trình menu chính.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
i = i+1
while True:
choice=input(prompt)
allowed_answers=[]
for a in range(1, len(choices)+1) :
allowed_answers.append(str(a))
allowed_answers.append(‘X’)
allowed_answers.append(‘x’)
if choice in allowed_answers :
if choice == ‘X’ or choice == ‘x’ :
answer= ’’
break
else
answer=choices[int(choice)-1]
break
else:
print(“Enter number from 1 to”, len(choices))
answer= ’’
return answer
def read_menu(filename):
f = open(“drinks.txt”)
temp = f.readlines()
result = []
for item in temp:
new_item = item.strip()
result.append(new_item)
return result
def get_order() :
order = {}
order[“name”] = input(“What’s your name: ”)
return order
def print_order(order) :
print(order)
return
def save_order(order) :
print(“Saving order …”)
return
main_menu()
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
drinks = read_menu(“drinks.txt”)
flavors = read_menu(“flavors.txt”)
toppings = read_menu(“toppings.txt”)
drink = menu(drinks, “Erik’s drinks”, “Choose your drink: ”)
flavor = menu(flavors, “Erik’s flavors”, “Choose your flavor: ”)
topping = menu(toppings, “Erik’s toppings”, “Choose your topping: ”)
return order
Cậu ấy tự hào với chương trình và nhìn Simon.
“Gần đúng rồi” Simon nói. "Em đã sao chép đúng, nhưng
em phải thay đổi code một chút để lưu các câu trả lời
vào trong từ điển order. Nó là một sửa nhỏ, em biết cách
thực hiện rồi đấy."
“À, em hiểu rồi,” Erik nói và sửa lại hàm. Bây giờ hàm
trông như hình sau:
Listing 7.2 main_menu.py
def get_order():
order = {}
order[‘name’] = input(“What’s your name: ”)
drinks = read_menu(“drinks.txt”)
flavors = read_menu(“flavors.txt”)
toppings = read_menu(“toppings.txt”)
order[“drink”] = menu(drinks, “Erik’s drinks”, “Choose your drink: ”)
order[“flavor”] = menu(flavors, “Erik’s flavors”, “Choose your
flavor: ”)
order[“topping”] = menu(toppings, “Erik’s toppings”, “Choose your
topping: ”)
return order
Simon khuyến khích em mình: "Xong rùi, chạy chương
trình đê!"
Erik bấm nút Run chương trình.
What’s your name: Erik
Erik’s drinks
-----------
1 chocolate
2 coffee
3 decaf
Choose your item: 1
Erik’s flavors
------------
1 caramel
2 vanilla
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
3 pepermint
4 raspberry
5 plain
Choose your flavor: 2
Erik’s toppings
-------------
1 chocolate
2 cinnamon
3 caramel
Choose your topping: 3
Check your order:
{‘name’: ‘Erik’, ‘drink’: ‘coffee’, ‘flavor’: ‘vanilla’, ‘topping’: ‘caramel’}
Confirm? Press Y to confirm, N to cancel: y
Saving order …
Thanks for your order:
{‘name’: ‘Erik’, ‘drink’: ‘coffee’, ‘flavor’: ‘vanilla’, ‘topping’: ‘caramel’}
What’s your name:
"Ồ!" Cậu ấy thực sự hạnh phúc. "Em đã viết một chương
trình hơn 70 dòng và nó hoạt động rồi!"
"Đúng, em đã làm được! Và nó thực sự hoạt động!"
Simon xác nhận và mỉm cười.
LƯỢT CỦA BẠN: Thêm các lựa chọn menu vào
chương trình của bạn
Thêm hai hàm menu() và read_menu() như bạn thấy
trong chương trình trước vào tệp main_menu.py. Kiểm
tra chương trình bằng cách chạy nó và nhập các lựa
chọn vào. Hãy thử nhập sai các lựa chọn và chắc
chắn rằng hàm menu() không cho phép bạn làm
chuyện đó.
7.2 In ra!
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Nhưng vẫn còn thiếu một cái gì đó... Phần Order trông
không chuyên nghiệp lắm. Nó chưa được giống một
quán cà phê thực thụ..." Simon tiếp tục.
"Em hiểu rồi, nó phải nằm trong hàm print_order(),
đúng không ạ?" Erik gợi ý.
"Đúng, đúng rồi. Chuyển đến hàm print_order() trong tệp
main_menu.py của em. Hãy bắt đầu in đơn đặt hàng."
Hàm print_order() của Erik trông như thế này:
def print_order(order):
print(order)
return
“Ở đây chúng ta sử dụng hàm in mặc định do Python
cung cấp” Simon tiếp tục nói. "Python có thể in từ điển,
nhưng không đẹp lắm. Để gỡ lỗi thì không khó, nhưng
đối với các đơn đặt hàng và biên lai thực, chúng ta phải
làm cho nó đẹp hơn. Chắc em đã biết làm rồi, phải
không?"
"Ý anh là - em in những đường gạch ngang phải không
ạ? Đúng rồi, nó đẹp hơn."
"Được rồi, hãy làm điều gì đó tương tự như những gì em
đã làm ở cuối tệp menu_files.py. Em có thể sao chép
những dòng đó bắt đầu bằng chữ print ấy. Chỉ cần đừng
quên giữ đúng dấu đầu dòng và đảm bảo rằng em sử
dụng từ điển và không phải biến đơn giản. À, với lại
đừng quên rằng hiện tại chúng ta có tên của khách hàng
rồi. Anh nghĩ em nên sử dụng nó trong hàm của mình.
Em đã sẵn sàng chưa?"
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
“Rồi ạ,” Erik trả lời và bắt đầu làm việc với hàm. Cậu ấy
đã kết thúc với điều này:
def print_order(order):
print(“Here is your order, ”, order[“name”])
print(“Main product: ”, order[“drink”])
print(“Flavor: ”, order[“flavor”])
print(“Topping: ”, order[“topping”])
print(“Thanks for your order!”)
return
LƯỢT CỦA BẠN: Thêm hàm print_order()
Thêm hàm print_order() vào tệp main_menu.py. Vui lòng
sử dụng các trang trí như dấu gạch ngang (-), dấu
gạch dưới (_) hoặc dấu bằng (=) để làm cho đơn
hàng của bạn trông giống như cái bạn từng thấy ở
đâu đó. Hãy lấy hóa đơn từ các nhà hàng, quán cà
phê, cửa hàng kem và xem liệu bạn có thể làm cho
biên lai của mình trông giống như vậy không.
Cậu chạy lại chương trình và thu được kết quả đẹp hơn
nhiều:
Here is your order, Erik
Main product: coffee
Flavor: vanilla
Topping: caramel
Thank for your order!
Confirm? Press Y to confirm, N to cancel:
"Ừ, Tốt hơn nhiều rồi em!" Simon nói. "Đúng rồi, em có
thể thêm các trang trí như dấu gạch ngang hay đường
vạch dọc, nó tùy thuộc cả vào em. Nhưng anh có thể nói
rằng em đã làm rất tốt với tư cách là một lập trình viên.
Em đã viết một số hàm rất hữu ích, em đã sắp xếp chúng
đúng cách và em đã test thử chúng. Làm tốt lắm, Erik,
anh thực sự tự hào về em!"
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
gán một giá trị trống. Đối với từ điển là: order = {}, đối
với chuỗi là: name = "". Các hàm nên được xác định bằng
cách sử dụng từ khóa def.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
“Ừ, cũng tương tự thế” Simon trả lời. "Định dạng này rất
tốt để lưu trữ dữ liệu có cấu trúc."
"Đó là gì ạ?" Erik hỏi.
"Có lúc em chỉ muốn lưu trữ một đoạn đoạn text hoặc
một hình ảnh. Thường thì, chúng không có cấu trúc cố
định. Đoạn text chỉ là đoạn text. Hình ảnh có thể lớn và
nhỏ, có thể đen trắng hoặc có màu. Nhưng nó không có
tý cấu trúc nào—nó chỉ là một loạt các pixel. Đây được
gọi là dữ liệu phi cấu trúc. Nhưng trong trường hợp của
em, mỗi đơn hàng đều có cấu trúc. Mỗi đơn hàng có tên
của khách hàng và tất cả các thành phần của đồ uống em
sẽ chuẩn bị. Tất cả đều như thế. Nó luôn có main drink,
flavor, topping. Bởi menu như thế, khách hàng cần trả
lời tất cả những câu hỏi này trước khi em in cái order
lưu trữ. Mặt khác, khách hàng không thể thêm bất cứ
thứ gì vào đơn đặt hàng."
"Chẳng hạn thêm một topping phải không ạ?" Erik hỏi.
“Phải,” Simon trả lời. "Đơn đặt hàng là một ví dụ về dữ
liệu có cấu trúc."
Erik không nghĩ rằng mình vừa tạo ra một thứ có cái tên
nghiêm túc như vậy.
“Đơn hàng của em được lưu trữ ở dạng từ điển,” Simon
tiếp tục nói “Mà em có biết chắc chắn rằng đối với mỗi
order, sẽ có các key từ điển (em có nhớ đó là gì không?)
được gọi là 'name', 'drink', ‘flavor', 'topping' ." Simon
kéo một sơ đồ vẽ hôm trước ra.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Định dạng JSON được tạo để lưu trữ loại dữ liệu có cấu
trúc này. Cùng nhau thực hành một tý nào. Y hệt như
chúng ta từng làm, trước tiên chúng ta sẽ tạo một
chương trình đơn giản rồi thử nghiệm một số thao tác
đơn giản. Sau đó, giống bài cũ, chúng ta sẽ dùng những
gì vừa làm với chương trình đơn giản này và áp dụng
vào chương trình chính để lưu các order vào một file.
Một ngày nhiều việc đây, vì thế mà có thể tiếp tục cả
trong ngày mai."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Simon tiếp tục nói: "Bây giờ hãy mở trình soạn thảo lên
và tạo một tệp mới. Lưu nó lại với tên dict_json.py chẳng
hạn."
Erik mở cửa sổ soạn thảo, kích Click New, rồi nhấn Save,
cậu nhập dict_json.py và click lại vào Save. Cậu ấy đã
quen thuộc với quy trình làm rồi.
"Bây giờ," Simon nói, "Hãy tạo một order mẫu."
"Order mẫu là gì ạ?"
"Đơn order của em là một từ điển, phải không?" Simon
bắt đầu giải thích. "Trong chương trình chính, em tạo
một từ điển trống rồi sau đó điền vào đó các giá trị em
nhận được từ khách hàng. Ở đây chúng ta phải bỏ qua
bước đó và hãy tưởng tượng rằng từ điển order của
chúng ta đã chứa đầy các lựa chọn của khách hàng. Để
anh bắt đầu nhé"
Simon nói và viết trong trình biên tập của Erik:
"Giờ em làm tiếp đi" Anh nói với cậu. "Đừng quên đóng
dấu ngoặc nhọn."
Erik làm xong từ điển order và đóng dấu ngoặc nhọn.
Bây giờ nó trông như thế này:
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Em thấy anh đã thụt lề các dòng trong từ điển này" Cậu
hỏi anh trai. "Đó cũng là một quy tắc cho từ điển trong
Python sao?"
"Không phải" Simon đáp lại "Trong trường hợp này anh
làm vậy chỉ để nó trông đẹp đẹp tý thôi. Cũng dễ đọc
hơn chút. Anh có thể gộp tất cả các mục lại với nhau
trong một dòng hoặc bắt đầu từ đầu dòng, nhưng anh
nghĩ làm thế này trông đẹp hơn."
"Bây giờ" Anh tiếp tục nói "Chúng ta có một tập từ điển.
Và chúng ta muốn lưu nó vào một file. Anh đoán là anh
nên nhắc em về các hoạt động file từ điển."
“Phải rồi,” Erik nói, “Quá lâu rồi, em không nhớ nhiều
cho lắm.”
“Chắc chắn rồi” Simon nói. "Ngoài ra, em sẽ học được
một vài điều mới về file. Đầu tiên, chúng ta phải mở một
file. Để mở một tệp, chúng ta gọi một hàm có tên là
open()--tất nhiên rồi!--và chuyển tên file thành đối số.
Em đã biết mọi thứ về các hàm và đối số của chúng,
đúng chưa? Hàm đó trả về một file handle. Đó là một
object đặc biệt mà chương trình của chúng ta có thể
dùng ngay để làm việc với file này."
Simon viết thêm một dòng bên dưới từ điển mà Erik đã
tạo.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Đây là cái mới đầu tiên. Nhìn thấy chữ 'w' này không?
Nó có nghĩa là chúng ta sẽ ghi vào file.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Vậy bây giờ thì sao ạ?" Erik hỏi. "Chúng ta ghi vào file
JSON này bằng cách nào? Lần trước chúng ta dùng
method'; đây có phải là tên gọi của chúng không?"
“Phải, em nhớ không nhầm đâu” Simon nói. "Nhưng lần
này chúng ta sẽ làm khác đi. Đó là do chúng ta viết dữ
liệu có cấu trúc, không phải chỉ là đoạn text thuần túy.
Chúng ta sẽ sử dụng một modules trong Python có tên
là json."
"Modules là gì ạ?" Erik hỏi ngay.
"Anh sẽ giải thích luôn đây" Simon mỉm cười. "Em có
nhớ, gần đây em đã viết một số hàm Python đúng
không? Ví dụ: để đọc các item menu từ một file và trả về
một list. Hãy tưởng tượng một trong những người bạn
của em muốn viết chương trình của riêng họ cho một
quán cà phê hoặc chương trình nào đó tương tự."
“Vâng” Erik nói “Gần đây, em có nói chuyện với Emily
và cô ấy nói rằng cô ấy muốn tạo một chương trình cho
một cửa hàng kem.”
"Tuyệt quá!" Simon nói. "Bây giờ em có thể giúp cô ấy
và chia sẻ các hàm mà em đã viết. Nó sẽ giúp cô ấy tiết
kiệm thời gian để chương trình của cô ấy sẵn sàng sớm
hơn. Các lập trình viên thường chia sẻ công việc của họ
để giúp đỡ lẫn nhau. Trong Python, em có thể nhóm các
hàm của mình với các hàm mà em muốn chia sẻ trong
một tệp và đưa nó cho Emily. Cô ấy có thể sao chép tệp
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
đó vào máy tính của mình rồi kéo tệp đó vào chương
trình. Vì cô ấy đã import nhập file
vào nên cô ấy có thể sử dụng các hàm của em trong ứng
dụng của mình. Bây giờ cái file import đó có các hàm của
em là được gọi là một modules."
"Em mà không muốn chia sẻ các hàm thì sao ạ?" Erik
nói. "Em mất mấy ngày mới viết ra được!"
“Đúng là em đã viết nó," Simon nói. "Và em đã làm rất
tốt. Nhưng hãy nhớ rằng, rất nhiều người đã dành nhiều
ngày để viết các hàm khác trong Python và thậm chí là
chính cả Python nữa. Và họ đã chia sẻ công việc của
mình với các lập trình viên khác để em có thể sử dụng
Python và các hàm khác hoàn toàn miễn phí. Bằng cách
đó chúng ta giúp nhau làm việc trong các dự án của
mình. Sẽ chậm hơn nhiều nếu em và anh phải tự viết
mọi thứ từ đầu. Đó là lý do tại sao người ta sử dụng code
của người khác và cũng chia sẻ code của họ cho mọi
người. Nó thường được gọi là cộng đồng mã nguồn mở.
"
"Quay lại với JSON," Simon tiếp tục giảng giải. "Chúng ta
sẽ sử dụng modules có tên là json, do người khác viết.
Modules đó có thể đọc từ điển Python và chuyển đổi
chúng thành tệp JSON. Đi lên đầu tệp và thêm một dòng:
import json. Đây mới là dòng đầu tiên của file."
Erik đã làm thế. Đây là file đã cập nhật của cậu ấy.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Simon nói tiếp: "Bây giờ, đây là một việc nữa mà trước
đây chúng ta chưa làm với file. Chúng ta nên close tệp.
Điều này rất quan trọng, chúng ta hãy vẽ một sơ đồ khác
nào."
"Nhìn nè, đây là ba thành phần chính của máy tính: bộ
xử lý, bộ nhớ và ổ đĩa. Chương trình Python của em đang
chạy trên bộ xử lý. Tệp của em được lưu trữ trên ổ đĩa
trong một hệ thống tệp. Hệ thống tệp là những gì em
thấy trong Finder trên máy Mac và trong Explorer trên
Windows: thư mục (folder) và tệp (file). Khi em muốn
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
làm việc với một tệp trong Python, em mở tệp đó, làm
như xong ấy. Điều đó tạo ra một đối tượng tệp trong
chương trình của em. Khi em ghi vào tệp, em ghi vào bộ
nhớ máy tính. Sau đó, khi em muốn tệp của mình thực
sự được ghi vào hệ thống tệp trên ổ đĩa thì em đóng nó
lại."
"Chuyện này phức tạp quá!" Erik thấy bối rối. "Tại sao
chúng ta không ghi thẳng vào ổ đĩa?"
"Máy tính thật phức tạp, em nói đúng rồi!" Simon đồng
ý. "Lý do là bởi vì các kỹ sư máy tính cố gắng làm cho
máy tính hoạt động nhanh hơn. Động tác ghi vào ổ đĩa
sẽ khá chậm—chậm hơn nhiều so với ghi vào bộ nhớ.
Hãy tưởng tượng em đang viết chương trình của mình
trong một trình soạn thảo đoạn text. Nếu nó lưu mọi ký
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
trình và kiểm tra kết quả tệp JSON bằng trình soạn
thảo đoạn text. Hãy thử thay đổi order và chạy lại
chương trình. Tệp JSON của bạn có thay đổi không?
(Bạn có thể phải tải lại (reload) tệp trong trình soạn
thảo đoạn text.)
"Em thấy rồi chứ" Simon nói, "Đó là mẫu order của em,
được lưu trữ trong file. Hãy để anh bổ sung một số thứ
và em sẽ thấy tại sao các tệp JSON lại là chỗ lý tưởng để
lưu trữ các từ điển Python."
Simon lấy bàn phím và thay đổi lệnh gọi json.dump()
thành:
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Hãy tạo một list các order" Simon tiếp tục. "Sao
chép order hiện có trong code và gọi nó là order1
chẳng hạn. Sau đó, thay đổi nội dung của order: tên,
đồ uống và những thứ khác."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Erik làm việc với code một lúc và cuối cùng cậu
nhận order bổ sung này, ngay dưới khối order đầu
tiên.
"Tốt rồi" Simon nói, "Bây giờ hãy tạo một list trống gọi
là orders. Lưu ý rằng nó ở dạng số nhiều—'orders'. Nó
rất giống với việc tạo một từ điển trống— cái này em đã
làm rồi. Chỉ thay dấu ngoặc nhọn bằng dấu ngoặc
vuông."
Erik gõ thêm dòng nữa vào bên dưới khối order thứ hai:
“Còn bây giờ chúng ta sẽ thêm cả hai đơn đặt hàng vào
danh sách,” Simon nói. "Tin hay không tùy em, nhưng
danh sách orders mà em vừa tạo cũng là một đối tượng.
Trong Python, thực tế thì mọi thứ đều là object cả. Và
mỗi object đều có các phương thức method mà em có
thể sử dụng. Em chỉ cần biết những phương thức nào
tồn tại cho đối tượng nào. Ví dụ như, phương thức gọi
là append() sẽ dùng cho tất cả các list. Nó thêm phần tử
mà em truyền làm đối số vào cuối danh sách. Hãy xem
đây, anh sẽ sử dụng nó để thêm order và order1 vào list
danh sách orders" Rồi Simon đã thêm hai dòng sau vào
bên dưới dòng tạo list danh sách orders.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Nhưng làm thế nào để anh biết rằng anh nên sử dụng
append() ở đây?" Erik hỏi.
“Anh đã đọc nó trong tài liệu khi anh học Python,”
Simon vừa cười vừa trả lời. "Em dùng Google mà tìm
kiếm với cụm từ 'danh sách method của Python' và em
sẽ tìm thấy mọi thứ em cần biết."
"Bây giờ chúng ta thử lưu danh sách này dưới dạng
JSON," Simon tiếp tục giảng bài. "Điều duy nhất chúng
ta cần thay đổi là chúng ta muốn 'dump' cái gì vào tệp.
Chúng ta dùng order làm đối số cho hàm dump() để viết
ra một đơn đặt hàng. Bây giờ, hãy cùng nhau thay thế
nó bằng orders (số nhiều!) và xem cái gì sẽ thay đổi
nào."
Erik sửa dòng json.dump() thành:
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
của chúng ta." Simon lấy một tờ giấy khác rồi bắt đầu
vẽ.
"Đầu tiên, chúng ta kiểm tra xem file có tên 'orders.json'
có tồn tại hay không. Nếu tồn tại, chúng ta sẽ mở tệp đó
và đọc các đơn đặt hàng trước đó."
"Tại sao chúng ta cần đơn đặt hàng trước đó? Chúng ta
đã chuẩn bị chúng sẵn sàng rồi mà" Erik hỏi.
"Đúng, nhưng hãy nhớ rằng, có thể chúng ta muốn đếm
xem chúng ta đã phục vụ bao nhiêu khách hàng trong
hôm nay, hôm qua hoặc trong tháng trước. Hoặc đếm
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chúng ta rất gần lúc hoàn thành phiên bản đầu tiên của
ứng dụng rồi."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Bây giờ chúng ta hãy thực tế nào" Simon nói. "Hôm qua
chúng ta đã chơi với các order mẫu và các chương trình
đơn giản. Hôm nay đã đến lúc dùng những gì chúng ta
đã học được vào chương trình thực tế của mình."
"Vâng nào chúng ta hãy làm thôi!" Erik hào hứng nói.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Nào, chúng ta phải viết một hàm sẽ tải danh sách các
đơn đặt hàng từ tệp JSON. Nhưng ban đầu, nó phải kiểm
tra xem tệp có tồn tại hay không đã. Nếu chưa tồn tại,
chúng ta tạo một danh sách trống và trả về từ hàm này.
Nếu máy thấy tồn tại, chúng ta đọc nó, chuyển đổi JSON
thành danh sách Python và trả lại danh sách đó."
“Để anh giúp em” Simon cảm thấy Erik hơi bối rối.
"Thông thường, trong các hàm làm việc với tệp, chúng
ta truyền tên file làm đối số," rồi Simon bắt đầu hàm ở
cuối file, ngay trước dòng cuối cùng với main_menu():
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Bây giờ chúng ta phải kiểm tra xem tệp có tồn tại
không. Có một hàm đặc biệt cho việc đó và chúng ta có
thể tìm thấy nó trong modules os."
"'os' là gì ạ?" Erik hỏi.
"OS là viết tắt của 'hệ điều hành'. Hệ điều hành trong
máy tính quản lý tất cả các tệp và chương trình. Hệ điều
hành này làm việc với màn hình, bàn phím, loa và máy
quay video của em. Trên một máy tính thông thường,
HĐH có thể là Windows, macOS hoặc Linux. Trong
trường hợp của chúng ta, ta sẽ hỏi hệ điều hành xem
một tệp có tên như vậy có tồn tại trên máy tính này hay
không" Simon tiếp tục thêm một dòng:
Rồi anh đưa con trỏ trở lại hàm load_orders() và tiếp
tục giải thích. "Nếu file có rồi, chúng ta mở nó để đọc, sử
dụng hàm json.load() đọc từ tệp nhớ vào danh sách
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Bây giờ hàm tải thông tin load đã sẵn sàng!" Anh vừa
nói vừa nhìn Erik.
“Em không nghĩ mình có thể tự viết nó,” Erik nói.
"Tất nhiên, nó có vẻ phức tạp khi em làm điều đó lần
đầu tiên. Nhưng nhìn xem, em có thể đọc nó như thể nó
là tiếng Anh đơn giản, phải không?"
Erik nhìn lại hàm và cố gắng đọc nó. "Nếu tệp có tên
'filename' tồn tại, hãy mở tệp đó ra. Lưu tệp đó vào đối
tượng có tên 'f'. Sau đó tải từ tệp 'f' đó vào 'đơn hàng'.
Hmmm... rồi, em đọc được rồi ạ." Cậu cảm thấy ngạc
nhiên. Giờ đây cậu ấy có thể đọc Python và hiểu nó!
"Hàm tiếp theo khá dễ," Simon tiếp tục nói. "Anh nghĩ
em có thể tự viết nó nếu em xem tệp của mình nơi chúng
ta thực hành với các đơn đặt hàng mẫu. Hãy nhìn này,
ngay sau hai thao tác append(), có ba dòng mà chúng ta
cần ở đây. Chúng ta đã có một hàm gọi là save_order()
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Anh giải thích: "Chúng ta chuyển danh sách các đơn đặt
hàng làm đối số đầu tiên. Sau đó, chúng ta truyền tên
của tệp mà chúng ta muốn lưu trữ. Bây giờ, em có thể
thêm ba dòng đó từ chương trình ngày hôm qua đã
làm."
Erik xem tệp 'dict_json.py' và sao chép ba dòng từ đó
sang. Bây giờ hàm trông như hình sau:
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Bây giờ," Anh ấy tiếp tục nói "Mỗi khi khách hàng nhập
một đơn đặt hàng mới, nó sẽ được thêm vào danh sách
'orders'. Trước khi chúng ta thêm danh sách làm đối số,
main_menu() không biết thêm đơn đặt hàng mới vào
đâu. Bây giờ chúng ta có thể sử dụng phương thức
append() và thêm nó vào 'orders.' Ngay sau khi khách
hàng xác nhận đơn hàng, chúng ta thêm nó vào danh
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Simon dừng lại một chút và tiếp tục: "Chúng ta nên cung
cấp cho người dùng một cách bình thường để hoàn
thành chương trình."
"Giống như lệnh Thoát ở menu trong Word ạ?"
"Đúng, giống như vậy. Hãy nói với người dùng rằng nếu
họ muốn thoát, họ nên nhập 'X' và chỉ nhập 'X' khi được
hỏi về tên của họ. Xác suất để chúng ta có một khách
hàng có tên đầy đủ là 'X' là rất thấp. Thực tế gần như
bằng 0. Vì vậy, hãy làm như này: nếu trong hàm
get_order() khách hàng nhập tên 'X', thì chúng ta không
hỏi bất kỳ câu hỏi nào khác và trả về một đơn hàng
trống, như sau: order = { }. Sau đó danh sách này được
chuyển đến hàm main_menu() và nó quyết định: nếu nó
không trống, nó sẽ thêm thứ tự vào danh sách và tiếp
tục hoạt động. Chúng ta hãy vẽ một sơ đồ nào."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Tại sao anh kiểm tra cả 'X' và 'x'? Anh bảo người dùng
nhập 'X' thì họ nên nhập 'X' viết hoa, phải không ạ?" Erik
hỏi.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Sau đó, có lẽ chúng ta nên lưu các đơn đặt hàng vào kho
lưu trữ dữ liệu ngay sau khi chúng được nhập vào. Điều
đó sẽ đảm bảo rằng chúng ta giữ được tất cả các đơn đặt
hàng trước đó ngay cả khi chương trình bị lỗi và treo."
“Nhưng anh từng bảo là nó sẽ làm chương trình chậm
hơn mà,” Erik nhớ lại.
"Chỉ một chút thôi. Nhưng nó đáng giá—nếu không,
chúng ta có nguy cơ mất tất cả các đơn đặt hàng. Anh
đang nghĩ đến việc sử dụng cơ sở dữ liệu cho việc đó."
"Còn nữa," Simon tiếp tục nói "Chúng ta cần các hàm
như 'in tất cả các đơn đặt hàng' và 'đếm xem chúng ta
đã dùng bao nhiêu phần hương vani'. Phải thế nếu
chúng ta muốn biến chương trình của em thành một
ứng dụng kinh doanh thực sự."
“Tất nhiên, em muốn nó cần như thế” Erik nói. "Nhưng
trước tiên em muốn biến nó thành một ứng dụng web
và làm cho nó thật đẹp."
"Chắc chắn rồi, chúng ta có thể bắt tay vào làm trong
tuần tới."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Em nói rằng em muốn tạo một ứng dụng web hả?"
Simon hỏi Erik vào hôm sau.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Vâng, đúng rồi!" Erik nói. "Nếu không thì làm sao em
dùng được chương trình trên iPad?"
"Được rồi, chuẩn bị tinh thần sẵn sàng nhé: đó không
phải là một nhiệm vụ dễ dàng. Nó sẽ đòi hỏi sự chú tâm
ghê gớm của em đấy. Có thể em sẽ không hiểu hết mọi
thứ chúng ta làm ở đây. Nhưng đừng lo lắng, anh sẽ giúp
em một tay."
“Em biết, anh là một người anh tốt,” Erik nói và hầu như
không có chút mỉa mai nào trong câu nói.
"Chúng ta sẽ sử dụng Trình chỉnh sửa Mu người bạn tốt
cho ứng dụng web. Nó có một chế độ đặc biệt cho việc
đó. Khởi động trình chỉnh sửa và kích vào nút Mode ở
góc trên cùng bên trái."
Erik làm theo và nhìn thấy menu này:
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Sau khi Erik làm xong, Simon chỉ vào góc dưới cùng bên
phải và nói: "Em có thấy từ 'Web' bên cạnh hình bánh
răng không? Chúng ta đã chuyển sang chế độ Web. Bây
giờ hãy xem chúng ta có thể làm gì với nó. Bấm vào
New."
Erik làm theo và ngay lập tức code Python xuất hiện
trong cửa sổ soạn thảo.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
chỉ cần kích nút Run Trình duyệt Web trong trình
chỉnh sửa. Hãy thử và xem em có gì nào."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Erik mở một tab mới trong trình duyệt web và nhập địa
chỉ. Đây là những gì cậu ấy thấy:
"Từ từ đã, tất cả những thứ này đều do trình editor của
em viết sao?" Cậu hỏi Simon.
"Đúng, mà xem này, Mu gợi ý rằng phần còn lại em tự
viết," Simon nói và chỉ vào ví dụ code trên trang. "Mu
khuyên em nên sao chép code từ cửa sổ màu xám đầu
tiên vào chương trình của mình. Hãy tiếp tục và làm
điều đó."
Việc này thật dễ dàng. Erik nhanh chóng sao chép đoạn
text và dán nó bên dưới đoạn code hiện có.
"Bây giờ Mu yêu cầu em tạo một tệp mới," Simon tiếp
tục nói, "Sao chép đoạn text từ cửa sổ thứ hai và lưu nó
dưới dạng tệp mới 'greeting.html'"
Erik đã quen cách làm rồi. Cậu kích New trong Trình
chỉnh sửa Mu, xóa chương trình mà Mu vừa hiện ra rồi
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
sao chép đoạn text từ cửa sổ màu xám thứ hai. Tiếp đó,
cậu kích Save lưu dữ liệu lại.
Simon hỗ trợ cậu: "Sử dụng trình đơn thả xuống để thay
đổi từ '*.py' thành 'Other (*.*)', nếu không Mu sẽ nghĩ
rằng em đang cố lưu một chương trình Python. Chúng
ta nên nói với nó rằng lần này là một loại tệp khác. Tại
vị trí trường 'Save as', gõ greeting.html."
Bây giờ nó trông giống như hack thực sự. Erik nhập
những gì Simon gợi ý và nhấn ENTER.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
“Chà, thật thú vị,” Emily nói. "Tớ chưa bao giờ nhìn thấy
những dấu ngoặc nhọn này trong HTML."
"Phải đo" Simon nói, "Bởi vì đây không phải là HTML
thuần túy, nó là một dòng mẫu. Chúng ta dùng chương
trình có tên là Flask ở đây và nó sử dụng các mẫu
template để tạo HTML chung chung."
“Em hiểu,” Emily nói. "Với lại em biết các thẻ <h1> và
thẻ <p> này."
"Thẻ? 'Thẻ' là gì?" Erik hỏi.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
“Chúng giống như các dấu ngoặc trong danh sách của
Python,” Erik nói. Cậu ấy muốn cho Emily biết rằng cậu
đã biết Python rồi.
“Em nói đúng,” Simon xác nhận. "Các thẻ này bao gồm
một số đoạn text và giải thích ý nghĩa của nó. Một số
đoạn đoạn text là tiêu đề, một số là đoạn văn. Nhưng bây
giờ chúng ta cần tạo menu. Để làm được điều đó, trước
tiên chúng ta cần thẻ <form> và sau đó là thẻ <select> ở
bên trong. Chúng ta cùng nhau tạo một menu rất đơn
giản nào" Rồi anh ấy bắt đầu viết.
LƯỢT CỦA BẠN: Bạn hãy tạo biểu mẫu web đầu tiên
Tạo tệp form.html và lưu với đường dẫn mu_code /
templates. Sao chép code trước đó và kiểm tra nó
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
trong trình duyệt của bạn. Thử thay đổi các tùy
chọn; thử thêm nhiều tùy chọn.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Tớ không biết rằng bạn có thể tạo các biểu mẫu dễ dàng
đến thế," Emily nói.
"Đúng, khá dễ dàng để tạo ra một biểu mẫu đơn giản
như thế này, nhưng vẫn còn thiếu một số phần," Simon
nói.
“Em thấy nó ổn mà” Erik nói. "Cái gì còn thiếu ạ?"
"Uh, trông thì tốt đấy, nhưng nó không làm được gì cả,"
Simon nói. "Chúng ta phải lấy dữ liệu từ người dùng và
sau đó truyền dữ liệu đó sang chương trình. Làm thế
nào chúng ta truyền được dữ liệu?" Simon hỏi, rồi tự trả
lời câu hỏi của chính mình. "Chúng ta nên sử dụng các
biến và giá trị, rất giống với Python. Hãy để anh thêm
một số thứ vào biểu mẫu này."
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Erik tải lại tệp, chọn "Decaf" từ menu, kích vào "Send"
và nhận được như hình sau:
"Mỗi form nên có một hành động," Anh bắt đầu giải
thích. "Hành động là điều mà ứng dụng của chúng ta
sẽ thực hiện khi người dùng submit biểu mẫu form.
Khi người dùng đưa ra lựa chọn của họ—cà phê hoặc
decaf—họ truyền thông tin này đến một số hàm. Hàm
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
bạn nhập. Em có thể nhập thông tin của mình vào địa
chỉ, như /hello/Emily hoặc em có thể sử dụng biểu mẫu
form. Sau đó, trang sẽ được được tạo bằng cách sử dụng
thông tin em đã nhập. Anh chắc rằng em đã thấy loại
trang này nhiều lần—ví dụ: khi em nhập nhận xét hoặc
trò chuyện với ai đó trên web. Em kích Click 'Submit'
hoặc chỉ cần nhấn ENTER và trang được cập nhật, phải
không? Bây giờ em sẽ học cách tự tạo những trang như
vậy."
"Để anh vẽ nó trên sơ đồ," Anh nói và bắt đầu vẽ
"Tổ hợp các chữ cái và số ở đầu trình duyệt của em được
gọi là 'địa chỉ' hoặc 'URL'. Anh đã đánh dấu nó bằng màu
xanh lam. Thông thường, em sẽ thấy tên của trang web
ở đây, chẳng hạn như google.com. Trong trường hợp
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
của chúng ta, nó sử dụng các số được gọi là tên của trang
web Địa chỉ IP. Chúng ta sử dụng máy tính của riêng
mình và đối với mọi máy tính trên thế giới, địa chỉ
127.0.0.1 có nghĩa là 'máy tính này'. Nhưng đừng lo lắng
về điều đó bây giờ vội."
Simon chỉ vào vòng tròn màu đỏ đầu tiên xung quanh từ
‘order’ trong địa chỉ và nói: "Đây là điều chúng ta nên
quan tâm. Nhìn này, nó là một phần của địa chỉ. Khi mở
địa chỉ này, chúng ta sẽ thấy biểu mẫu form có menu đồ
uống. Khi em kích Submit,"thì nó theo mũi tên đi xuống
trong sơ đồ" biểu mẫu biết rằng nó sẽ tìm hàm chịu
trách nhiệm về địa chỉ /order. Em thấy đấy, nó ở đây,
trong trường form action.
Và sau đó "nó đi theo mũi tên đến khối 'Python'," biểu
mẫu tìm thấy hàm Python có thể hoạt động với nó, bởi
vì chúng ta đã sử dụng trình trang trí - decorator này,
@app.route('/order'). Em thấy đấy, ba thứ này được kết
nối với nhau; em chỉ cần sử dụng cùng một tên trong địa
chỉ, trong biểu mẫu và trong chương trình Python."
"Em thấy rằng hàm này cũng được gọi là ‘order’--có
phải là nơi thứ tư chúng ta sử dụng nó không?" Erik hỏi.
"Em thật tinh mắt!" Simon nói và mỉm cười. "Không
phải đâu, trong trường hợp này, hàm có thể có một tên
khác. Anh có thể gọi nó là 'new_order' hoặc 'get_order'.
Nhưng bây giờ chúng ta phải viết hàm thực sự. Anh sẽ
giúp em ở đây. Nó sẽ trông hơi đáng sợ, nhưng đừng lo.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
dụng nó, chúng ta phải import kéo nó vào." Bây giờ dòng
đầu tiên trông như thế này:
"Em có thể chạy nó ngay bây giờ không?" Erik hỏi anh.
Trông anh hơi mệt sau một lần giải thích dài thượt.
Emily đang đứng bên kia anh, đang lắng nghe những lời
giải thích của Simon như thể anh là một phù thủy. Cô ấy
thích tất cả phép thuật lập trình này và nóng lòng muốn
thử chương trình.
"Tớ chạy nó được không?" Emily hỏi.
“Tất nhiên là được” Erik nói. "Chỉ cần kích Save và sau
đó Run."
"Bây giờ bấm Duyệt," Simon nói.
Emily làm theo và trang tiếp theo được mở trong tab
trình duyệt mới.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Bây giờ chúng ta phải thêm /order vào địa chỉ, nhớ
chứ?" Simon giúp cô.
Emily làm theo và dòng địa chỉ trong trình duyệt
trở thành: http://127.0.0.1:5000/order.
Trang hiện ra menu thực đơn mà họ vừa cùng nhau tạo
ra.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
LƯỢT CỦA BẠN: Chỉnh sửa biểu mẫu web của bạn
để in lựa chọn đồ uống trên trang
Sao chép mẫu ở trên vào tệp print.html của bạn. Vui
lòng thay đổi tiêu đề và đoạn text. Thay đổi
first_app.py bằng cách thêm dòng có return và lưu
nó. Thử chạy chương trình của bạn xem.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Nhưng làm cách nào để quay lại trang đặt hàng?" Erik
hỏi.
"Em nhìn này, địa chỉ trong trình duyệt vẫn trỏ đến
/order. Điều đó có nghĩa là nếu em kích dòng địa chỉ
bằng chuột và nhấn ENTER, em sẽ tải lại trang đặt hàng.
Chỉ cần không kích Click nút tải lại reload nếu không nó
sẽ tạo một đơn đặt hàng khác."
Emily làm theo lời Simon và xem lại trang đặt hàng.
“Nhưng có một cách tốt hơn,” Simon nói. "Em đang tìm
kiếm một nút trên trang in, chẳng hạn như Quay lại
trang đặt hàng, phải không?"
"Vâng, làm vậy sẽ dễ dàng hơn," Emily đồng ý.
"Chúng ta có thể sử dụng một form khác để làm vậy,"
Simon nói. "Nó đơn giản lắm" Rồi anh thêm vài dòng vào
tệp templates/print.html.
"Hãy nhìn xem, chúng ta đã tạo một biểu mẫu khác chỉ
có nút Submit. Chúng ta vừa đổi tên nó thành 'New
Order'. Em nhìn đi, nó trỏ đến /order trong trường hành
động của mình. Điều đó có nghĩa là khi chúng ta kích
Click nút 'New Order’ Đơn hàng mới, nó sẽ gửi chúng ta
đến trang /order. Rồi nó sẽ hiển thị lại menu đồ uống.
Hãy làm thử đi!"
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
"Anh rất sẵn lòng giúp," Simon nói. "Xin vui lòng cho anh
biết em bắt đầu lúc nào."
Tạo một ứng dụng quán cà phê trông không hấp dẫn
lắm đối với bạn phải không? Hãy tạo một cái gì đó khác!
Tất cả các ý tưởng và phương pháp lập trình mà chúng
ta thảo luận trong cuốn sách này đều có thể áp dụng cho
rất nhiều dự án khác. Chỉ cần nhìn xung quanh và bạn
sẽ có ý tưởng cho các ứng dụng khác.
Ví dụ:
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chúng ta cung cấp cho khách hàng một danh sách các
lựa chọn cho mỗi câu hỏi và khách hàng sẽ chọn từ
menu.
Chúng ta có nên hỏi khách hàng gì nữa ở tiệm bánh
pizza không?
● Bạn muốn loại vỏ bánh nào? Mỏng hay dày?
● Cỡ nào? Nhỏ, vừa hoặc lớn?
● Bạn muốn nước sốt nào? Đỏ hay trắng?
● Bạn muốn loại bánh pizza nào? Margherita,
pepperoni, veggie,… Hãy đến tiệm bánh pizza yêu thích
của bạn và xem họ có món gì.
● Bạn muốn thêm topping nào?
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Bạn có thể thêm các điều kiện đặc biệt vào ứng dụng của
mình. Ví dụ: nếu người bạn đã chọn mũ cảnh sát thì họ
không thể chọn gậy bóng chày làm phụ kiện. Hãy nghĩ
đến việc thêm điều kiện này vào menu của bạn.
Điều gì sẽ xảy ra nếu việc chọn các bộ phận một cách
ngẫu nhiên? Điều đó có thể tạo ra một số nhân vật mô
hình tý xíu vui nhộn. Bạn sẽ thêm tùy chọn ngẫu nhiên
vào menu của mình như thế nào? Làm thế nào để bạn
thực hiện nó?
Gợi ý: trong Python có một modules gọi là random ngẫu
nhiên. Bạn nhập nó bằng câu lệnh nhập ở đầu tập lệnh
của mình và sử dụng hàm choice(). Hàm đó hoạt động
như sau: bạn đưa cho nó một danh sách các lựa chọn và
nó chọn ngẫu nhiên một trong số chúng. Lần tới khi bạn
gọi nó, hàm sẽ chọn ngẫu nhiên một thứ khác (hoặc, có
thể, cùng một item—do nó là ngẫu nhiên mà!). Ví dụ:
tạo tập lệnh ngắn này và chạy thử nó. Trong tập lệnh
này, chúng tôi yêu cầu Python 5 lần chọn ngẫu nhiên
một item từ danh sách ba loại tóc.
Chạy tập lệnh này và bạn sẽ thấy một cái gì đó như thế
này:
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Tất nhiên, trong trường hợp của bạn, danh sách sẽ khác
và sẽ có 5 lựa chọn ngẫu nhiên khác theo thứ tự khác.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
B.1 Mu Editor
1. Trong trình duyệt web của bạn, hãy mở trang
web của Mu Editor: https://codewith.mu/.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
B.2 Thonny
Thonny là một trình soạn thảo Python tuyệt vời khác
được tạo ra dành cho người mới bắt đầu. Bạn có thể tìm
thấy nó ở đây:
https://thonny.org/
Ngay trên trang đầu tiên, bạn sẽ tìm thấy các trình cài
đặt cho Windows, macOS và Linux. Đối với Windows,
hãy tải xuống tệp .exe và chạy nó. Đối với macOS, hãy tải
xuống tệp .pkg và cài đặt nó. Đối với Linux, hãy chạy tập
lệnh được cung cấp trong hướng dẫn.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
Sau khi bạn cài đặt ứng dụng, hãy khởi động và hiển thị
các cài đặt của nó. Bạn có thể chọn màu nền từ khoảng
một tá lựa chọn, chọn phông chữ của trình soạn thảo và
thiết bị đầu cuối terminal, cùng nhiều thứ khác nữa.
Thonny có một tính năng rất hữu ích được gọi là Trợ lý.
Trong menu Option, bạn có thể định cấu hình để nó khởi
động mỗi khi có cảnh báo trong code của bạn. Thêm
nữa, nó ý kiến khi chương trình của bạn hiển thị lỗi.
Chức năng trợ lý cung cấp cho bạn một số gợi ý về lỗi có
thể xảy ra với code của bạn. Hãy thử mắc một lỗi nhỏ
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình
Hãy nói về Python – Pavel Anni – ©Manning Publications Co.
trong code đi (ví dụ: lỗi đánh máy trong tên biến), sau
đó chạy chương trình và bạn sẽ thấy chức năng Trợ lý
hoạt động.
B.3 Python
Cả hai trình soạn thảo được mô tả ở trên đều bao gồm
Python trong các gói cài đặt của chúng. Nhưng vì một số
lý do, bạn có thể muốn cài đặt riêng Python.
Nếu bạn đang dùng macOS hoặc Linux, thì hệ điều hành
của bạn đã được cài đặt Python. Nhiều khả năng đó
không phải là phiên bản Python mới nhất, nhưng đó
không phải là vấn đề: tất cả các chương trình chúng tôi
phát triển trong cuốn sách này sẽ hoạt động với các
phiên bản Python bắt đầu từ 3.5. Không cần cài đặt bất
cứ thứ gì trên các hệ điều hành này—ít nhất là không
cho cuốn sách này.
Nếu bạn đang dùng Windows, bạn sẽ phải truy cập
trang web chính thức của Python:
https://www.python.org/downloads/windows/ và tải
xuống trình cài đặt từ đó.
Vui lòng đọc kỹ các ghi chú (xem ảnh chụp màn hình bên
dưới) và chọn đúng phiên bản Python cho hệ điều hành
Windows của bạn.
Chuyển ngữ: Nguyễn Tiến Thành – T.N.Trung | Trường THPT Khương Đình