Việc đặt tên được gọi là định danh (Identifier)
Identifier bắt đầu bằng các ký tự A-Z, a-2 hoặc _, tiếp đó là các ký tự chữ, ký tự số 0-
9.
Identifier có phân biệt chữ hoa chữ thường.
Ví dụ: X, x, Spam, spam, spAm, total_of_eggs, Total_Of_Eggs.
Không sử dụng các kí tự dấu câu như @, #, $, %...
Không sử dụng các kí tự dấu câu như @, #, $, %...
Tên class bắt đầu bằng chữ hoa. Tất cả các identifier bắt đầu bằng chữ thường.
Tên function viết thường, các từ nối với nhau bằng dấu _
Không sử dụng các từ khóa (keyword) trong python khi đặt tên bất cứ identifier nào
Số không thể bắt đầu bằng tên biến.
Cùng một lúc ta có thể đặt nhiều biến và gán nhiều giá trị.
Cú pháp: biến_1, biến_2, biến_3,... = <giá_trị_1>, <giá_trị_2>, <giá_trị_3>,...
Ví dụ:
Ví dụ: Hệ cơ số 10 (9,-25), hệ cơ số 8 (0o80, -0o490), hệ cơ số 16 (0x50, -0XCAFE26). Trong đó: Tiền tố và kí tự trong hệ thập lục phân không phân biệt chữ hoa và chữ thường.
Ví dụ: 51924361L, -0x19323L, -0o52318172735L
Thêm hậu tố L để biểu diễn số nguyên kiểu long
Ví dụ: 1.2, -12.9, 21.3+e18, -32.54e100
Ví dụ: 3 + 4j, 3.14j, 3e + 26j, 9.322e-36j
Complex number là một cặp có thứ tự là các số thực (real floating-point) ký hiệu x+yj,
với x là real và y imag.
Ví dụ:
tên_chuỗi = <giá_trị>
Với index (chỉ mục) bắt đầu từ 0. Chiều dài chuỗi thì -1 (do bắt đầu từ 0)
Ví dụ:
<9>
<11>
< : left-align text in the field
^ : center text in the field
> : right-align text in the field
s – strings
d – decimal integers (base-10)
f – floating point display
c – character
b – binary
o – octal
x – hexadecimal with lowercase letters after 9
X – hexadecimal with uppercase letters after 9
e – exponent notation
Tham khảo string.format(): https://www.geeksforgeeks.org/python-format-function/
Module (mô-đun) là một file chứa những câu lệnh Python và các định nghĩa. Hay đơn giản hơn module là một file python bình thường, thậm chí đó là file python trống nó vẫn là một module. Một file chứa code Python, ví dụ <meo_module.py> được gọi là module và tên của module sẽ là <meo_module> .
Module của Python có thể không nhất thiết phải là file Python mà có thể là những file được viết bởi những ngôn ngữ lập trình khác như C, C++,… Ví dụ như (Java – Jython). Những module như vậy được gọi là extension module, và thường được sử dụng cho việc lưu các external library. Module được sử dụng khi muốn chia chương trình lớn thành những file nhỏ hơn để, tái sử dụng code, dễ quản lý và tổ chức.
Lưu ý khi đặt tên module, ngoài việc phải tuân thủ các quy tắc đặt tên file. Ta còn phải chú ý, khi goi
Ví dụ:
Có thể nhập các định nghĩa từ module này vào module khác (file này vào trong file khác) hoặc vào trình thông dịch trong Python. Chúng ta sử dụng từ khóa import
để thực hiện việc này. Đây là câu lệnh cơ bản nhất khi làm việc với các module Python.
Ví dụ:
Đầu tiên ta có một module (file python) như thế này.
Và một module (file python) <meo_module_2.py>. Chạy module này.
Import giúp chúng ta gọi một module khác. Ví dụ trên là gọi một module chung một thư mục. Để gọi cụ thể một function (hàm) trong module đó ta dùng toán tử “.”. Với cú pháp:
<Tên_module>.<Tên_function>(Parameter_list)
Ta có thể import nhiều module một lúc trên một dòng lệnh
<18>
Tuy nhiên, điều này không được khuyến khích vì không rõ ràng ta có thể import trên nhiều dòng lệnh.
<19>
Chúng ta đã đổi tên module <meo_module> là <meo>, điều này có thể giúp tiết kiệm thời gian trong một số trường hợp. Chú ý, việc đổi tên này chỉ áp dụng trong phạm vi lệnh, chứ không thực sự đổi tên module trong Lib. Khi đã đổi tên, phải gõ đúng tên module, <meo_module> lúc này không được công nhận trong phạm vi lệnh nữa, mà bạn phải dùng meo mới đúng.
<20>
Có thể nhập một function cụ thể từ module mà không cần nhập toàn bộ module. Khi dung theo cách này, chúng ta không cần dung toán tử “.”.Ví dụ:
<21>
Nhập nhiều function từ một module. Chúng ta dung “,”. Ví dụ:
Ở hai trường hợp trên, ta chỉ import một hoặc hai thứ trong module math thôi. Thế nếu ta muốn import hết tất cả thì sao?
Giả sử module a có một tỷ function thì việc sử dụng dấu phẩy (,) gần như là bất khả thi. Vậy thì ta sử dụng import *.
Chúng ta nhập tất cả các định nghĩa từ module math nên tất cả tên đều có thể nhìn thấy trong phạm vi này, ngoại trừ những tên bắt đầu bằng dấu gạch dưới _. Nhập mọi thứ với dấu hoa thị * không phải là một thói quen lập trình tốt. Vì nó có thể dẫn đến những định nghĩa bị trùng lặp cho cùng một định danh và khiến cho việc đọc code trở nên khó khăn hơn. Đó là lý do visual trả về khuyến cáo không hợp chuẩn dù kết quả là đúng. Lưu ý: Ở Python 2.X, câu lệnh from module import * có thể sử dụng ở trong một function, tuy nhiên điều này không được xảy ra ở Python 3.X.
Về kết quả lệnh import <module> và from <module> import * giống nhau ở một điểm là import tất cả mọi thứ trong module. Nhưng khác nhau về cách thực hiện.
Khi dùng import <module>. Về bản chất, là ta cho chạy module đó trong file yêu cầu import và tạo một module object lưu dưới một biến với tên là biến đó. Module object này có các attribute và method lần lượt là các biến và hàm. Vì lý do đó nên khi gọi một function bằng cách này ta phải dùng cú pháp: <Tên_module>.<Tên_function>(Parameter_list)
Khi dùng from math import * giúp chúng ta không cần phải sử dụng thông qua module object. Vì lý do đó nên khi gọi một function bằng cách này ta có thể gọi trực tiếp function đó. Mà không cần dùng cú pháp: <Tên_module>.
Một trường hợp hi hữu là ta có thể đặt tên module trùng với module của python. Khi đó python sẽ ưu tiên module của chúng ta. Nhưng vấn đề xảy ra khi ta muốn gọi chính xác module (của python) đó mà nó lại gọi module của chúng ta. Danh sách module python. Ví dụ:
Khi ta import module của python.
Khi ta import một module do ta tạo có tên và function trùng với module của python bên trên.
Để hiểu được trường hợp này ta phải hiểu rõ về đường dẫn tìm kiếm module Python.
Khi nhập module, Python sẽ tìm một vài nơi theo thứ tự:
Thư mục hiện tại.
PYTHONPATH (một biến môi trường với danh sách thư mục).
Thư mục mặc định có vị trí phụ thuộc vào chọn lựa trong quá trình cài đặt.
Ở đây module base64 được tạo ra và để trùng thư mục với file gọi module nên được ưu tiên. Còn module base64 của python thì nằm ở PYTHONPATH. Nên không được gọi.
Trong Python, file có 2 loại:
Text File
Binary File
Ở đây ta dùng hàm open để mở file. Chúng ta chú ý đến 2 tham số chính: file và mode.
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
Đầu tiên muốn thao tác file ta phải mở file. Dĩ nhiên, muốn mở thì ta phải có file đó sẵn. Có hai cách mở file
Khi làm việc với các tệp ở chế độ văn bản, nên chỉ định loại mã hóa. Ví dụ:
Khi không dùng:
MODE |
MÔ TẢ |
‘r’ |
Chế độ chỉ được phép đọc. |
‘r+’ |
Chế độ được phép đọc và ghi |
‘rb’ |
Mở file chế độ đọc cho định dạng nhị phân. Con trỏ tại phần bắt đầu của file |
‘rb+’ |
Mở file để đọc và ghi trong định dạng nhị phân. Con trỏ tại phần bắt đầu của file |
‘w’ |
Mở file để ghi. Nếu file không tồn tại thì sẽ tạo mới file và ghi nội dung, nếu file đã tồn tại thì sẽ bị cắt bớt (truncate) và ghi đè lên nội dung cũ |
‘w+’ |
Mở file để đọc và ghi. Nếu file không tồn tại thì sẽ tạo mới file và ghi nội dung, nếu file đã tồn tại thì sẽ bị cắt bớt (truncate) và ghi đè lên nội dung cũ |
‘wb’ |
Mở file để ghi cho dạng nhị phân. Nếu file không tồn tại thì sẽ tạo mới file và ghi nội dung, nếu file đã tồn tại thì sẽ bị cắt bớt (truncate) và ghi đè lên nội dung cũ |
‘wb+’ |
Mở file để đọc và ghi cho dạng nhị phân. Nếu file không tồn tại thì sẽ tạo mới file và ghi nội dung, nếu file đã tồn tại thì sẽ bị cắt bớt (truncate) và ghi đè lên nội dung cũ |
‘a’ |
Mở file chế độ ghi tiếp. Nếu file đã tồn tại rồi thì nó sẽ ghi tiếp nội dung vào cuối file, nếu file không tồn tại thì tạo một file mới và ghi nội dung vào đó. |
‘a+’ |
Mở file chế độ đọc và ghi tiếp. Nếu file đã tồn tại rồi thì nó sẽ ghi tiếp nội dung vào cuối file, nếu file không tồn tại thì tạo một file mới và ghi nội dung vào đó. |
‘ab’, |
Mở file chế độ ghi tiếp ở dạng nhị phân. Nếu file đã tồn tại rồi thì nó sẽ ghi tiếp nội dung vào cuối file, nếu file không tồn tại thì tạo một file mới và ghi nội dung vào đó. |
‘ab+’ |
Mở file chế độ đọc và ghi tiếp ở dạng nhị phân. Nếu file đã tồn tại rồi thì nó sẽ ghi tiếp nội dung vào cuối file, nếu file không tồn tại thì tạo một file mới và ghi nội dung vào đó. |
‘x’ |
Mở file chế độ ghi. Tạo file độc quyền mới (exclusive creation) và ghi nội dung, nếu file đã tồn tại thì chương trình sẽ báo lỗi |
‘x+’ |
Mở file chế độ đọc và ghi. Tạo file độc quyền mới (exclusive creation) và ghi nội dung, nếu file đã tồn tại thì chương trình sẽ báo lỗi |
‘xb’ |
Mở file chế độ ghi dạng nhị phân. Tạo file độc quyền mới và ghi nội dung, nếu file đã tồn tại thì chương trình sẽ báo lỗi |
‘xb+’ |
Mở file chế độ đọc và ghi dạng nhị phân. Tạo file độc quyền mới và ghi nội dung, nếu file đã tồn tại thì chương trình sẽ báo lỗi |
‘b’ |
Mở file ở chế độ nhị phân |
‘t’ |
Mở file ở chế độ văn bản (mặc định |
Sau khi thực hiện xong các thao tác với file thì bạn cần đóng nó lại.
Đóng file để đảm bảo quy chế đóng mở và giải phóng bộ nhớ cho chương trình nên điều này là cần thiết. Khi một file được mở, hệ điều hành sẽ khóa file đó lại, không cho các chương trình khác có thể xử lí trên file đó nữa nhằm đảm bảo tính nhất quán của dữ liệu.
Việc đóng file được xây dựng trong Python bằng hàm close().
Dẫu vậy, nếu chương trình kết thúc. Tất cả các file đang mở cũng sẽ được đóng lại. Tuy nhiên, sử dụng phương thức close() để đóng một file vẫn tốt hơn.
Tương tự ghi file, để đọc một file ta cần mở file bằng cú pháp để đọc.
Dùng phương thức read
Sử dụng phương thức read(size) để lấy về dữ liệu có kích thước bằng size. Nếu để trống tham số trống hoặc số âm thì nó sẽ đọc hết file đồng thời đưa con trỏ file tới cuối file hoặc nếu file quá lớn thì nó sẽ đọc đến khi giới hạn của bộ nhớ cho phép.
Cú pháp: <File>.read(size)
Với size = -1
Dùng readline(). Phương thức này cho phép đọc từng dòng trong file:
<File>.readline()
<File>.write(text)
Dùng mode ‘a’ để tránh mất nội dung ban đầu. Nếu muốn ghi đè thì dùng mode w hoặc tham khảo bảng mode bên trên.
PHƯƠNG THỨC |
MÔ TẢ |
close() |
Đóng một file đang mở. Nó không thực thi được nếu tập tin đã bị đóng. |
fileno() |
Trả về một số nguyên mô tả file (file descriptor). |
flush() |
Xóa sạch bộ nhớ đệm của luồng file. |
isatty() |
Trả về TRUE nếu file được kết nối với một thiết bị đầu cuối. |
read(n) |
Đọc n kí tự trong file. |
readable() |
Trả về TRUE nếu file có thể đọc được. |
readline(n=-1) |
Đọc và trả về một dòng từ file. Đọc nhiều nhất n byte/ký tự nếu được chỉ định. |
readlines(n=-1) |
Đọc và trả về một danh sách các dòng từ file. Đọc nhiều nhất n byte/ký tự nếu được chỉ định. |
seek(offset,from=SEEK_SET) |
Thay đổi vị trí hiện tại bên trong file. |
seekable() |
Trả về TRUE nếu luồng hỗ trợ truy cập ngẫu nhiên. |
tell() |
Trả về vị trí hiện tại bên trong file. |
truncate(size=None) |
Cắt gọn kích cỡ file thành kích cỡ tham số size. |
writable() |
Trả về TRUE nếu file có thể ghi được. |
write(s) |
Ghi s kí tự vào trong file và trả về. |
writelines(lines) |
Ghi một danh sách các dòng và file. |
Con trỏ file rất quan trọng, nó dẫn đường cho việc đọc file, viết file.
<File>.seek(offset)
Công dụng: Phương thức này giúp ta di chuyển con trỏ từ vị trí đầu file qua offset kí tự. Parameter offset phải là một số tự nhiên. Nhờ phương thức này, ta có thể ghi nội dung từ bất cứ đâu trong file. Và từ đó ta có thể đọc lại file sau khi ta đưa con trỏ file xuống cuối file.